MFC Dialog使用


 

 1. OnInitDialog 對話框初始化函數

在MFC主對話框OnInitDialog()中彈出對話框

BOOL CXXXDlg::OnInitDialog()

{
  CDialogEx::OnInitDialog();
  SetIcon(m_hIcon, TRUE);
  SetIcon(m_hIcon, FALSE);

  CChildDlg dlg;
  dlg.DoModal();

  //你的業務代碼

}

在MFC中新建基於對話框的程序時,會使用到OnInitDialog()函數,OnInitDialog函數主要用於對話框對象初始化操作,比如:在對話框類的定義中有指針、數據或者布爾類型變量等,這些成員的初始化都可以放在OnInitDialog函數中。

其函數原型是: virtual BOOL OnInitDialog(),是虛函數,在對話框顯示之前被調用。
 

 

有時候需要在OnInitDialog彈出對話框,例如密碼框來決定是否顯示主對話框。那么子對話框CChildDlg的風格必須是Popup或Overlapped風格,Child風格是彈不出來的.

 

設置dialog的標題:

在對應對話框的初始化函數OnInitDialog()中添加以下代碼:

CString title;

title.Format("%d",Id);//在標題欄動態顯示Id的值

this->SetWindowText(title);

 

 

 

首先OnOK是對ID_OK的響應, OnCancel是對IDCANCEL的響應. 前者對應鍵盤的Enter, 后者對應Esc.

MFC:

1、Called when the user clicks the OK button (the button with an ID ofIDOK).

2、The framework calls this member function when the user clicks the Cancel button or presses the ESC key in a modal or modeless dialog box.

 

兩個函數都是CDialog類的virtual的成員函數, 也就是MFC是希望你去重載它們. 兩個函數有一個共同點,就是都會調用CDialog::EndDialog. 這個CDialog::EndDialog函數是在CDialog::OnOK();中調用的。EndDialog的作用如下,摘自MSDN:

 

Call this method to destroy a modal dialog box

Do not call EndDialog to destroy a modeless dialog box. Call CWindow::DestroyWindow instead

 

模態對話框可以用EndDialog來銷毀, 非模態對話框要用DestroyWindow來銷毀. 以下摘自MSDN:

 

If you implement the OK button in a modeless dialog box, you must override the OnOK method and call DestroyWindow inside it. Do not call the base-class method, because it calls EndDialog which makes the dialog box invisible but does not destroy it.

 

為什么強調用誰來銷毀,因為這牽涉到資源釋放的問題:

//調用基類的OnOK()函數,執行基類中的EndDialog(IDOK)函數,作用是關閉對話框,並把IDOK作為對話框的返回值,返回給調用對話(DoModal)的地方。

1、對於模態對話框:

void CMyDlg::OnOK()
{
CDialog::OnOK();
}

2、對於非模態對話框,你關閉對話框時,就不能只調用CDialog的OnOK, 還應該DestroyWindow,像下面這樣:

void CMyDlg::OnOK()
{
CDialog::OnOK();//關閉窗口,窗口不可見,但是並沒有銷毀
DestroyWindow();//銷毀窗口,釋放窗口資源
}
-- 

 

 

OnOK 和OnCancel函數:

MFC默認建立的Dialog按Esc響應OnCancel,回車響應OnOK,都會關閉對話框。

而點擊下方兩個按鈕功能相同,點擊確定是響應OnOK, 點擊取消調用OnCancel。

而OnOK和OnCancel之間是有區別的:

CDialog::OnOK首先調用UpdateData(TRUE)將數據傳給對話框成員變量,然后調用CDialog::EndDialog關閉對話框。 
CDialog::OnCancel只調用CDialog::EndDialog關閉對話框。  

所以我們在銷毀dialog需要進行一些數據交換就可以在OnOK中進行。

 

 

 


/*
* Dialog Box Command IDs
*/
#define IDOK 1
#define IDCANCEL 2

 

INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置處理何時用
// “確定”來關閉對話框的代碼
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置處理何時用
// “取消”來關閉對話框的代碼
}
else if (nResponse == -1)
{
TRACE(traceAppMsg, 0, "警告: 對話框創建失敗,應用程序將意外終止。\n");
}

 

在對話框程序中,

1)用戶點擊X關閉按鈕,調用的是CDialog::OnCancel函

 

 

使用RichEdit切記:

在mfc中使用工具欄里的RichEdit 控件時,應該在對話框構造函數中用

AfxInitRichEdit()或者 AfxInitRichEdit2()。

否則程序啟動后沒有界面。

 

解決MFC對話框不顯示最小化、最大化和關閉按鈕的問題

右擊屬性欄,發現如下設置成了灰色的了
解決辦法:
設置System Menu為True,上面的最大化和最小化就可以設置了
 
RichEdit2不換行的問題:
Auto HScroll
屬性中 設置mulitiline為TRUE,wantreturn設置為true,Audo Vscroll為TRUE、Vertical SCroll為TRue
TransParent必須為false(否則滾動滑輪,字會花掉).
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM