友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
八万小说网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

windows环境下32位汇编语言程序设计-第37部分

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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              
返回目录 上一页 下一页 回到顶部 7 6
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!