1. 程式人生 > >MFC子對話方塊初始化問題_從一個“斷言”報警說起

MFC子對話方塊初始化問題_從一個“斷言”報警說起

1.問題描述

在進行MFC開發時,希望將介面變得美觀。因而調整了一下對話方塊上的字型與顏色。如果僅有一個對話方塊,那麼直接把這些初始化的程式碼放到OnInitDialog()函式中就好。然而,我們會發現,利用MFC自動搭建的子對話方塊類包含的函式非常稀少!下面記錄一下,我的思路例程: 字型程式碼如下:
font.CreatePointFont(150,"宋體");//選擇字型
GetDlgItem(IDC_M1_STATIC_ORIG)->SetFont(&font);
GetDlgItem(IDC_M1_STATIC_FFT)->SetFont(&font);
GetDlgItem(IDC_M1_START)->SetFont(&font);
GetDlgItem(IDC_M1_END)->SetFont(&font);
GetDlgItem(IDC_M1_CANCEL)->SetFont(&font);
GetDlgItem(IDC_M1_X2)->SetFont(&font);
GetDlgItem(IDC_M1_2)->SetFont(&font);
GetDlgItem(IDC_M1_1)->SetFont(&font);

1.1 放在子對話方塊建構函式中

結果:直接報錯!
這個原因很好想,子對話方塊還在生成的過程中,你突然橫插一腳,要晚上子對話方塊面板上的功能,這肯定是不現實的!!! 那好,換個地方!!!

1.2 過載WM_PAINT訊息 

這其實也是我的一個小想法,既然不能放在對話方塊的初始化過程,那好吧~辛苦點,一點點畫出來。 結果,又報錯!
這個錯比上一個輕點,至少生成了子對話方塊(!廢話!)。這個錯在於每次移動子對話方塊的時候,會報斷言錯誤~~哪裡的問題?仔細想想,我們每次移動對話方塊都會觸發WM_PAINT訊息,就會觸發OnPaint()函式。這就簡單了。。。肯定是我們的這幾條語句放在OnPaint()函式中不合適,具體就是控制元件多次動態(WM_PAINT訊息)激發是不被允許的。

2.我的解決方案

靜一靜~ Q:我想做什麼??? A:初始化對話方塊啊!!! Q:如果僅有一個對話方塊,我會把這段程式碼放在哪個位置??? A:對話方塊初始化函式中(OnInitDialog0)啊!!! 問題簡單了,現在的問題就是子對話方塊類中沒有初始化對話方塊函式,我們是否能重寫一個?對,這個思路是沒問題的~ OnInitDialog()函式重寫:

3.經驗總結

這個Bug我除錯了將近半天,最大的感受就是要冷靜思考。再父對話方塊中能做的事,在子對話方塊中是否可以採用相同的方法?到底是涉及到WM訊息的過載?還是相關函式的重寫(Override)? MFC的設計理念就是傻白甜,所以冷靜的想一想,很多細節是完全可以掌握的!