0x00 数据交换和检验
在MFC中,改变控件的属性,其会通过对话框类自动生成的成员函数DoDataExchange()来实现修改相应关联的变量的值。这种现象称为对话框的数据交换和检验机制。需要注意的是,在该机制下DoDateExchange()并不是被自动调用,需要开发者在程序中调用CDialogEx::UpdateData()函数,再由其自动调用DoDataExchange()函数。
UpDateData()函数原型如下:
BOOL UpdateData(BOOL bSaveAndValidate = TRUE)
参数:
bSaveAndValidate指明数据传输方向,若为TRUE,控件-》变量;若为FALSE,变量-》控件。其默认值为TRUE。
返回值:
数据更新操作是否成功,成功为TRUE,失败为FALSE。
0x01 为控件添加消息处理函数
1_右击控件,选择“Add Event Handler…”添加消息处理函数
2_在控件属性中点击“Control Events”按钮(闪电按钮)选择并添加消息。
3_直接双击控件
4_通过Class Wizard添加(此为VS2002至VS2008没有该种方法)
0x02 编辑TAB顺序
在主菜单中选择Format -> Tab Order或者 Ctrl + D使对话框上显示各个控件的TAB顺序数字,然后按开发者想排列的顺序依次点击控件即可。完成后,点击空白处或者按ESC保存修改。
0x03 对话框的分类
1_模态对话框
在一个多对话框的程序运行中,模态对话框弹出后,该程序的其他对话框不能被操作,只有当其退出后,其他的对话框才可以被操作。
ps:模态对话框弹出的原理
其涉及到CDialog类下的一个重要函数DoModal(),调用该函数,对话框就会弹出,其返回值为退出对话框所点的按钮ID。其原型如下:
virtual INT_PTR DoModal();
返回值说明: 其返回值类型为整型,指定了传递给CDialog类下的EndDialog函数【注:该函数用于关闭对话框】的nResult参数,若不能创建对话框,则返回-1,若出现其他的错误则返回IDABORT。
2_非模态对话框
该种对话框,并不影响用户对本程序的其他对话框的操作,一般来说,这种对话框用作显示提示信息。
0x04 属性页对话框
该种对话框用到以下两个类:
1_CPropertyPage类
其用以处理某单个属性页,故需要为每个属性页创建一个继承该类的子类。
\1构造函数<常用>常用>
CPropertyPage() | 无参数构造函数 |
CPropertyPage(UINT nIDTemplate,UINT nIDCaption = 0,DWORD dwSize = sizeof(PROPSHEETPAGE))
参数说明:
nIDTemplate,属性页的对话框资源ID
nIDCaption,属性页对话框选项卡的标题所用字符串资源的ID,需要注意的是若此值设为0,则选项卡标题就使用该属性页的对话框资源的标题。
CPropertyPage(LPCTSTR lpszTemplateName,UINT nIDCaption = 0,DWORD dwSize = sizeof(PROPSHEETPAGE))
参数说明:
lpszTemplateName,属性页的对话框资源的名称字符串,不能为NULL
nIDCaption,与上面一样。
\2CancleToClose函数
在模态属性页对话框的属性页进行了某不可恢复的操作后,使用CancelToClose函数,将“OK”按钮改为“Close”按钮,并禁用“Cancel”按钮
\3SetModified函数
可激活或禁用”Apply”按钮
\可重载的消息处理函数
OnApply:处理属性页的”Apply”按钮被单击的消息
OnCancel:处理属性页的”Cancel”按钮被单击的消息
OnKillActive:处理属性页当前活动状态被切换的消息,常用于数据验证
OnOK:处理属性页的”OK”按钮、”Apply”按钮或”Close”按钮被单击的消息
OnQueryCancel:处理属性页的”Cancel”按钮被单击前发出的消息
OnReset:处理属性页的”Reset”按钮被单击的消息
OnSetActive:处理属性页被切换为当前活动页的消息
OnWizardBack:处理属性页的”Back”按钮被单击的消息,仅在向导对话框中有效
OnWizardFinish:处理属性页的”Finish”按钮被单击的消息,仅在向导对话框中有效
OnWizarNext:处理属性页的“Next”按钮被单击的消息,仅在向导对话框中有效
2_CPropertySheet类
其负责加载、打开或删除属性页,并可以在属性页对话框中切换属性页,需要注意的是其亦存在模态和非模态。
\构造函数
CPropertySheet() | 无参数构造函数 |
CPropertySheet(UINT nIDCaption,CWnd* pParentWnd = NULL,UINT iSelectPage = 0)
参数说明:
nIDCaption,标题的字符串资源ID
nParentWnd,属性页对话框的父窗口,若为NULL,则父窗口为应用程序的主窗口
iSelectPage,初始状态时,活动属性页的索引,默认为第一个添加到属性表的属性页
CPropertySheet(LPCTSTR pszCaption,CWnd* pParentWnd = NULL,UINT iSelectPage = 0)
pszCaption,标题字符串
nParentWnd,属性页对话框的父窗口,若为NULL,则父窗口为应用程序的主窗口
iSelectPage,初始状态时,活动属性页的索引,默认为第一个添加到属性表的属性页
\GetActiveIndex函数
获得当前活动属性页的索引
\GetActivePage函数
获得当前活动属性页对象
\GetPage函数
获得某个属性页的对象,需要传入目标属性页的索引
\GetPageCount函数
获取属性页的数量
\GetPageIndex函数
获取某属性页在属性页对话框中的索引,需要传入要获取索引的属性页对象的指针
\SetActivePage函数
设置某个属性页为活动属性页,需要传入要设置为活动属性页的索引和要设置为活动属性页的对象指针
\SetWizardButton函数
在向导对话框上启用或者禁用Back、Next或Finish按钮,应在调用DoModal之前调用此函数
其参数用以设置向导按钮的外观和功能属性,有如下的可选值:{
PSWIZB_BACK 启用“Back”按钮,如果不包含此值则禁用”Back”按钮
PSWIZB_NEXT 启用“Next”按钮,如果不包含此值则禁用”Next”按钮
PSWIZB_DISABLEDEFINISH 显示禁用的“Finish”按钮
}
\SetWizardMode函数
设置属性页对话框为向导对话框模式,应在调用DoModal之前调用此函数
\SetTitle函数
设置属性对话框的标题,需要传入标题字符串和指定属性表标题的风格。应为0或者PSH_PROPTITLE。如果设为PSH_PRPTITLE,则“Properties”会出现在指定标题之后。
\AddPage函数
为属性对话框添加新的属性页,需要传入要添加的新的属性页的对象指针
\PressButton函数
模拟按下某指定按钮,其需要传入的参数值有以下的选项{
PSBTN_BACK 选择“Back”按钮
PSBTN_NEXT 选择“Next”按钮
PSBTN_FINISH 选择“FINISH”按钮
PSBTN_OK 选择“OK”按钮
PSBTN_APPLYNOW 选择“Apply”按钮
PSBTN_CANCEL 选择“Cancel”按钮
PSBTN_HELP 选择“帮助”按钮
}
\RemovePage函数
删除任意属性页,需要传入要删除的属性页的对象指针和要删除的属性页的索引
0x05消息对话框
1_MessageBox函数
位于CWnd类下
int MessageBox(LPCTSTR lpszText,LPCTSTR lpszCaption = NULL,UINT nType = MB_OK)
参数说明:
lpszText,需要显示的消息字符串
lpszCaption,消息对话框的标题字符串。默认值为NULL,取值为NULL时使用默认标题
nType,消息对话框的风格和属性。默认为MB_OK风格,即仅有“确定”按钮
2_AfxMessageBox函数
int AfxMessageBox(LPCTSTR lpszText,UINT nType = MB_OK, UINT nIDHelp = 0)
参数说明:
lpszText,需要显示的消息字符串
nType,消息对话框的风格和属性。默认为MB_OK风格,即仅有“确定”按钮
nIDHelp,此消息帮助上下文ID,默认值为0,取0时表示使用程序的默认帮助。
3_消息函数的返回值
IDABORT 单击“终止”按钮
IDCANNCEL 单击“取消”按钮
IDIGNORE 单击“忽略”按钮
IDNO 单击“否”按钮
IDOK 单击“确定”按钮
IDRETRY 单击“重试”按钮
IDYES 单击“是”按钮
0x06 文件对话框
CFileDialog(BOOL bOpenFileDialog,LPCTSTR lpszDefExt = NULL,LPCTSTR lpszFileName = NULL,DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITERPROMPT,LPCTSTR lpszFilter =NULL,CWnd* pParentWnd =NULL,DWORD dwSize = 0,BOOL bVistaStyle = TRUE) |
参数说明:
bOpenFileDialog:指定要创建的文件对话框的类型。设为TRUE将创建打开文件对话框,否则将创建保存文件对话框。
lpszDefExt:默认的文件扩展名。如果用户在文件名编辑框中没有输入扩展名,则由lpszDefExt指定的扩展名将被自动添加到文件名后。默认为NULL。
lpszFileName:文件名编辑框中显示的初始文件名。如果为NULL,则不显示初始文件名。
dwFlags:文件对话框的属性,可以是一个值也可以是多个值的组合。关于属性值的定义,可以在MSDN中查找结构体OPENFILENAME,元素Flags的说明中包含了所有属性值。默认为OFN_HIDEREADONLY和OFN_OVERWRITEPROMPT的组合,OFN_HIDEREADONLY表示隐藏文件对话框上的“Read Only”复选框,OFN_OVERWRITEPROMPT表示在保存文件对话框中如果你选择的文件存在了,就弹出一个消息对话框,要求确定是否要覆盖此文件。
lpszFilter:文件过滤器,它是由若干字符串对组成的一个字符串序列。如果指定了文件过滤器,则文件对话框中只有符合过滤条件的文件显示在文件列表中待选择。给大家看看VS2010 MSDN中给出的一个例子:
static TCHAR BASED_CODE szFilter[] = _T(“Chart Files (*.xlc) | *.xlc | Worksheet Files (*.xls) | *.xls | Data Files (.xlc;.xls) | *.xlc; *.xls | All Files (.) | . | ”); |
这样设置过滤器以后,文件对话框的扩展名组合框中将有四个选项:Chart Files (.xlc)、Worksheet Files (.xls)、Data Files(.xlc;.xls)和All Files (.),大家可以看到每种文件的扩展名规定都是一个字符串对,例如Chart Files的过滤字符串是Chart Files(.xlc)和.xlc成对出现的。
pParentWnd:文件对话框的父窗口的指针。
dwSize:OPENFILENAME结构体的大小。不同的操作系统对应不同的dwSize值。MFC通过此参数决定文件对话框的适当类型(例如,创建Windows 2000文件对话框还是XP文件对话框)。默认为0,表示MFC将根据程序运行的操作系统版本来决定使用哪种文件对话框。
bVistaStyle:指定文件对话框的风格,设为TRUE则使用Vista风格的文件对话框,否则使用旧版本的文件对话框。此参数仅在Windows Vista中编译时适用。
文件对话框也是模态对话框,所以在打开时也需要调用CFileDialog类的DoModal()成员函数。在打开文件对话框中点了“打开”或者在保存文件对话框中点了“保存”以后,我们可以使用CFileDialog类的成员函数GetPathName()获取选择的文件路径。
下面列出几个CFileDialog类的成员函数,我们可以使用它们获得文件对话框中的各种选择。
GetFileExt():获得选定文件的后缀名。 GetFileName():获得选定文件的名称,包括后缀名。 GetFileTitle():获得选定文件的标题,即不包括后缀名。 GetFolderPath():获得选定文件的目录。 GetNextPathName():获得下一个选定的文件的路径全名。 GetPathName():获得选定文件的路径全名。 GetReadOnlyPref():获得是否“以只读方式打开”。 GetStartPosition():获得文件名列表中的第一个元素的位置。
0x07 字体对话框
字体对话框是一种模态对话框,其封装在CFontDialog类中。
\构造函数
CFontDialog(
LPLOGFONT lplfInitial = NULL,
DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS, |
CDC *pdcPrinter = NULL,
CWnd *pParentWnd = NULL
)
参数说明:
lplfInitial:用以设置字体的某些特征,指向LOGFONT结构体的指针,LOGFONT可以设定字体高度、宽度、方向和名称等等
dwFlags:选择字体的属性
pdcPrinter:指向打印设备上下文
pParentWnd:指向字体对话框父窗口
0x08颜色对话框
颜色对话框被包含在MFC中的CColorDialog类中,其亦是一种模态对话框。
\构造函数
CColorDialog(
COLORREF clrInit = 0,
DWORD dwFlags = 0,
CWnd *pParentWnd = NULL
)
参数说明:
clrInit:类型为COLORREF的值,而该值真正对应的是unsigned long类型,其意义是默认选择颜色的颜色值,一般来说,若没对其初始化,其值为 RGB(0,0,0)即黑色
dwFlag:自定义颜色对话框功能和外观的属性值
pParentWnd:颜色对话框的父窗口指针
\获取对话框选取的颜色函数
GetColor()
函数说明,该函数返回的值是COLORREF值,即用户选取的颜色,如果想要进一步知道其RGB的值,则可以使用以下三个函数:
GetRValue(DWORD rgb) -> 获取R的值
GetGValue(DWORD rgb) -> 获取G的值
GetBValue(DWORD rgb) -> 获取B的值
参数说明: rgb即上面GetColor函数得到的COLORREF的颜色值
本文仅是个人学习笔记,内容比较凌乱,后期可能会系统整理出教程。谢谢支持