非模態對話框的使用

例子,在單文檔程序窗口中繪製圓,通過調出非模態對話框設置半徑值。(畫圓部分省略)

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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章