按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
■ CC_PREVENTFULLOPEN——禁止“规定自定义颜色”按钮,也就是说不允许用户展开对话框的扩展部分。
■ CC_RGBINIT——对话框显示的时候用rgbResult字段的值初始化选择框中的颜色。
如果用户单击“确定”按钮,函数返回TRUE,否则函数返回FALSE。读者可以在例子文件中的_ChooseColor子程序中找到使用这个函数的详细代码。
使用ChooseColor函数要注意的是:lpCustColors指针不能为NULL,所以必须分配一个16个双字长度缓冲区,如果指针是NULL会导致函数违规访问00000000h处的内存,就等着看“非法操作”吧!
8。2。4 查找和替换文本对话框
查找文本对话框如图8。4的上图所示,替换文本对话框如图8。4的下图所示,要显示这两种通用对话框可分别使用FindText和ReplaceText函数:
invoke FindText,lpfr
invoke ReplaceText,lpfr
图8。4 查找和替换对话框
这两个函数都使用同样的FINDREPLACE结构:
FINDREPLACEA STRUCT
LStructSize DWORD ? ;结构长度
HwndOwner DWORD ? ;所属窗口
HInstance DWORD ?
Flags DWORD ? ;标志
LpstrFindWhat DWORD ? ;查找字符串
LpstrReplaceWith DWORD ? ;替换字符串
WFindWhatLen WORD ? ;查找字符串长度
WReplaceWithLen WORD ? ;替换字符串长度
LCustData DWORD ?
LpfnHook DWORD ?
LpTemplateName DWORD ?
FINDREPLACEA ENDS
FINDREPLACE equ
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第8章 通用对话框
8。2 使用通用对话框(3)
结构中关键的字段说明如下。
● Flags——标志,创建对话框的时候,函数根据标志中的数值初始化对话框中各控件的状态,返回的时候根据用户的选择来设置标志字段的内容,标志字段可以是以下取值的组合:
■ FR_FINDNEXT,FR_REPLACE,FR_REPLACEALL,FR_DIALOGTERM——分别表示用户单击了“查找下一个”、“替换”、“全部替换”和“取消”按钮。
■ FR_HIDEUPDOWN,FR_HIDEMATCHCASE与FR_HIDEWHOLEWORD——初始化时使用,表示对话框中不显示“方向”、“区分大小写”与“全字匹配”按钮。
■ FR_NOMATCHCASE,FR_NOUPDOWN与FR_NOWHOLEWORD——初始化时将 “区分大小写”、“方向”与“全字匹配”按钮灰化。
■ FR_MATCHCASE或FR_WHOLEWORD——表示用户选中了“区分大小写”或“全字匹配”复选框。
■ FR_DOWN——把“方向”单选钮设置为“向下”。
● lpstrFindWhat——指向包含查找字符串的指针,缓冲区的长度必须至少为80 B,这个字符串在初始化的时候出现在“查找内容”编辑框中,函数也在这里返回用户输入的内容。
● lpstrReplaceWith——指向包含替换字符串的指针,这个字符串在初始化的时候出现在“替换为”编辑框中,函数也在这里返回用户输入的内容。这个字段在使用FindText函数的时候可以为NULL,但在使用ReplaceText函数的时候必须设置,否则对话框不会显示。
● wFindWhatLen和wReplaceWithLen——lpstrFindWhat和lpstrReplaceWith指示缓存区的长度。
查找和替换通用对话框的使用有些特殊,因为这两种对话框是非模态对话框,也就是说,FindText和ReplaceText函数被调用后,系统显示对话框后马上返回,对话框保持显示状态,直到用户按下了“取消”按钮后对话框才关闭。如果用户按下了对话框中的某个按钮,对话框设置FINDREPLACE结构的相关字段并通过自定义的消息通知父窗口的窗口过程,程序中处理查找和替换的功能集中在这个自定义消息中完成。另外,由于对话框必须向父窗口发送消息,所以hwndOwner字段中必须指定父窗口的句柄,而不能像其他通用对话框一样可以把hwndOwner字段设置为NULL。
为了让对话框能够使用自定义消息,程序必须首先使用RegisterWindowMessage函数注册自定义消息,这个函数注册消息并返回消息ID,输入的参数是消息名称字符串,Microsoft的编程手册中说明要为查找和替换对话框注册FINDMSGSTRING消息,但没有任何资料说明FINDMSGSTRING究竟代表什么,是代表消息名称字符串为“FINDMSGSTRING”吗?不是,实际上它代表字符串“mdlg_FindReplace”,所以,在对话框的初始化消息中如下注册消息:
idFindMessage dd ?
FINDMSGSTRING db 'mdlg_FindReplace';0
。。。
invoke RegisterWindowMessage;addr FINDMSGSTRING
mov idFindMessage;eax
注意:要把RegisterWindowMessage函数返回的消息ID保存下来,并在主窗口的消息循环中通过判断uMsg是否等于这个消息ID来判断对话框是否发回消息:
mov eax;uMsg
。if eax WM_XXX
。。。
。elseif eax idFindMessage
。if stFind。Flags & FR_DIALOGTERM
;用户按下了“取消”按钮,对话框关闭
。elseif stFind。Flags & FR_FINDNEXT
;用户按下了“查找下一个”按钮
。elseif stFind。Flags & FR_REPLACE
;用户按下了“替换”按钮
。elseif stFind。Flags & FR_REPLACEALL
;用户按下了“全部替换”按钮
。endif
由于用户按下了“查找下一个”、“替换”、“全部替换”和“取消”等按钮时,对话框都要发回消息,所以在处理时还要根据不同的标志进行不同的处理。
因为查找和替换对话框是非模态对话框,所以使用时要把FINDREPLACE结构和字符串变量放在全局变量中,如果放在局部变量中,对话框还没有关闭的情况下,这些局部变量就已经被释放,以后对话框存取的就会是无效的地址。
8。2。5 页面设置对话框
页面设置对话框用来设置打印机参数,用户可以在对话框中选择打印机、打印纸张大小、页边距和纸张方向,还可以引出一个打印机属性的设置对话框。用户可以在这里完成与打印有关的所有设置工作,页面设置对话框如图8。5所示。
显示页面设置对话框使用PageSetupDlg函数:
invoke PageSetupDlg,lppsd
图8。5 页面设置对话框
lppsd参数指向一个PAGESETUPDLG结构:
PAGESETUPDLGA STRUCT
LStructSize DWORD ? ;结构长度
HwndOwner DWORD ? ;所属窗口
HDevMode DWORD ? ;指向DEVMODE结构
HDevNames DWORD ? ;指向DEVNAMES结构
Flags DWORD ? ;标志
PtPaperSize POINT ;返回纸张尺寸
RtMinMargin RECT ;返回最小允许的页边距
RtMargin RECT ;返回用户选择的页边距
HInstance DWORD ?
LCustData DWORD ?
LpfnPageSetupHook DWORD ?
LpfnPagePaintHook DWORD ?
LpPageSetupTemplateName DWORD ?
HPageSetupTemplate DWORD ?
PAGESETUPDLGA ENDS
结构中的有关字段说明如下。
● hDevMode—如果用户选择了打印机,那么这里返回一个指针,指向包含DEVMODE结构的内存块地址,DEVMODE结构中包含了打印机的名称。
● hDevNames—如果用户选择了打印机,那么这里返回一个指针,指向包含DEVNAMES结构的内存块的地址,DEVNAMES结构包含了打印机的各种属性。
● Flags—标志,可以是以下取值的组合:
● PSD_DEFAULTMINMARGINS—将页边距设置为打印机允许的最小页边距。
■ PSD_DISABLEMARGINS,PSD_DISABLEORIENTATION和PSD_DISABLEPAPER—灰化页边距设置输入框、纸张方向选择框和纸张选择框。
■ PSD_DISABLEPAGEPAINTING—不绘画最上方的打印示例图示。
■ PSD_DISABLEPRINTER—灰化“打印机”按钮。
■ PSD_MARGINS—函数用rtMargin字段的值初始化对话框中的数值。
■ PSD_RETURNDEFAULT—函数不显示对话框,马上返回并在hDevNames和hDevMode字段中返回默认打印机的设置情况。
■ PSD_INTHOUSANDTHSOFINCHES和PSD_INHUNDREDTHSOFMILLIMETERS—指明ptPagerSize,rtMinMargen与rtMargin等字段使用的单位是英寸还是毫米。
● ptPaperSize—一个POINT结构,返回纸张大小。
● rtMinMargin—打印机允许的最小页边距。
● rtMargin—用户选择的页边距数据。
当用户选择了打印机时,hDevMode中返回的是一个指向内存块的指针,所以需要用下面的代码获取DEVMODE结构的地址:
mov eax;@stPS。hDevMode
mov eax;'eax' ;现在eax是DEVMODE结构的地址
总结通用对话框的使用方法可以发现,每种通用对话框函数都使用一个特定的结构来当做输入输出的缓冲区,初始化的时候函数根据结构中的数据和标志设置对话框中的子窗口控件,返回的时候在结构的相应位置返回用户的输入或选择。另外,所有结构都有几个类似的字段,如lStructSize字段必须设置为正确的结构长度;hwndOwner指定对话框的父窗口,模态对话框在关闭之前是不允许切换到这个父窗口中去的。
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第8章 通用对话框
8。3 浏览目录对话框(1)
8。3。1 浏览目录对话框简介
在众多的系统提供的对话框中,还有一个很常用的浏览目录对话框,对话框如图8。6所示,这个对话框虽然也是通用型的,但是它是由Shell32。dll提供的,而不是由dlg32。dll提供的,在实现的方法上也和上面介绍的通用对话框有很大的不同,本节以一个例子来演示它的使用。
图8。6 浏览目录对话框
例子程序的源代码位于所附光盘的Chapter08BrowseFolder目录中,目录中包含了BrowseFolder。asm文件和_BrowseFolder。asm文件。BrowseFolder。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 shell32。inc
includelib shell32。lib
include ole32。inc
includelib ole32。lib
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 数据段
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
。data?
szPath db MAX_PATH dup (?)
。data
szSelect db '您选择的目录';0
szNoSelect db '您按下了取消键';0
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 代码段
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
de
include _BrowseFolder。asm
start:
invoke GetCurrentDirectory;sizeof szPath;addr szPath
invoke _BrowseFolder;NULL;addr szPath
。if eax
invoke MessageBox;NULL;offset szPath;
offset szSelect;MB_OK
。else
invoke MessageBox;NULL;offset szNoSelect;NULL;MB_OK
。endif
invoke ExitProcess;NULL
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
end start
该文件仅包含几句调用和显示结果的代码,全部的功能集中在_BrowseFolder。asm中,用include语句包含进主文件中,这样安排代码的原因是目录浏览对话框的实现比较复杂,把功能模块写成一个单独的文件可以便于在其他文件中引用,读者也可以直接把这个源文件不加修改地用在其他地方。_BrowseFolder。asm文件的内容如下:
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; IUnknown 接口定义
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
externdef IID_IUnknown:IID
LPUNKNOWN typedef DWORD
LPPUNKNOWN typedef ptr LPUNKNOWN
IUnknown_QueryInterfaceProto typedef proto :DWORD; :DWORD; :DWORD
IUnknown_AddRefProto typedef proto :DWORD
IUnknown_ReleaseProto typedef proto :DWORD
IUnknown_QueryInterface typedef ptr IUnknown_QueryInterfaceProto
IUnknown_AddRef typedef ptr IUnknown_AddRefProto
IUnknown_Release typedef ptr IUnknown_ReleaseProto
IUnknown struct DWORD
QueryInterface IUnknown_QueryInterface ?
AddRef IUnknown_AddRef ?
Release IUnknown_Release ?
IUnknown ends
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
;IMalloc 接口定义
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
externdef IID_IMalloc:IID
LPMALLOC typedef DWORD
LPPMALLOC typedef ptr LPMALLOC
IMalloc_AllocProto typedef proto :DWORD; :DWORD
IMalloc_ReallocProto typedef proto :DWORD; :DWORD;:DWORD
IMalloc_FreeProto typedef proto :DWORD; :DWORD
IMalloc_GetSizeProto typedef proto :DWORD; :DWORD
IMalloc_DidAllocProto typedef proto :DWORD; :DWORD
IMalloc_HeapMinimizeProto typedef proto :DWORD
IMalloc_Alloc typedef ptr IMalloc_AllocProto
IMalloc_Realloc typedef ptr IMalloc_ReallocProto
IMalloc_Free typedef ptr IMalloc_FreeProto
IMalloc_GetSize typedef ptr IMalloc_GetSizeProto
IMalloc_DidAlloc