windows程序设计第十讲对话框

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

非模态对话框
允许在对话框和创建对话框的窗口之间 进行切换 可以与父窗口之间进行动态交互

非模态对话框的内部实现原理
CreateDialog //#define CreateDialog… CreateDialogParam… CreateDialogParam FindResource //在exe文件中查找并定位对话 //框模板 LoadResource CreateDialogIndirectParam //根据内存块中的对话框模 //板创建父、子窗口 FreeResource 返回创建的对话框窗口句柄 //注意与模态对话框的区别
对话框的创建
首先创建对话框窗口 然后根据一定的次序调用 CreateWindowEx分别创建内部子控件 由于子控件的创建必须指定其在对话框 中的位置以及正确的窗口类别、标题等 信息,给程序员内部动态创建带来一定 的复杂性 VC++提供的对话框编辑器,给我们提供 了设计子窗口的便利工具

结束对话框 EndDialog()
结束对话框 DestroyWindow()
COLOR2
实例 源码

资源文件
COLORSCRDLG DIALOG DISCARDABLE 16, 16, 120, 141 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION "Color Scroll Scrollbars" FONT 8, "MS Sans Serif" BEGIN CTEXT "&Red",IDC_STATIC,8,8,24,8,NOT WS_GROUP SCROLLBAR 10,8,20,24,100,SBS_VERT | WS_TABSTOP CTEXT "0",13,8,124,24,8,NOT WS_GROUP CTEXT "&Green",IDC_STATIC,48,8,24,8,NOT WS_GROUP SCROLLBAR 11,48,20,24,100,SBS_VERT | WS_TABSTOP CTEXT "0",14,48,124,24,8,NOT WS_GROUP CTEXT "&Blue",IDC_STATIC,89,8,24,8,NOT WS_GROUP SCROLLBAR 12,89,20,24,100,SBS_VERT | WS_TABSTOP CTEXT "0",15,89,124,24,8,NOT WS_GROUP END
– 字体—— – 颜色——

在调用对应的API之前,需要设置对应的结构,并把 它们作为参数传递到API中
– 通用成员: 窗口(拥有者)句柄、实例句柄 – 特有成员: 各种对话框特定信息,如打开关闭对话框,需要设置接收完 整文件名缓冲区、长度,文件名缓冲区、长度,过滤器等
通用对话框定制
实例 实现
非模态对话框的销毁
case WM_CLOSE: DestroyWindow(); hDlgModeless = NULL; break;
模态对话框与非模态对话框的 区别
模态 DialogBox 不允许在同一应用程序 的窗口之间切换 对话框消息不经过应用 程序消息队列 非模态 CreateDialog 允许在同一应用程序的 窗口之间切换 对话框消息经过应用程序 消息队列
通用对话框的基本使用方法

对于每种对话框,都有对应的使用结构
– 打开与关闭—— – 查找与替换—— – 页面设置—— – 打印—— OPENFILENAME、OFNOTIFY FINDREPLACE PAGESETUPDLG PRINTDLG、PRINTDLGEX、 PRINTPAGERANGE CHOOSEFONT CHOOSECOLOR

– 处理所有消息
About2
实例 源码

About3
实例 源码

资源文件
ABOUTBOX DIALOG DISCARDABLE 32, 32, 180, 100 STYLE DS_MODALFRAME | WS_POPUP FONT 8, "MS Sans Serif" BEGIN CONTROL "OK",IDOK,"EllipPush",WS_GROUP | WS_TABSTOP,73,79,32,14 ICON "ABOUT3",IDC_STATIC,7,7,20,20 CTEXT "About3",IDC_STATIC,40,12,100,8 CTEXT "About Box Demo Program",IDC_STATIC,7,40,166,8 CTEXT "(c) Charles Petzold, 1998",IDC_STATIC,7,52,166,8 END
深入学习
www.ReactOS.org ReactOS aims to achieve complete binary compatibility with both applications and device drivers meant for NT and XP operating systems, by using a similar architecture and providing a complete and equivalent public interface. Although Free Software advocates agree that free software operating systems improve the state of the art by fostering competition, ReactOS has practical benefit for others, too; ReactOS is the most
修改创建此对话框线程的消息环
while(GetMessage(&msg, NULL, 0, 0)) { if (hDlgModeless == 0 && !IsDialogMessage(hDlgModeless, &msg)) { if(!TranslateAccelerator(hwnd, hAccel, &msg)) TranslateMessage(&msg); DispatchMessage(& } }
complete working model of a Windows® like operating system available. Consequently, working programmers will learn a great deal by studying ReactOS source code and even participating in ReactOS development.
自定义对话框窗口类
HEXCALC 源码

通用对话框
为实现标准用户界面,提供统一、通用 的功能,而实现的一组增强对话框 开发人员可以根据应用程序的特点,对 已有的这些通用对话框进行定制扩展

通用对话框的种类
打开—— GetOpenFileName() 保存—— GetSaveFileName() 查找—— FindText() 替换—— ReplaceText() 页面设置——PageSetupDlg() 打印—— PrintDlg()、PrintDlgEx() 字体—— ChooseColor() 颜色—— ChooseFont()
对话框
对话框

包含多种子窗口控件的弹出式窗口,这 些控件的大小和位置通常在程序资源描 述文件的“对话框模板”中指定。一般 来说,除了在创建对话框时初始化子窗 口控件,处理来自它们的消息以及结束 对话框之外,不需要再给对话框过程增 加其它功能,对话框过程通常不处理 WM_PAINT、WM_DESTROY消息,不 接受WM_CREATE消息,而是在 WM_INITDIALOG消息中执行初始化操 作;也不处理键盘和鼠标的输入。

– 建立定制扩展对话框 – 设置此种对话框的对应结构 如打开文件对话框,需要设置如下结构: ofn.Flags = OFN_ENABLEHOOK | OFN_EXPLORER | OFN_ENABLETEMPLATE; ofn.lpfnHook = MyDlgProc ; ofn.lpTemplateName = MAKEINTRESOURCE(OPENEXTEND) ; – 实现MyDlgProc窗口过程
来自百度文库
对话框的扩展属性

风格
– WS_CAPTION、WS_SYSMENU、 WS_THICKFRAME、DS_3DLOOK、 DS_CENTER、DS_CONTEXTHELP、 WS_MINIMIZEBOX、WS_MAXIMIZEBOX、 WS_VSCROLL、WS_HSCROLL
菜单 CLASSNAME
分类
模态对话框 非模态对话框 通用对话框

模态对话框
About1 源码

模态对话框的内部实现原理
DialogBox //#define DialogBox… DialogBoxParam… DialogBoxParam 逐层向上查找祖先窗口,直到找到一个具有popup或overlapped风格的窗 口作为父窗口 禁用父窗口 //父窗口不再处理鼠标和键盘消息 CreateDialogParam //创建模态对话框(父、子窗口) SetWindowWord(hwndDlg, DWL_ENDDIALOGCALLED, FALSE);//设置 私有数据 while(!GetWindowWord(hwndDlg, DWL_ENDDIALOGCALLED)) { //有 自己的消息环 GetMessage(&msg, NULL, 0, 0); if (!IsDialogMessage(hwndDlg, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } DestroyWindow(hwndDlg); //销毁窗口
结束模态对话框
EndDialog 获取父窗口句柄 启用父窗口
//父窗口继续处理鼠标 和键盘消息
SetWindowLong(hwnd, DWL_ENDDIALOGCALLED, TRUE); //设置私有数据 SetWindowLong(hwnd, DWL_DLGRESULT, nResult); //设置返回值
相关文档
最新文档