第6章 最简单的界面化程序——对话框
来源:互联网 发布:顽固软件卸载 编辑:程序博客网 时间:2024/06/15 12:45
创建对话框应用程序
- CTest6_1App:为程序运行的基础,它使程序在Windows下可以运行多个实例。
- CTest6_1Dlg:是对话框类。
- MFC AppWizard(exe) —— test6_1 —— 对话框 —— 默认下一步
创建对话框
如果应用程序不止一个对话框时,则需要手动创建对话框。
- 工作环境中的Resource View面板,右击Dialog,然后选择插入Dialog
- 利用MFC ClassWizard可以实现创建对话框资源所对应的类。右击对话框标题栏,建立类向导,选择创建new class。
- new class 对话框,输入类名dlg1,确定,确定。class面板就多了一个类。
使用模态对话框
- 模态对话框始终占据焦点,不关闭,其他程序无法进行。
- 模态对话框利用对话框类DoModal函数实现。IDOK或INCANCEL
- View|ClassWizard命令,选择IDOK、BN_CLICKED、Add Member Function。
- 在CTest6_1Dlg::OnOk,添加代码
- 在test6_1Dlg.cpp前添加头文件
dlg1 test; int result=test.DoModal(); if(result==IDOK) AfxMessageBox("单击确定"); else AfxMessageBox("单机取消");
使用非模态对话框
- 在类CTest6_1Dlg声明前添加dlg1声明语句。在类CTest6_1中添加变量dlg1 *pdlg;并且在CTest6_1Dlg构造函数初始化为NULL,cpp中添加头文件dlg1.h
class dlg1;//+++声明class CTest6_1Dlg : public CDialog{ ……}
- 同上,代码改一下,屏蔽掉CDialog::OnOK();
// TODO: Add extra validation here if((pdlg!=NULL)&&::IsWindow(pdlg->m_hWnd))//判断对话框是否已经被创建 { AfxMessageBox("对话框已经被创建"); pdlg->ShowWindow(SW_SHOW);//已经被创建,直接显示 } else { pdlg=new dlg1(NULL);//没有被创建,则创建对象 } if(!::IsWindow(pdlg->m_hWnd)) { pdlg->Create(IDD_DIALOG1,NULL);//创建对话框 pdlg->ShowWindow(SW_SHOW);//显示对话框 } //CDialog::OnOK();
- 销毁窗口:在ClassView面板右击dlg1类图标,Add Virtual Function,选择PostNcDestory,单击Add Handler按钮,单击Edit Exiting按钮,添加delete this;屏蔽掉CDialog::PostDestroy();
设置对话框属性
- 标题
- 样式
添加控件变量
- 创建一个对话框程序,放入一个编辑框
- 右击编辑框,选择类向导,Member Variables,Add Variable,名字m_cstring1、value、CString
- 按钮添加消息响应函数
UpdateData(true);//文本框数据和变量进行交互AfxMessageBox(m_cstring1);//输出值CDialog::OnOK();//调用基类的OnOk函数
界面中数据的处理——数据成员和成员函数
数据成员
在应用程序开发中有时需要在类中添加新的变量,在类中添加变量直接打开类文件,然后进行添加就可以了。类的定义都是在.h文件中,可以打开相应的文件查找相应的类,然后在相应的位置添加变量就可以了。但是有时候并不知道一个类到底在那个文件中,实际中常常在ClassView中双击进入。
成员函数
添加成员函数与添加数据成员的方法基本相似。不同之处在于,函数的具体代码一般不在类中直接实现,而是在.c文件中实现。也就是在类中添加函数,在类的外部实现函数代码。
消息处理函数
- 在类CTest6_1中添加函数Button1()声明语句afx_msg void Button1();说明此函数是被消息映射驱动的成员函数
- 按钮名称改为OnButton1
//{{AFX_MSG(CTest6_1Dlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnButton1(); //}}AFX_MSG
- 在test6_1Dlg.cpp中添加ON_BN_CLICKED消息
BEGIN_MESSAGE_MAP(CTest6_1Dlg, CDialog) //{{AFX_MSG_MAP(CTest6_1Dlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1,OnButton1) //}}AFX_MSG_MAPEND_MESSAGE_MAP()
- 在文件test6_1Dlg.cpp中添加函数Button1()的定义
void CTest6_1Dlg::OnButton1(){ AfxMessageBox("laallalal");}
通用对话框
文件对话框
CFileDialog封装了Windows的通用文件对话框,提供了一种简单的方法实现文件的打开和保存对话框。
CFileDialog( BOOL bOpenFileDialog,//true表示打开对话框,flase表示另存为 LPCTSTR lpszDefExt=NULL,//默认文件扩展名,取值为字符串类型 LPCTSTR lpszFileName=NULL,//默认文件名,字符串类型 DwORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,//对话框样式 LPCTSTR lpszFilter = NULL,//过滤掉某些文件 CWnd* pParentWnd = NULL//指向父窗口的指针);/*dwFlags标识:OFN_READONLY:只读方式OFN_OVERWRITEPROMPT:另存为文件存在时提示OFN_HIDEREADONLY:隐藏“只读方式打开文件”的复选框OFN_NOCHANGEDIR:设置路径为固定长度OFN_SHOWHELP:设置一个帮助按钮OFN_ENABLEHOOK:允许对话框使用钩子函数OFN_NOVAlIDATE:允许对话框返回一个带有非法字符的字符串OFN_ALLOWMULTISELECT:运行选择多个文件OFN_PATHMUSTEXIST:用户输入路径信息时,如果不存在路径,则弹出警告OFN_FILEMUSTEXIST:用户只能输入已存在的文件名OFN_CREATEPROMPT:当输入的文件名不存在,则提示新建文件OFN_NOREADDONLYRETURN:对话框不返回只读文件OFN_NOTESTFILECREATE:对话框关闭之前不新建文件OFN_LONGNAMES:允许使用长文件名*/
void CTest6_1Dlg::OnOk(){ static char sfile[]="记事本(*.txt)|*.txt||";//文件过滤器 CFileDialog dlg(TRUE,"txt","",OFN_ALLOWMULTISELECT,sfile); dlg.DoModal();}/*GetPathName():获取文件的完整路径GetFileName():获取文件的文件名GetFileExt():获取文件的扩展名GetFileTitle():获取文件名,不含扩展名GetNextPathName():获取选择文件中下一个文件的路径名*/
字体对话框
CFontDialog( LPLOGFONT lplfInitial = NULL, DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS, CDC* pdcPrinter = NULL, CWnd* pParentWnd = NULL);
void CTest6_1Dlg::OnOk(){ CString fontmessage="";//定义对象,用来保存信息 CFontDialog dlg;//字体对话框对象 if(IDOK==dlg.DoModal())//弹出对话框,是否单击确定 { fontmessage="字体名称:"; fontmessage += dlg.GetFaceName(); if(1 == dlg.IsStrikeOut()) fontmessage += "字体有删除线\n"; else fontmessage +="字体没有删除线\n"; if(1==dlg.IsUnderline()) fontmessage +="字体有下划线\n"; else fontmessage +="字体没有下划线\n"; if(1==dlg.IsBold()) fontmessage +="字体加粗\n"; else fontmessage +="字体没加粗\n"; if(1==dlg.IsItalic()) fontmessage +="字体是斜体\n"; else fontmessage +="字体不是斜体\n"; AfxMessageBox(fontmessage); }}
颜色对话框
CColorDialog( COLORREF clrInit = 0,//初始颜色值 DWORD dwFlags = 0;//对话框样式标志 CWnd* pParentWnd=NULL//指向父窗口的指针);
void CTest6_1Dlg::OnOK(){ CString colormessage=""; COLORREF init(RGB(125,125,0));//定义变量 CColorDialog dlg(init);//定义对象 if(IDOK==dlg.DoModal()) { COLORREF color=dlg.GetColor();//得到颜色变量 colormessage.Format("所选颜色的RGB分别为:(%d,%d,%d)", GetRValue(color),GetGValue(color),GetBValue(color)); AfxMessageBox(colormessage); }}
查找与替换对话框
BOOL Create( BOOL bFindDialogOnly,//true为查找,false为替换 LPCTSTR lpszFindWhat,//设置查找的字符串 LPCTSTR lpszReplaceWith = NULL,//设置替换的字符串 DWORD dwFlags = FR_DOWN,//对话框样式 CWnd* pParentWnd=NULL//父窗口指针);
//在类CTest6_1Dlg中添加一个变量CFindReplaceDialog *pdlg;//并在构造函数中初始化为pdlg=NULL。//按钮映射函数void CTest6_1Dlg::OnButton1(){ //使用非模态,因此需要利用Create函数 if(pdlg!=NULL&&::IsWindow(pdlg->m_hWnd)) pdlg->ShowWindow(SW_SHOW); else { pdlg=new CFindReplaceDialog(); pdlg->m_fr.Flags=pdlg->m_fr.Flags|FR_MATCHCASE|FR_WHOLEWORD; } if(!::IsWindow(pdlg->m_hWnd)) { pdlg->Create(FALSE,"字符串","改变字符串"); pdlg->ShowWindow(SW_SHOW); }}
为响应“查找与替换”的消息,必须手动添加消息映射
- 在CTest6_1Dlg类中添加如下:
//{{AFX_MSG(CTest6_1Dlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ afx_msg LONG OnFindReplace(WPARAM wParamm,LPARAM lParam); //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //}}AFX_MSG DECLARE_MESSAGE_MAP()
- 在CTest6_1Dlg.cpp相应地方添加:
//++++++++++++++++++++++++++++++++++++++++++++++++static UINT WM_FINDREPLACE=::RegisterWindowMessage(FINDMSGSTRING);//++++++++++++++++++++++++++++++++++++++++++++++++BEGIN_MESSAGE_MAP(CTest6_1Dlg, CDialog) //{{AFX_MSG_MAP(CTest6_1Dlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON1,OnButton1) //++++++++++++++++++++++++++++++++++++++++++ ON_REGISTERED_MESSAGE(WM_FINDREPLACE,OnFindReplace)\ //++++++++++++++++++++++++++++++++++++++++ //}}AFX_MSG_MAPEND_MESSAGE_MAP()
- 在CTest6_1Dlg.cpp添加函数:
LONG CTest6_1Dlg::OnFindReplace(WPARAM wParamm,LPARAM lParam){ CString message=""; if(pdlg->FindNext()==true) message+="查找下一个\n"; message+=pdlg->GetFindString(); message+="\n"; message+="替换内容\n"; message+=pdlg->GetReplaceString(); message+="\n"; AfxMessageBox(message); return 0;}
阅读全文
0 0
- 第6章 最简单的界面化程序——对话框
- vs2008最简单的MFC对话框程序
- 最简单的对话框
- 【第6章】最简单的进程
- 黑马程序员——IOS基础---Objective-C第一节课---最简单的OC程序
- Qt学习——简单的对话框程序
- Qt学习——简单的对话框程序
- 16.2 最简单界面程序(1)
- 16.2 最简单界面程序(2)
- 简单的socket测试程序——swing界面
- 简单的Win32对话框程序
- 最简单的程序
- 【第6章】改变最简单进程的特权级
- 【第6章】最简单的系统调用
- JavaScript-1.最简单的程序之网页弹出对话框,显示为Warning---ShinePans
- VC多对话框界面程序,界面之间的切换问题
- VC6在对话框里,给控件加提示TIPS——最简单的方法
- [JS 最简单简洁的插件] 对话框
- gdb
- JAVA动态代理
- 对提升比特币工作量证明速率方法的猜想
- vue学习第16天,渲染
- loj #6164. 「美团 CodeM 初赛 Round A」数列互质(莫队 数据结构 链表hash)
- 第6章 最简单的界面化程序——对话框
- Noip DP 总结 1
- CentOS 7安装Mysql5.6.37
- 离线赛11.3
- Hibernate注解 @Enumerated
- openwrt 编译内核模块中的配置问题
- 解决maven打包Mark invalid异常
- 递归---算法
- DirectX入门之快速开发框架