程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> VC++ >> 新手看過來:VC對話框控件屬性的修改

新手看過來:VC對話框控件屬性的修改

編輯:VC++

 【作者按】本文主要針對初學者在使用對話框賦值時的一些問題而寫。如果你對對話框的使用已經很熟練,請跳過本文。

  【針對現象】許多初學者,常常寫出這樣的程序來修改對話框中某個按鈕的標題:


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)
{
    m_sBtnTitle = str;
}

調用程序如下:


CMyDialog dlg;
dlg.SetBtnTitle("MyButton");

  2。將m_sBtnTitle定義成公有類型。

  那麼dlg.m_sBtnTitle = "MyButton";就可以了。

  3。修改或者重載一個新的構造函數,比如:


CMyDialog::CMyDialog(CString str)
{
    m_sBtnTitle = str;
}

    最後,在對話框類的初始化函數增加m_Btn.SetWindowText(m_sBtnTitle);即可。

  還有一些網友提供的方法是定義全局變量。當然,首先肯定全局變量是可以完成此功能的。不過筆者並不贊同用全局變量的方法。對於面向對象的編程和設計來說,全局變量應該盡量少使用,因為全局變量將增加模塊之間的耦合度,與面向對象的思想是有違背的。正如goto語句,好用但盡量少用。在這裡筆者並不是反對用全局變量,而是要看情況而用。筆者曾經開發過一個日本項目,粗略計算一下,全局變量不下於1000個,這樣的程序的維護難度可想而知。

  希望此文能夠幫助初學者在VC之路上少走一些歪路,盡快融入VC開發大軍。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved