C++MFC編程筆記day08 MFC對話方塊的使用

來源:互聯網
上載者:User

標籤:des   style   blog   http   使用   os   io   檔案   

一 MFC對話方塊
   1 分類
   模式和非模式
   2 相關類
   CDialog類-父類是CWnd,本質上是一個視窗,對話方塊類的父類。
   CCommonDialog類以及子類-通用對話方塊,顏色對話方塊、檔案對話方塊、
             尋找替換對話方塊、字型設定對話方塊、列印設定對話方塊和
             列印對話方塊。
   CPropertyPage類-屬性頁面對話方塊。
   3 在Win32嚮導中,使用MFC的類建立對話方塊程式
     3.1 強制回應對話方塊
         3.1.1 建立和顯示對話方塊
               CDialog::DoModal()
         3.1.2 對話方塊的關閉(無需使用者處理)
               CDialog::OnOK/OnCancel


     3.2 非強制回應對話方塊
         3.2.1 建立和顯示對話方塊
               類似於一般視窗的建立過程
         3.2.2 對話方塊的關閉
               1 重寫CDialog::OnOK/OnCancel函數,在函數中:
                 DestroyWindow()
               2 重寫CWnd::PostNcDestroy函數,在函數中:
                 delete this;
     3.3 建立單文檔程式,使用菜單分別開啟模式/非強制回應對話方塊
         對比運行時的效果
     3.4 跟蹤DoModal()函數的執行過程
         3.4.1 尋找和載入對話方塊資源
         3.4.2 將父視窗設定為不可用狀態
         3.4.3 建立對話方塊
         3.4.4 進入對話方塊的訊息迴圈
         3.4.5 當點擊OK或則Cancel按鈕後,退出迴圈
         3.4.6 隱藏了對話方塊視窗,將父視窗設定為可用狀態
         3.4.7 銷毀對話方塊
         3.4.8 解除配置框資源
         3.4.9 返回DoModal()函數的返回值
樣本:
建立win32 應用程式 ,然後改為支援MFC,並手動建立代碼:
// DlgApp.cpp : Defines the entry point for the application.
//


#include "stdafx.h"//#include <afxwin.h>
#include "resource.h"
class CMyDlg:public CDialog
{
public:
CMyDlg():CDialog(IDD_DIALOG1){}//關聯對話方塊資源ID
//以下3函數,使用非強制回應對話方塊時要重寫實現
virtual void PostNcDestroy( );
virtual void OnOK( );
virtual void OnCancel();
};
void CMyDlg::OnOK()
{
CDialog::OnOK();
DestroyWindow();
}
void CMyDlg::OnCancel()
{
CDialog::OnCancel();
DestroyWindow();
}
void CMyDlg::PostNcDestroy()
{
CWnd::PostNcDestroy();
delete this;
}
class CDlgApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
CDlgApp theApp;
BOOL CDlgApp::InitInstance()
{
/*  強制回應對話方塊
CMyDlg dlg;
m_pMainWnd=&dlg;
dlg.DoModal();//建立和顯示模式對話方塊
*/
//非強制回應對話方塊
CMyDlg *pDlg=new CMyDlg;
pDlg->Create(IDD_DIALOG1);//對話方塊資源ID
m_pMainWnd=pDlg;
pDlg->ShowWindow(SW_SHOW);
return TRUE;
}








二 對話方塊的資料交換技術(DDX)
   引入它的目的是方便操作控制項和擷取/設定控制項的值
   可以將控制項與對話方塊的成員變數綁定,通過操作對話方塊的成員變數來
   達到操作控制項的目的。
   1 相關函數
     1.1 一系列的綁定函數
         DDX_Control ,繫結控制項類型的變數
         DDX_Text    ,綁定值類型的變數
         例如,對話方塊中有一個編輯框控制項,ID,ID_EDIT1
         對話方塊類中的變數,CString m_strText;//值類型的變數
                          int m_nText;//值類型的變數


                          CEdit m_wndText;//控制項類型的變數
     1.2 對話方塊資料交換函數,包含1.1綁定函數
         CWnd::DoDataExchange
     1.3 當值類型(CString)成員變數與控制項之間有資料交換時,調用以下函數:
         UpdateData()
         UpdateData(TRUE)-控制項的值傳遞給成員變數
         UpdateData(FALSE)-成員變數的值放到控制項上顯示
    2 使用
    3 原理
      3.1 DDX_Control-控制項類型的綁定函數
          DDX_Control(CDataExchange* pDX, ...)
          {
             //1根據控制項的ID,得到控制項的控制代碼
             HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
             //2 將控制項類型的變數與控制項的控制代碼建立映射關係
             rControl.SubclassWindow(hWndCtrl)
             {
               Attach(hWndCtrl);
             }
          }
      3.2 DDX_Text-值類型的綁定函數
          DDX_Text(CDataExchange* pDX, int nIDC,...)
          {
              //1根據控制項的ID,得到控制項的控制代碼
             HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
             //2 變數與控制項相互賦值
             if (pDX->m_bSaveAndValidate)
    {
int nLen = ::GetWindowTextLength(hWndCtrl);
::GetWindowText(hWndCtrl, value.GetBufferSetLength(nLen), nLen+1);
value.ReleaseBuffer();
     }
     else
     {
AfxSetWindowText(hWndCtrl, value);
     }


          }
      4 函數的調用關係,為什麼我們會在CMyDlg::OnInitDialog(),首先
        調用它的父類CDialog::OnInitDialog()?
        只有調用CDialog::OnInitDialog(),對話方塊顯示前,才能將
        控制項與變數綁定。具體的調用關係:
        CDialog::OnInitDialog()
        {
           UpdateData(FALSE);
           {
             DoDataExchange(pDx);
             {
               DDX_Control();
               DDX_Text();
             }
           }
        }


樣本,建立win32 應用程式,然後手動改為支援MFC,再寫代碼:
// DlgDDX.cpp : Defines the entry point for the application.
//


#include "stdafx.h"//#include <afxwin.h>
#include "resource.h"
class CMyDlg:public CDialog
{
public:
CMyDlg():CDialog(IDD_DIALOG1){}//關聯對話方塊資源ID
//以下3函數,非強制回應對話方塊時要重寫實現
virtual void PostNcDestroy( );
virtual void OnOK( );
virtual void OnCancel();
virtual BOOL OnInitDialog();
virtual void DoDataExchange(CDataExchange* pDX);
CButton m_wndOK;//與ok按鈕綁定的控制項
CString m_wndEdit1;
};
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX,IDOK,m_wndOK);//介面上控制項與成員變數綁定
DDX_Text(pDX,IDC_EDIT1,m_wndEdit1);
}
void CMyDlg::OnOK()
{
UpdateData(TRUE);
AfxMessageBox(m_wndEdit1);
//CDialog::OnOK();
//DestroyWindow();
}
void CMyDlg::OnCancel()
{
CDialog::OnCancel();
DestroyWindow();
}
void CMyDlg::PostNcDestroy()
{
CWnd::PostNcDestroy();
delete this;
}
//對話方塊初始化
BOOL CMyDlg::OnInitDialog()
{
if(!CDialog::OnInitDialog())
{
return FALSE;
}
CWnd* pbtn = GetDlgItem(IDCANCEL);//擷取控制項
pbtn->EnableWindow(FALSE);//設定為不可用


m_wndOK.MoveWindow(0,0,100,100,TRUE);//操作綁定的成員變數等於操作控制項
m_wndOK.SetWindowText("DDX_OK");
m_wndEdit1="123";
UpdateData(FALSE);
return TRUE;
}
class CDlgApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
CDlgApp theApp;
BOOL CDlgApp::InitInstance()
{
///*  強制回應對話方塊
CMyDlg dlg;
m_pMainWnd=&dlg;
dlg.DoModal();//建立和顯示模式對話方塊
//*/


return TRUE;
}




三 實現登入功能
在主視窗顯示前,設定登陸對話方塊,登陸通過了,才顯示主視窗:
CDialogLogin dlglogin;
if(IDOK!=dlglogin.DoModal()) return false;
添加控制項與值綁定:
Ctrl+w ,選擇 member variables 選項卡,添加與控制項對應的變數。
登陸對話方塊處理:
void CDialogLogin::OnOK()
{
UpdateData(TRUE);//更新控制項值到變數中
if(m_UserName=="123" && m_UserPwd=="123")//類比登陸
{
CDialog::OnOK();
}
else
{
AfxMessageBox("使用者名稱或密碼錯誤!");
}
}


樣本:
1、建立MFC對話方塊應用程式

2、添加對話方塊,ID為IDD_DIALOG_LOGIN,並修改介面控制項。


3、雙擊對話方塊標題,選擇Create a new class,添加對應的類,類名為 CDialogLogin。


4、ctrl+w新增成員綁定:


5、在app的IninInstance函數中,加入代碼:
CDialogLogin dlglogin;
if(IDOK!=dlglogin.DoModal()) return false;
意思是,如果登陸框沒有返回IDOK就不顯示主架構視窗。


添加點擊確定按鈕時的訊息映射:






//CDialogLogin中實現點擊登陸的代碼:
void CDialogLogin::OnOK()
{
UpdateData(TRUE);
if(m_UserName=="123" && m_UserPwd=="123")//類比登陸
{
CDialog::OnOK();//預設關閉對話方塊,返回IDOK
}
else
{
AfxMessageBox("使用者名稱或密碼錯誤!");
}

}




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.