【作者按】本文主要針對初學者在使用對話方塊賦值時的一些問題而寫。如果你對對話方塊的使用已經很熟練,請跳過本文。
cmydialog dlg;
dlg.m_btn.setwindowtext("mybutton");
其中m_btn的定義為cbutton m_btn;
這段程式執行後會報錯,debug一下,錯誤會指向乙個斷言語句assert(::iswindow(m_hwnd));報告視窗指標為空。看一下m_hwnd,等於0x00000000.其實就是m_btn這個cbutton物件的控制代碼為空。
【原因分析】出現這種錯誤的原因,顯然是m_btn這個視窗物件還沒有建立造成的。我們看一下cmydialog dlg這個建構函式,看一看msdn對cdialog建構函式的說明。其實它只是簡單的建立了乙個對話方塊例項。這裡我這樣理解,就是對話方塊是乙個容器,而對話方塊上的各個控制項是容器中包含的物件。對話方塊的建構函式只是構造了乙個容器,而並沒有建立容器中的各個物件。我想這裡大家就應該明白為什麼m_btn的控制代碼為空了。
那對話方塊中的控制項在什麼時候被建立的呢?我個人沒有仔細的研究過,但從個人使用的經驗看,應該在domodal函式和對話方塊的create函式中建立的。因為使用乙個模式對話方塊時,m_btn.setwindowtext("mybutton")語句在oninitdialog函式中執行沒有問題。所以應該在domodal中建立的。至於domodal中是如何建立的,歡迎各位高手給與講解。而對於非模式對話方塊,以下的程式執行沒有問題:
cmydialog dlg;
dlg.create(idd_mydialog,this);
dlg.m_btn.setwindowtext("mybutton");
可見控制項的建立應該在create函式中。
[解決辦法]那麼,如果非要實現這樣的功能怎麼辦呢?筆者的解決辦法是在對話方塊類中增加成員變數,比如m_sbtntitle。資料的傳遞有以下三種方法:
1。增加set函式,比如setbtntitle(cstring str);
cmydialog::setbtntitle(cstring str)
呼叫程式如下:
cmydialog dlg;
dlg.setbtntitle("mybutton");
2。將m_sbtntitle定義成公有型別。
那麼dlg.m_sbtntitle = "mybutton";就可以了。
3。修改或者過載乙個新的建構函式,比如:
cmydialog::cmydialog(cstring str)
最後,在對話方塊類的初始化函式增加m_btn.setwindowtext(m_sbtntitle);即可。
還有一些網友提供的方法是定義全域性變數。當然,首先肯定全域性變數是可以完成此功能的。不過筆者並不贊同用全域性變數的方法。對於物件導向的程式設計和設計來說,全域性變數應該盡量少使用,因為全域性變數將增加模組之間的耦合度,與物件導向的思想是有違背的。正如goto語句,好用但盡量少用。在這裡筆者並不是反對用全域性變數,而是要看情況而用。筆者曾經開發過乙個日本專案,粗略計算一下,全域性變數不下於1000個,這樣的程式的維護難度可想而知。
希望此文能夠幫助初學者在vc之路上少走一些歪路,盡快融入vc開發大軍。
對話方塊控制項屬性的修改
cmydialog setbtntitle cstring str 呼叫程式如下 cmydialog dlg dlg.setbtntitle mybutton 2。將m sbtntitle定義成公有型別。那麼dlg.m sbtntitle mybutton 就可以了。3。修改或者過載乙個新的建構函式...
VC中對話方塊的「所有」控制項?
初學vc,接觸最多的自然是dialog based了。我知道每個對話方塊模版都是乙個控制項容器,既然是容器,就應該有經典的for each操作吧。比如,我如果想讓對話方塊中所有控制項都失效,那麼這個 所有 怎麼表示呢?怎麼程式設計實現呢?查cdialog類的msdn,貌似沒有這樣的成員函式可以得到乙...
子對話方塊修改主對話方塊的屬性和控制項
假設主對話方塊叫maindlg,子對話方塊叫accountsdlg,按下列步驟來 第一步 在主對話方塊程式建立子對話方塊函式中 caccountsdlg dlg this 一定要加this,否則樓上幾位說的都不可能實現你要求的,this是將maindlg指標傳遞給accountsdlg 第二步 在子...