爱爱小说网 > 其他电子书 > windows环境下32位汇编语言程序设计 >

第42章

windows环境下32位汇编语言程序设计-第42章

小说: windows环境下32位汇编语言程序设计 字数: 每页3500字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




■   BIF_BROWSEFORPRINTER——对话框中只能选择打印机。

■   BIF_BROWSEINCLUDEFILES——同时显示目录中的文件。

■   BIF_RETURNONLYFSDIRS——只返回文件系统中的目录。

■   BIF_STATUSTEXT——对话框中显示一个状态栏。

■   BIF_EDITBOX——显示一个编辑框供用户手工输入目录。

■   BIF_VALIDATE——显示编辑框的时候检测用户输入目录的合法性。

3。 对话框的回调函数

当函数执行后,将显示对话框,当对话框初始化以及每当用户选择不同的目录的时候,函数调用lpfn指定的回调函数,回调函数的参数有4个,分别是父窗口句柄hWnd、消息类型uMsg、消息参数lParam和自定义数据lpData,回调函数的语法如下:

_BrowseFolderCallBack       proc     hWnd;uMsg;lParam;lpData

 

        mov      eax;uMsg

        。if      eax  BFFM_INITIALIZED

                 。。。

        。elseif  eax  BFFM_SELCHANGED

                 。。。

        。endif

        xor      eax;eax

        ret

 

_BrowseFolderCallBack       endp

回调函数可能收到的消息有3种:

●   BFFM_INITIALIZED——在对话框初始化的时候收到。

●   BFFM_SELCHANGED——在用户选择了一个目录的时候收到,这时lParam参数指向一个表示当前被选择目录的ITEMIDLIST结构。

●   BFFM_VALIDATEFAILED——用户输入了一个不合法的目录名。

在回调函数中,程序可以根据情况向对话框发送控制消息,当收到BFFM_SELCHANGED消息时,可以根据选择情况决定是否允许用户单击对话框中的“确定”按钮,通过发送BFFM_ENABLEOK 消息可以控制“确定”按钮的状态:

invoke  SendMessage;hWnd; BFFM_ENABLEOK;0;TRUE  ;允许“确定”按钮

invoke  SendMessage;hWnd; BFFM_ENABLEOK;0;FALSE ;灰化“确定”按钮

程序也可以通过发送BFFM_SETSELECTION消息来设定目录:

invoke  SendMessage;hWnd;BFFM_SETSELECTION;TRUE;lpPath 

如果消息的wParam参数为TRUE,则目录用lParam参数指定的字符串表示;如果wParam为FALSE,则目录用lParam指定的ITEMIDLIST结构表示。由于用字符串表示比较方便,所以例子程序在收到初始化消息的时候用上面的语句设置初始目录。

调用SHBrowseForFolder函数的时候,通过BROWSEINFO结构的pidlRoot字段也可以设置初始目录,但设置ITEMIDLIST结构比较麻烦,所以一般不使用这种方法。

另外,在回调函数中可以通过BFFM_SETSTATUSTEXT消息设置状态栏的文字,对话框的状态栏并不是指一般窗口底部的状态栏,而是指自定义文字下面的那一行文字,在图8。6中就是显示被选择目录名的地方,使用BFFM_SETSTATUSTEXT消息的格式是:

invoke  SendMessage;hWnd;BFFM_SETSTATUSTEXT;0;lpsz

例子程序中,回调函数每次在收到用户选择目录的BFFM_SELCHANGED消息后,在状态栏中显示目录的名称。

4。 获取返回的目录

当SHBrowseForFolder返回的时候,如果用户单击的是“取消”按钮,那么函数的返回值是0,否则的话,函数返回一个指向ITEMIDLIST结构的指针,对于这个结构可以不必去深究,因为使用SHGetPathFromIDList函数可以很方便地将它转换成目录字符串:

invoke  SHGetPathFromIDList;lpItemIDList;addr szPath

函数执行后,szPath中就是字符串格式的用户选择的目录名称了。



 
来源:电子工业出版社 作者:罗云彬 上一页         回书目         下一页          
上一页         回书目         下一页          
  


第9章 通用控件


9。1 通用控件简介(1)

    
9。1。1  通用控件的分类

大部分的通用控件由ctl32。dll模块提供,所以在使用之前要在源程序中包含相应的include和includelib语句:

    include     ctl32。inc

        includelib  ctl32。lib

ctl32。dll中提供的通用控件如表9。1所示。

表9。1  通用控件

控 件 名 称
 预定义的窗口类
 说    明
 特 殊 风 格
 
Animation Controls
 SysAnimate32
 动画
 ACS_
 
Header Controls
 SysHeader32
 标题栏
 HDS_
 
ListView Controls
 SysListView32
 列表视图
 LVS_
 
TreeView Controls
 SysTreeView32
 树型视图
 TVS_
 
Tab Controls
 SysTabControl32
 项目列表
 TCS_
 
Progress Bars
 msctls_progress32
 进度条
  
 

 

 

控 件 名 称
 预定义的窗口类
 说    明
 特 殊 风 格
  
 
 
 Status Windows
 msctls_statusbar32
 状态栏
 SBARS_
 
 
 HotKey Controls
 msctls_hotkey32
 热键
  
 
Trackbars
 msctls_trackbar32
 跟踪条
 TBS_
  
 
Up…Down Controls
 msctls_updown32
 滚动条
 UDS_
  
 
Toolbars
 ToolbarWindow32
 工具栏
 TBSTYLE_
  
 
Tooltip Controls
 Tooltips_class32
 提示文本
  
  
 
ImageLists
  
 图像列表
  
  
 
PropertySheets
  
 属性表格
  
  
 
PropertySheetsPage
  
 属性页
  
  
 
DragList
  
 能处理拖放功能的列表框
  
  
 
         

 

在高版本的ctl32。dll(IE4。0以上版本更新的ctl32。dll文件)中,还包括了一些扩展的通用控件,这些扩展控件如表9。2所示。

表9。2  扩展通用控件

控 件 名 称
 预定义的窗口类
 说    明
 特 殊 风 格
 
Rebar Controls
 ReBarWindow32
 IE风格工具栏
 RBS_
 
Date & Time Picker
 SysDateTimePick32
 日期时间
 DTS_
 
IP Address Picker
 SysIPAddress32
 IP地址输入
  
 
Pager Controls
 SysPager
  
 PGS_
 
boBoxEx
 boBoxEx32
 扩展boBox
 CBS_
 

 

Windows系统自身附带的软件中也大量使用通用控件,以图9。1中所示的“资源管理器”程序界面为例,窗口的上方使用标题栏控件,标题栏控件上显示的说明文字是提示文本控件,窗口下方使用状态栏控件;左边列出目录的地方是树型视图控件,右边列出文件的地方是列表视图控件,列表视图控件中的标题栏本身就使用另一个控件——标题栏控件。

其他的一些控件在操作系统中也随处可见,如跳格表控件通常在属性设置对话框中使用;拷贝大文件时的进度窗口中有个进度条控件。

除了这些控件之外,Richedit控件也是一个很常用的控件,Richedit控件是Edit控件的增强版本,包含了很完整的文本编辑功能,可以用来编辑带格式的rtf文件和不带格式的txt文件,由于该控件非常复杂,代码的规模比较大,单独一个Richedit控件的代码规模就和ctl32。dll中全部代码的规模相当,所以Windows系统将Richedit控件单独放到另一个dll文件中,有关Richedit控件的情况将在9。4节中详细介绍。


图9。1  常见的通用控件

9。1。2  使用通用控件

1.库初始化

通用控件的数量非常多,平时把它们全部装入并注册是非常浪费内存的,所以在默认状态下ctl32。dll并不会被装入内存,因此,在使用通用控件之前必须将通用控件库装入内存,专用函数InitmonControls可以用来完成这个工作,调用这个函数的惟一目的是保证系统加载ctl32。dll库文件。

当库文件被装入的时候,库的入口函数会注册所有的通用控件类,然后用户程序就可以使用这些预定义的类来创建各种类型的通用控件窗口,这就像创建其他的子窗口控件一样。InitmonControls函数没有参数,也没有定义返回值,它的使用方法是:

invoke  InitmonControls

InitmonControls函数仅注册表9。1中所列的通用控件类,并不注册表9。2中的扩展通用控件。如果需要使用扩展通用控件,那么需要使用InitmonControlsEx函数来进行装入和注册的工作:

 

invoke  InitmonControlsEx,lpInitCtrls

lpInitCtrls参数指向一个INITMONCONTROLSEX结构:

INITMONCONTROLSEX STRUCT

  dwSize  dd      ?   ;结构长度

  dwICC   dd      ?   ;需要初始化的类

INITMONCONTROLSEX ENDS

结构中的dwICC字段指定了需要注册的扩展通用控件类,与InitmonControls注册所有它支持的通用控件类不同,InitmonControlsEx函数只注册dwICC字段指明的扩展通用控件类,字段可以是下面取值的组合:

●   ICC_BAR_CLASSES——注册工具栏、状态栏、Trackbar和Tooltip类。

●   ICC_COOL_CLASSES——注册Rebar类。

●   ICC_DATE_CLASSES——注册Date and Time Picker类。

●   ICC_HOTKEY_CLASS——注册Hot Key类。

●   ICC_INTERNET_CLASSES——注册IP Address Picker类。

●   ICC_LISTVIEW_CLASSES——注册ListView和Header类。

●   ICC_PAGESCROLLER_CLASS——注册Pager类。

●   ICC_PROGRESS_CLASS——注册Progress Bar类。

●   ICC_TAB_CLASSES——注册Tab和Tooltip类。

●   ICC_TREEVIEW_CLASSES——注册TreeView和Tooltip类。

●   ICC_UPDOWN_CLASS——注册Up…Down类。

●   ICC_USEREX_CLASSES——注册boBoxEx类。

●   ICC_WIN95_CLASSES——注册InitmonControls函数注册的所有类。

InitmonControlsEx函数是InitmonControls函数的扩充,使用它也可以注册InitmonControls函数能够注册的所有类(也可以仅注册其中的一部分),如果只用到通用控件,两个初始化函数都可以使用,但若用到扩展通用控件,那就只能使用InitmonControlsEx函数来进行初始化了。

创建通用控件的代码一般放在主窗口的WM_CREATE消息中,所以InitmonControls和InitmonControlsEx函数的调用需要在此之前完成,一般在程序一开始的地方就调用它们。



 
来源:电子工业出版社 作者:罗云彬 上一页         回书目         下一页          
上一页         回书目         下一页          
  


第9章 通用控件


9。1 通用控件简介(2)

    
2。 创建通用控件

大部分的通用控件都以窗口类的方法实现(惟一的例外是图像列表),所以创建通用控件窗口的方法和使用自定义窗口类建立窗口的方法是一样的,只要在CreateWindowEx函数中使用通用控件的类名就可以了。如果要在对话框中使用通用控件,也可以在资源文件中用定义子窗口控件同样的方法来定义通用控件(见5。4。4小节)。

在建立通用控件的时候,可以使用WS_CHILD等通用的窗口风格,除此之外,不同的通用控件也有自己的特殊风格,如树型视图控件有TVS_XXXXX风格、列表控件有LVS_xxxx风格等,表9。1和表9。2中列出了一些特殊风格的前缀,这些风格的具体含义可以参考Win32 API函数指南。

可以在对话框资源定义中如下定义一个列表视图控件:

 

CONTROL 〃〃; IDC_LISTVIEW; 〃SysListView32〃;

            LVS_REPORT | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP;

            11; 13; 216; 82; WS_EX_CLIENTEDGE

也可以在程序中使用CreateWindowsEx函数如下创建:

szClass     db  〃SysListView32〃;0

                。。。

invoke      CreateWindowEx;WS_EX_CLIENTEDGE;offset szClass;NULL;

                LVS_REPORT or WS_CHILD or WS_VISIBLE or WS_BORDER;

                11;13;216;82;

                hWinMain;IDC_LISTVIEW;hInstance;NULL

 

上述两种方法的使用效果是一样的,程序代码中的WS_CHILD等以WS开头的风格是窗口的通用风格,而LVS_REPORT风格是列表视图控件的特有风格。由于大多数时候通用控件都是当做子窗口创建的,所以窗口风格中必须包括WS_CHILD风格。另外,使用CreateWindowEx创建的时候必须指定WS_VISIBLE风格,否则控件不会被显示;而在对话框资源中定义的时候,系统总是默认加上WS_VISIBLE风格,所以有没有WS_VISIBLE是无所谓的。

除了调用CreateWindowEx或CreateWindow函数来创建通用控件外,某些通用控件的创建可以使用一些专用的函数,这些函数其实在内部都调用了CreateWindowEx,只是由于包装后的函数是量身定做的,使用起来更方便而已。经过包装的函数有:

●   CreateToolbarEx函数——用来创建工具栏。

●   CreateStatusWindow函数——用来创建状态栏。

●   CreateUpDownControl函数——用来创建滚动条控件。

另外,有些通用控件并没有自己的窗口类名称,或者说根本就不是窗口类,比如属性表格和属性页控件是基于项目列表控件(Table Control)的,DragList控件是基于下拉式列表框的,它们是其他控件的扩展;而图像列表控件本身是一幅图像而不是窗口类。创建这些控件的时候,由于无法用类名来指定它们,所以无法使用CreateWindowEx函数来创建,必须使用下面这些专用的创建函数:

●   PropertySheet函数——用来创建属性表格。

●   CreatePropertySheetPage函数——用来创建属性页。

●   ImageList_Create函数——用来创建图像列表。

●   MakeDragList函数——用来创建DragList控件。

在使用控件时要牢记的是:大部分的控件是窗口,它们是特殊的窗口,所以所有适用于窗口的概念都可以使用在控件上,包括创建与使用的方法,和父窗口的通信方式及内部的工作原理等。

3。 通用控件和父窗口之间的通信

当在对话框中使用子窗口控件时,父窗口通过SendMessage函数发送控制消息来管理子窗口控件,而子窗口控件通过发送WM_MAND或WM_NOTIFY消息来将用户的动作通知父窗口。

通用控件的通信方法和子窗口控件使用的方法是一样的——父窗口发送控制消息来管理通用控件,不同类型的通用控件使用不同的控制消息,如状态栏的控制消息都是以SB_开头的(Status Bar的缩写);TreeView控件的控制消息是以TVM_开头的(Tree View Message的缩写);ListView控件的控制消息是以LVM_开头的(List View Message的缩写)。不同的消息都有特定的用法和参数,在使用时需要查阅Win32函数手册。

通用控件也通过发送通知消息来和父窗口通信,不同通用控件使用的通知消息可能有所不同,归纳起来情况如下:

●   工具栏控件使用WM_MAND消息将按钮动作通知父窗口,这是为了便于和菜单、加速键使用同一份代码来处理用户按下工具栏按钮的动作。

●   滚动条控件使用WM_VSCROLL或者WM_HSCROLL消息通知父窗口,和窗口自身滚动条使用的�

返回目录 上一页 下一页 回到顶部 赞(3) 踩(4)

你可能喜欢的