⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 008.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 4 页
字号:

  Flags DWORD   ? ;标志

  RgbColors DWORD   ? ;选择的字体颜色

  LCustData DWORD   ?

  LpfnHook   DWORD   ?

  LpTemplateName   DWORD   ?

  HInstance DWORD   ?

  LpszStyle DWORD   ?

  NFontType WORD ?

  Alignment WORD ?

  NSizeMin   DWORD   ?

  NSizeMax   DWORD   ?

CHOOSEFONTA ENDS

 
       


8.2 使用通用对话框(2)

结构中一些重要的字段含义如下:

● hDC——当Flags字段中指定CF_PRINTERFONTS标志时,它是打印机的DC句柄。

● lpLogFont——指向一个包含LOGFONT结构的缓冲区。LOGFONT结构可以用来指定字体的名称和属性。如果Flags字段中指定CF_INITTOLOGFONTSTRUCT标志的话,对话框将根据这个结构初始化对话框,函数也在这里返回用户选择的字体名称。

● iPointSize——返回用户选择的字体大小,单位是1/10磅。

● rgbColors——如果Flags字段的CF_EFFECTS标志被设置,对话框将根据这个数值初始化“颜色”下拉式列表框。另外,函数返回时在这里返回用户选择的字体颜色。

● nFontType—返回用户选择的字体是属于哪一类的,可能返回的值有BOLD_FONTTYPE,ITALIC_FONTTYPE,PRINTER_FONTTYPE,REGULAR_FONTTYPE和SCREEN_FONTTYPE等。

另一个关键的字段是Flags字段,Flags字段的初始值决定了对话框的不同行为,函数返回的时候也会在这里返回一些用户的选择,它可以是下面取值的组合:

● CF_BOTH——对话框同时列出打印机字体和屏幕字体。

● CF_TTONLY——对话框只列出TrueType字体。

● CF_EFFECTS——对话框中显示“效果”复选框。

● CF_FIXEDPITCHONLY——对话框的字体列表中只显示等宽字体。

● CF_LIMITSIZE——对话框显示的字体尺寸限于nSizeMin和nSizeMax字段指定的数值之间。

● CF_NOSTYLESEL——对话框中不显示“字形”组合列表框。

● CF_NOSIZESEL——对话框中不显示“大小”组合列表框。

● CF_SCREENFONTS——字体列表中只显示屏幕字体。

调用ChooseFont函数时,函数会停留直到对话框关闭为止,当用户单击了对话框中的 “确定”按钮时,函数返回TRUE,用户单击“取消”按钮退出时,函数返回FALSE。具体的使用例子可以参考例子中的_ChooseFont子程序。

在调用ChooseFont之前,lpLogFont字段被指向一个LOGFONT结构,对话框关闭的时候,函数在LOGFONT结构的lfFaceName字段中返回字体的名称,字体的效果和字形也在LOGFONT结构中返回。

用户选择的颜色在rgbColors 字段中返回,字体大小在iPointSize字段中返回,由于单位是1/10磅,所以返回的数值等于对话框中选择的字体大小乘以10。

8.2.3  选择颜色对话框

选择颜色对话框如图8.3所示,左边是基本的选择系统预定义颜色的区域,右边是扩展的区域,可以由用户自己选择或输入颜色值。



图8.3  选择颜色对话框

打开选择颜色对话框使用函数ChooseColor:

invoke  ChooseFont,lpcc

lpcc指向一个CHOOSECOLOR结构,这个结构是这样定义的:

CHOOSECOLORA STRUCT

  LStructSize   DWORD ? ;结构长度

  HwndOwner   DWORD ? ;所属窗口

  HInstance   DWORD ?

  RgbResult   DWORD ? ;用户选择的颜色值

  LpCustColors DWORD ? ;用户自定义颜色缓冲区

  Flags   DWORD ? ;标志

  LCustData   DWORD ?

  LpfnHook DWORD ?

  LpTemplateName DWORD ?

CHOOSECOLORA ENDS

结构中几个重要的字段说明如下。

● rgbResult——如果Flags字段指定了CC_RGBINIT标志,那么创建对话框的时候使用这个字段来初始化选择框中的颜色;函数返回的时候在这里返回用户选择的颜色。

● lpCustColors——指向一个16个双字长度的缓冲区,定义16种自定义颜色。

● Flags——标志,可以是下面取值的组合:

■ CC_FULLOPEN——对话框显示右边的扩展部分,如果不指定这个标志,初始化的时候扩展部分不显示,但用户可以通过单击“规定自定义颜色”按钮将对话框展开。

■ 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.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”吗?不是,实际上它代表字符串“commdlg_FindReplace”,所以,在对话框的初始化消息中如下注册消息:

idFindMessage   dd   ?

FINDMSGSTRING   db   ~commdlg_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.3 浏览目录对话框(1)

8.3.1  浏览目录对话框简介 
在众多的系统提供的对话框中,还有一个很常用的浏览目录对话框,对话框如图8.6所示,这个对话框虽然也是通用型的,但是它是由Shell32.dll提供的,而不是由Comdlg32.dll提供的,在实现的方法上也和上面介绍的通用对话框有很大的不同,本节以一个例子来演示它的使用。



图8.6  浏览目录对话框

例子程序的源代码位于所附光盘的Chapter08\BrowseFolder目录中,目录中包含了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

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 代码段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.code

 

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文件的内容如下:

 

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -