1 创建对话框模板和修改对话框属性
Application Type->Dialog based
ID:对话框ID
Caption:对话框标题
Maximize:最大化按钮
Minimize:最小化按钮
Style:对话框类型,overlapped重叠窗口 popup弹出式窗口 child子窗口
System Menu:是否带有标题栏左上角的系统菜单
Title Bar:是否带有标题栏
Font:字体类型和字体大小
Owner Draw :更改控件
2 为对话框添加控件
View-> Toolbox(工具箱)
3 创建对话框类和添加控件变量
创建对话框类:Resource View->Dialog->Insert Dialog 之后选中对话框,右击,选择AddClass
创建控件变量:选中控件,右击,选择Add Variable
DoDataExchange
DoDataExchange()并不是被自动调用的,而是需要我们在程序中调用CDialogEx::UpdateData()函数,
由UpdateData()函数再去自动调用DoDataExchange()的
BOOL UpdateData(BOOL bSaveAndValidate =TRUE);
TRUE:控件->变量
FALSE:变量->控件
4 为控件添加消息处理函数
a.使用Class Wizard添加消息处理函数:选中控件,右击,选择Class Wizard
b.通过“Add EventHandler...”添加处理函数:选中控件,右击,选择Add Event Handler
c.在按钮的属性视图中添加消息处理函数:选中控件,右击,选择属性,点击Control Events(类似闪电标志)
d.双击按钮添加消息处理函数
OnBnClickedAddButton:
// 将各控件中的数据保存到响应的变量
UpdateData(TRUE);
// 将被加数和加数的加和赋值给m_editSum
m_editSum = m_editSummand + m_editAddend;
// 根据各变量值更新相应的控件。和的编辑框会显示m_editSum的值
UpdateData(FALSE);
5 设置对话框控件的Tab顺序
主菜单->Format->Tab Order,直接依次点击即可修改
6 模态对话框及其弹出过程
模态对话框:其他窗口无法与用户交互
非模态对话框:其他窗口仍能响应用户输入
INT_PTR nRes; // 用于保存DoModal函数的返回值
CTipDlg tipDlg; // 构造对话框类CTipDlg的实例
nRes = tipDlg.DoModal(); // 弹出对话框
if(nRes == IDCANCEL) // 判断对话框返回值是否为IDCANCEL,如果是则return,否则就继续向下执行
return;
注:都说DoModal返回值为OK或CANCEL键的ID,其实,这种说法是错误的。
在关闭此模态对话框时,返回值(IDOK或IDCANCEL)为关闭对话框所采用的方式,
默认对话框关闭方式有2种:OnOK(); OnCancel();
7 非模态对话框的创建及显示
// 如果指针变量m_pTipDlg的值为NULL,则对话框还未创建,需要动态创建
if(NULL == m_pTipDlg)
{
//创建非模态对话框实例
m_pTipDlg= new CTipDlg();
m_pTipDlg->Create(IDD_TIP_DIALOG,this);
}
// 显示非模态对话框实例
m_pTipDlg->ShowWindow(SW_SHOW);
// 删除非模态对话框对象
delete m_pTipDlg;
8 属性页对话框及相关类的介绍
a.分类
一般属相页对话框:通过标签切换各个页面
向导对话框:通过点击next等按钮来切换页面
b.相关类
CPpropertyPage : CDialog
用于处理某单个的属性页
(1)构造函数
CPropertyPage();
CPropertyPage(
UINTnIDTemplate, //对话框资源ID
UNITNIDCaption = 0, //标题字符串资源ID,默认设为0
DWORDdwSize = sizeof(PROPSHEETPAGE)
);
CPropertyPage(
LPCTSTRlpszTemplateName,
UNITNIDCaption = 0,
DWORDdwSize = sizeof(PROPSHEETPAGE)
);
(2)CancelToClose
进行某些不可恢复操作后,OK按钮改为Close按钮,并禁用Cancel按钮
(3)SetModified
激活或进行Apply按钮
void SetModified(BOOL bChanged = TRUE);
(4)可重载函数
OnOK
OnCancel
OnQueryCancel
OnApply
OnReset
OnKillActive
OnSetActive
OnWizardBack
OnWizardFinish
OnWizardNext
CPropertySheet : CWnd
属性表类,负责加载、打开或删除属相页
(1)构造函数
CPropertySheet();
CPropertySheet(
UNITnIDCaption, //标题的字符串资源ID
CWnd*pParentWnd = NULL,
UINTiSelectPage = 0
);
CPropertySheet(
LPCTSTRpszCaption,//标题字符串
CWnd*pParentWnd = NULL,//父窗口
UINTiSelectPage = 0 //活动属性页的索引
);
CPropertyPage *GetActivePage() const; 当前活动属性页对象的指针
CPropertyPage *GetPage(int nPage)const; 目标属相页对象的指针
int GetPageCount() const; 属性页的数量
int GettPageIndex(CPropertyPage*pPage); 属性页对象的索引
BOOL SetActivePage(int nPage);
BOOL SetActivePage(CPropertyPage*pPage); 设置某个属性页为活动属性页
void SetTitle(LPCTSTR lpszText, UINTnStyle); 设置标题,nStyle:0或PSH_PROPTITLE
void AddPage(CPropertyPage *pPage); 添加新的属性页
void PressButton(int nButton); 模拟按下某指定的按钮
PSBTN_BACK
PSBTN_NEXT
PSBTN_FINISH
PSBTN_OK
PSBTN_APPLYNOW
PSBTN_CANCEL
PSBTN_HELP
void RemovePage(CPropertyPage *pPage);
void RemovePage(int nPage); 删除某属性页
void SetWizardMode(); 设置属性页对话框为向导对话框模式
void SetWizardButtons(DWORD dwFlags); 设置向导按钮 PSWIZB_NEXT, PSWIZB_BACK, PSWIZB_FINISH
void SetFinishText(LPCTSTR lpszText);
9 向导对话框的创建及显示
a. 创建属性页对话框资源
Resource View->Dialog->Insert Dialog
ID:IDD_SUMMAND_PAGE Caption:被加数页 style:ChildBorder:Thin
ID:IDD_ADDEND_PAGE Caption:被加数页style:Child Border:Thin
ID:IDD_ADD_PAGE Caption:被加数页style:Child Border:Thin
b. 创建属性页
创建属性页类:右击属性页对话框,选择“Add Class”
“下一步”按钮添加方法:Class View->Additon->CSummandPage->右击->选择属性->按下“overrides”按钮->找到OnSetActive
c. 创建属性表类
Solution ExploreràAddtionàAdd ClassàMFC ClassàAdd
# #include "SummandPage.h"
CSummandPage summandPage;
AddPage(&m_summandPage);
d. 显示向导对话框
在加法计算器对话框中添加使用说明IDC_INSTRUCT_BUTTON按钮,为IDC_INSTRUCT_BUTTON按钮添加点击消息的处理函数OnBnClickedInstructButton
// 创建属性表对象
CAddSheet sheet(_T(""));
// 设置属性对话框为向导对话框
sheet.SetWizardMode();
// 打开模态向导对话框
sheet.DoModal();
10 一般属性对话框的创建及显示
11 消息对话框
a. MessageBox
int MessageBox(
LPCTSTR lpszText, //需要显示的消息字符串
LPCTSTR lpszCaption=NULL, //消息对话框的标题字符串
UINT nType=MB_OK); //消息对话框的风格和属性,MB_OKCANCEL | MB_ICONQUESTION
nType 取值 | 参数说明 |
MB_ABORTRETRY | 有“终止”、“重试”和“忽略”按钮 |
MB_OK | 有“确定”按钮 |
MB_OKCANCEL | 有“确定”和“取消”按钮 |
MB_RETRYCANCEL | 有“重试”和“取消”按钮 |
MB_YESNO | 有“是”和“否”按钮 |
MB_YESNOCANCEL | 有“是”、“否”和“取消”按钮 |
nType 取值 | 显示图标 |
MB_ICONEXCLAMTION | |
MB_ICONASTERISK | |
MB_ICONQUESTION | |
MB_ICONHAND |
b. AfxMessageBox
int AfxMessageBox(
LPCTSTR lpszText,
UINT nType=MB_OK,
UINT nIDHelp=0 //此消息的帮助的上下文ID
);
c. 返回值
IDABORT:终止
IDCANCEL:取消
IDIGNORE:忽略
IDNO:否
IDOK:确定
IDRETRY:重试
IDYES:是
12 文件对话框
例子:Example17
a. 成员变量
explicit CFileDialog(
BOOL bOpenFileDialog, //对话框类型,TRUE:打开文件对话框 FALSE:保存文件对话框
LPCTSTR lpszDefExt = NULL, //默认的文件扩展名
LPCTSTR lpszFileName = NULL, //初始文件名
DWORD dwFlags =OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, //文件对话框的属性
LPCTSTR lpszFilter = NULL, //文件过滤器,
CWnd *pParentWnd = NULL, //文件对话框的父窗口的指针
DWORD dwSize = 0, //OPENFILENAME结构体的大小
BOOL bVistaStyle = TRUE //指定文件对话框的风格,TRUE:Vista风格
);
OFN_HIDEREADONLY:隐藏只读选项
OFN_OVERWRITEPROMPT:弹出文件覆盖选择选项
static TCHAR BASED_CODEszFilter[] = _T("Chart Files (*.xlc)|*.xlc|Worksheet Files(*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files(*.*)|*.*||");
// 打开文件对话框
CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, szFilter, this);
// 保存文件对话框
CFileDialog fileDlg(FALSE, _T("txt"),_T("my"), OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilter, this);
b. 成员函数
GetFileExt()
GetFileName()
GetFileTitle()
GetFolderPath()
GetNextPathName()
GetPathName()
GetReadOnlyPref()
GetStartPosition()
13 字体对话框
例子:Example18 TestCtrl
CFontDialog(
LPLOGFONT lplflnitial = NULL, //字体特征
DWORD dwFlags = CF_EFFECTS|CF_SCREENFONTS, //选择字体的一个或多个属性
CDC* pdcPrinter = NULL, //指向一个打印设备上下文的指针
CWnd *pParentWnd = NULL //指向字体对话框父窗口的指针
);
typedef struct tagLOGFONT {
LONG lfHeight; //高度
LONG lfWidth; //宽度
LONG lfEscapement;
LONG lfOrientation; //方向
LONG lfWeight; //粗细
BYTE lfItalic; //倾斜
BYTE lfUnderline; //下划线
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE]; //字体名
} LOGFONT;
typedef struct {
DWORD lStructSize;
HWND hwndOwner;
HDC hDC;
LPLOGFONT lpLogFont;
INT iPointSize;
DWORD Flags;
COLORREF rgbColors;
LPARAM lCustData;
LPCFHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
HINSTANCE hInstance;
LPTSTR lpszStyle;
WORD nFontType;
INT nSizeMin;
INT nSizeMax;
} CHOOSEFONT, *LPCHOOSEFONT;
CFont m_font;
LOGFONT lf;
CFontDialog fontdlg(&lf);
m_font.CreateFontIndirect(fontdlg.m_cf.lpLogFont);
14 颜色对话框
例子:Example19
a. 成员变量
CColorDialog(
COLORREFclrInit = 0, //默认选择颜色的颜色值
DWORDdwFlags = 0, //自定义颜色对话框功能和外观的属性值
CWnd*pParentWnd = NULL //颜色对话框的父窗口的指针
);
b. 成员函数
COLORREF GetColor() const; //返回所选颜色的COLORREF值
BYTE GetRValue(DWORD rgb);
BYTE GetGValue(DWORD rgb);
BYTE GetBValue(DWORD rgb);