C++MFC编程笔记day08 MFC对话框的使用

一 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("用户名或密码错误!");

}

}

C++MFC编程笔记day08 MFC对话框的使用

时间: 2024-08-07 20:07:55

C++MFC编程笔记day08 MFC对话框的使用的相关文章

C++MFC编程笔记day07 MFC单文档绘图保存、多文档绘图保存

完善绘图例子(day06中的),加上保存功能 1 设计和编写图形类 CShape 1.1 成员变量 CPoint m_ptBegin; CPoint m_ptEnd; UINT m_nType; 1.2 支持序列化 1.2.1 继承自CObject 1.2.2 添加序列化的声明宏和实现宏 1.2.3 重写虚函数Serilize(),在函数中,完成成员变量的序列化 2 由于保存多个图形,引入MFC的集合类CObArray,保存的是CObject 对象的地址. 3 图形数据需要保存到文档类中,在该类

C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理

一.MFC概念和作用 1.全称Microsoft Foundation Class Library,我们称为微软基础类库,封闭了绝大部分的win32 Api函数,C++语法中的数据结构,程序的执行流程 MFC就是一个库(动态库,静态库) MFC还是一个程序框架 2.为什么使用MFC 基于框架编程,提高工作效率,减少开发周期,节约开发成本. 二.几个重要的头文件 afx.h    -绝大部分类的声明头文件 afxwin.h -包含了afx.h和windows.h afxext.h -提供了扩展窗口

C++MFC编程笔记day06 MFC向导、MFC绘图类使用

MFC绘图 MFC绘图类包括绘图设备类和绘图对象类 1 绘图设备类 CDC类-父类是CObject,封装的是一般的绘图设备,例如:显示器, 打印机等. CWindowDC类-父类是CDC类,封装的是窗口对象,包括客户区和非 客户区. CClientDC类-父类是CDC类,封装的仍然是窗口,但是只包括客户区. CPaintDC类-父类是CDC类,封装的是窗口的客户区.但是,它只用 在窗口的WM_PAINT消息处理函数中. CMetaFileDC类-父类是CDC类,作用保存绘制命令. 2 使用 创建

C++MFC编程笔记day03 MFC工具栏、状态栏、视图窗口

MFC工具栏 相关类: CToolBarCtrl - 父类是 CWnd  封装了工具栏控件相关操作 CToolBar - 父类是CControlBar  封装了工具栏和框架窗口之间的关系 工具栏使用: //把工具栏对象定义为 CMyFrameWnd成员: CToolBar toolbar; //在窗口创建时,加载工具栏资源 int CMyFrameWnd::OnCreate(LPCREATESTRUCT lpc) { toolbar.CreateEx(this,TBSTYLE_FLAT,WS_C

C++MFC编程笔记day02 MFC消息映射机制、菜单资源使用

机制3:MFC消息映射机制: 类内声明,类外定义宏,绑定消息处理函数 派生自CCmdTarget 类内声明宏:DECLARE_MESSAGE_MAP() 类外添加实现宏: BEGIN_MESSAGE_MAP(类名,父类名) END_MESSAGE_MAP() //数据结构 struct AFX_MSGMAP_ENTRY { UINT nMessage;   // 消息ID UINT nCode;      // 通知码 UINT nID;        // 控件ID或消息 UINT nLast

C++MFC编程笔记day07 MFC的文件操作、序列化和保存

一 MFC的文件操作 1 相关类 CFile类-封装了文件句柄以及操作文件的API函数. CFileFind类-提供文件查找功能. 2 CFile类的使用 2.1 打开或者新建文件 CFile::Open 2.2 文件读写 注意:1 文件指针位置 2 异常处理 CFile::Write CFile::Read CFile::SeekToBegin 2.3 关闭文件 CFile::Close 2.4 设置/获取文件属性 CFile::SetStatus/GetStatus 3 CFileFind类

C++MFC编程笔记day10 MF界面控件的使用2、属性页对话框、MFC线程

一 树型控件 1 相关类 CTreeCtrl-父类是CWnd,控件类. CTreeView-父类是CCtrlView,视图类.CTreeView=CView+CTreeCtrl CTreeView::GetTreeCtrl 2 CTreeCtrl的使用 对比CListCtrl:列表控件的每个数据项之间是平等关系,通过数据项 的索引值得到数据项的信息.树控件每个数据项称之为节点.节点之间 的关系包括父子关系和兄弟关系.通常通过节点句柄得到某个节点. 通常用来表示层次关系的数据. 2.1 设置控件的

C++MFC编程笔记day09 MF界面控件的使用1

一 MFC控件 1 控件介绍 1.1 静态控件包括图片.静态文本和分组框.生成的控件的ID统一是 IDC_STATIC.很少程序中访问和操作,只是使用静态控件显示信息 1.2 编辑框控件,控件类是CEdit,通常使用它接收用户的输入,显示 信息给用户. 1.3 按钮控件包括一般按钮.复选按钮和单元按钮,控件类都是CButton 单选按钮注意,同一组的按钮Tab键顺序的编号连续(Ctrl+d  显示tab顺序),而且编号小的 按钮设置group属性,才能在同一个对话框中,实现多个单选按钮的 多个分

C++MFC编程笔记day04 运行时类信息和窗口的动态、静态切分

运行时类信息 程序在运行时,获取对象类的信息及类的继承关系 实现: 1.定义类继承自CObject类. 2.类内声明宏DECLARE_DYNAMIC(),类外实现宏IMPLEMENT_DYNAMIC() 3.使用: BOOL IsKindOf(CRuntimeClass* pClass)//对象是否属于某个类 CRuntimeClass* GetRuntimeClass( );//获取对象运行时类信息,经常使用RUNTIME_CLASS(类名)代替. 示例: #include "stdafx.h