WIN32汇编语言教程:第08章 通用对话框 · 8.1 通用对话框简介
Windows操作系统为一些常用功能提供了一些通用对话框(Common Dialog Box),比如在不同的应用程序中进行打开文件、选择字体、选择颜色等操作时,不同程序显示的对话框的模样都是一样的。另外,把同样的应用程序放到不同版本的Windows下执行就会发现,这些对话框会随着操作系统版本的不同而不同,如图8.1所示,选择同样的“打开”文件菜单项时,在Windows XP下显示的对话框是左边的样子,而在Windows 98下显示的是右边的样子,但程序中并没有为不同版本的操作系统设计不同的对话框。造成这些现象的原因就是这些对话框是操作系统提供的,实现对话框的代码包括在Comdlg32.dll库文件中,由于不同版本的Comdlg32.dll在设计上可能有所不同,所以不同版本Windows下的对话框会有所不同。
图8.1 不同操作系统下的“打开”文件对话框
8.1 通用对话框简介
通用对话框函数由Comdlg32.dll提供,所以在使用之前需要在源程序中包含相应的include和includelib语句:
include comdlg32.inc includelib comdlg32.lib
Windows提供多种通用对话框,每种通用对话框都使用一个专用的函数来创建和显示,另外,提供一个数据结构供初始化对话框使用,并在同一个数据结构中返回用户在对话框中输入的数据。使用这些对话框是很简单的,只需要填写结构中的初始化数据,然后调用函数并把结构地址传入就可以了。
Comdlg32.dll中提供的通用对话框如表8.1所示,表中还包括创建这些对话框使用的函数以及数据结构名称。
表8.1 通用对话框列表
通用对话框 | 使 用 函 数 | 使用数据结构 |
选择颜色 | ChooseColor | CHOOSECOLOR |
查找字符串 | FindText | FINDREPLACE |
替换字符串 | ReplaceText | FINDREPLACE |
选择字体 | ChooseFont | CHOOSEFONT |
打开文件 | GetOpenFileName | OPENFILENAME |
保存文件 | GetSaveFileName | OPENFILENAME |
页面设置 | PageSetupDlg | PAGESETUPDLG |
在这些对话框中,查找字符串和替换字符串的对话框是非模态的,方便用户在查找到一个字符串以后,不必关闭对话框就可以继续查找另一个字符串,其他的对话框都是模态对话框。通用对话框使用的例子可以参考所附光盘的Chapter08\CommDlg目录中的代码,包括汇编源代码CommDlg.asm和资源脚本文件CommDlg.rc。CommDlg.asm文件的内容如下:
.386 .model flat, stdcall option casemap :none ;#################################################################### ; Include 文件定义 ;#################################################################### include windows.inc` include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include Comdlg32.inc includelib Comdlg32.lib ;#################################################################### ; Equ 等值定义 ;#################################################################### ICO_MAIN equ 1000 DLG_MAIN equ 1000 IDM_MAIN equ 1000 IDM_OPEN equ 1101 IDM_SAVEAS equ 1102 IDM_PAGESETUP equ 1103 IDM_EXIT equ 1104 IDM_FIND equ 1201 IDM_REPLACE equ 1202 IDM_SELFONT equ 1203 IDM_SELCOLOR equ 1204 ;#################################################################### ; 数据段 ;#################################################################### .data? hInstance dd ? hWinMain dd ? dwFontColor dd ? dwBackColor dd ? dwCustColors dd 16 dup (?) stLogFont LOGFONT <?> szFileName db MAX_PATH dup (?) szBuffer db 1024 dup (?) ;******************************************************************** ; 查找替换对话框使用 ;******************************************************************** idFindMessage dd ? stFind FINDREPLACE <?> szFindText db 100 dup (?) szReplaceText db 100 dup (?) .const FINDMSGSTRING db 'commdlg_FindReplace',0 szSaveCaption db '请输入保存的文件名',0 szFormatColor db '您选择的颜色值:%08x',0 szFormatFont db '您的选择:',0dh,0ah,'字体名称:%s',0dh,0ah db '字体颜色值:%08x,字体大小:%d',0 szFormatFind db '您按下了“%s”按钮',0dh,0ah,'查找字符串:%s',0dh,0ah db '替换字符串:%s',0 szFormatPrt db '您选择的打印机:%s',0 szCaption db '执行结果',0 szFindNext db '查找下一个',0 szReplace db '替换',0 szReplaceAll db '全部替换',0 szFilter db 'Text Files(*.txt)',0,'*.txt',0 db 'All Files(*.*)',0,'*.*',0,0 szDefExt db 'txt',0 ;#################################################################### ; 代码段 ;#################################################################### .code ;#################################################################### ; 页面设置对话框 ;#################################################################### _PageSetup proc local @stPS:PAGESETUPDLG