例子,在單文檔程序窗口中繪製圓,通過調出非模態對話框設置半徑值。(畫圓部分省略)
1、新建單文檔應用程序,添加一個對話框資源,並創建對話框類CRadiusDlg。
2.在視圖類頭文件中加入剛創建的對話框類的頭文件,#include"RadiusDlg.h",並添加一個對話框類的指針變量,CRdiusDlg *pModalessDlg;
3.在菜單欄中添加一個用於顯示對話框的菜單項,併爲其添加命令函數,添加代碼:
if(pModallessDlg==NULL)
{
pModallessDlg=new CRadiusDlg;
//pModallessDlg->m_nRadius=100; //設置編輯框控件變量的初始值
pModallessDlg->Create(IDD_RADIUS_DLG,NULL);//創建非模態對話框
pModallessDlg->ShowWindow(SW_SHOW); //顯示非模態對話框
}
else
pModallessDlg->SetActiveWindow();//若對話框已創建,只需要激活即可
運行,點擊即可顯示非模態對話框。下面添加對具體的應用。
4、在剛纔創建的對話框中再添加一個按鈕“應用”,ID爲IDAPPLY。現在對話框上共三個按鈕,“確定”,“取消”和“應用”,我們要添加一個消息WM_DIALOG,爲下面點擊時按鈕服務。
a、在對話框類的頭文件中加入#define WM_DIALOG WM_USER+1。
b、在視圖類的頭文件中聲明消息WM_DIALOG,afx_msg LRESULT OnDialog(WPARAM wParam,LPARAM lParam);
在CPP文件中添加消息響應,ON_MESSAGE(WM_DIALOG,OnDialog)。
5、在對話框中分別爲三個按鈕添加消息處理函數。i當點擊任一個按鈕時都發送WM_DIALOG消息,響應OnDialog函數進行相應處理。
void CInputDlg::OnOK()
{
// TODO: Add extra validation here
UpdateData(true);
CFrameWnd* pFrame=GetParentFrame();//獲得父窗口框架
CView* pView=pFrame->GetActiveView();//獲得當前視圖
pView->PostMessage(WM_DIALOG,IDOK);//向神圖發送消息,參數爲IDOK
CDialog::OnOK();
}
void CInputDlg::OnCancel()
{
// TODO: Add extra cleanup here //Cancel則不更新數據,直接投遞消息
CFrameWnd* pFrame=GetParentFrame();
CView* pView=pFrame->GetActiveView();
pView->PostMessage(WM_DIALOG,IDCANCEL);
CDialog::OnCancel();
}
void CInputDlg::OnApply()
{
// TODO: Add your control notification handler code here
UpdateData(true);
CFrameWnd* pFrame=GetParentFrame();
CView* pView=pFrame->GetActiveView();
pView->PostMessage(WM_DIALOG,IDAPPLY);
}
6、編輯消息處理函數WM_DIALOG的響應函數:
LRESULT CModallessView::OnDialog(WPARAM wParam,LPARAM lParam)
{
switch(wParam)
{
case IDOK:
m_nCViewRadius=pModallessDlg->m_nRadius;//獲得對話框編輯控件成員變量的值
pModallessDlg->DestroyWindow(); //銷燬對話框窗口
delete pModallessDlg; //刪除當前的非模態對話框對象
pModallessDlg=NULL; //設置非模態對話框不存在標誌
break;
case IDCANCEL:
pModallessDlg->DestroyWindow();
delete pModallessDlg;
pModallessDlg=NULL;
break;
case IDAPPLY: //保留非模態對話框
m_nCViewRadius=pModallessDlg->m_nRadius;
break;
}
Invalidate(); //刷新視圖
return 0;
}