MFC Dialog使用

 

 1. OnInitDialog 對話框初始化函數

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

BOOL CXXXDlg::OnInitDialog()

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

  CChildDlg dlg;
  dlg.DoModal();ide

  //你的業務代碼函數

}工具

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

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

 

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

 

設置dialog的標題:指針

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

CString title;

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

this->SetWindowText(title);

 

 

 

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

MFC:

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

二、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)的地方。

一、對於模態對話框:

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

二、對於非模態對話框,你關閉對話框時,就不能只調用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(不然滾動滑輪,字會花掉).
相關文章
相關標籤/搜索