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的設計理念就是傻白甜,所以冷靜的想一想,很多細節是完全可以掌握的!總結
以上是生活随笔為你收集整理的MFC子对话框初始化问题_从一个“断言”报警说起的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FreeEIM 与飞鸽传书的区别
- 下一篇: 友情链接交换技巧?