標籤: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("使用者名稱或密碼錯誤!");
}
}