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

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

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



观似乎不是很好看,所以在主窗口的WM_SIZE消息中还是需要对工具栏进行调整。不过调整的方法很简单,只要对工具栏发送TB_AUTOSIZE消息就可以了:

invoke  SendMessage;hToolbar;TB_AUTOSIZE;0;0

消息中不必指定位置和大小参数,工具栏会自动计算新的大小,消息发送以后分隔线也会被调整到正确的宽度,一切看起来就完美了。

3。 工具栏按钮的维护消息

工具栏按钮可以像菜单项一样有选中、允许和灰化等状态,在程序中可以使用一组TB_ISBUTTONxxxx类型的消息来检测按钮的状态:

 

invoke  SendMessage;hToolbar;TB_ISBUTTONCHECKED;idButton;0 ;是否在选中状态

invoke  SendMessage;hToolbar;TB_ISBUTTONENABLED;idButton;0 ;是否在允许状态

invoke  SendMessage;hToolbar;TB_ISBUTTONHIDDEN;idButton;0  ;是否在隐藏状态

invoke  SendMessage;hToolbar;TB_ISBUTTONINDETERMINATE;idButton;0 ;是否灰化

invoke  SendMessage;hToolbar;TB_ISBUTTONPRESSED;idButton;0 ;是否在按下状态

对于上面这些消息,如果答案是肯定的,那么消息返回TRUE,否则消息返回FALSE。如果嫌每次调用只能检测一种状态显得比较麻烦,也可以发送TB_GETSTATE消息:

invoke  SendMessage;hToolbar;TB_GETSTATE;idButton;0

函数会返回按钮所有状态的组合值(TBSTATE_INDETERMINATE,TBSTATE _CHECKED,TBSTATE_ENABLED,TBSTATE_HIDDEN或TBSTATE_PRESSED等状态的组合)。在上面这些消息中,idButton用来指定按钮对应的命令ID。

设置按钮的状态也可以通过一组消息来完成:

invoke  SendMessage;hToolbar;TB_CHECKBUTTON;idButton;uState ;选中按钮

invoke  SendMessage;hToolbar;TB_ENABLEBUTTON;idButton;uState    ;允许按钮

invoke  SendMessage;hToolbar;TB_HIDEBUTTON;idButton;uState  ;隐藏按钮

invoke  SendMessage;hToolbar;TB_PRESSBUTTON;idButton;uState ;按下按钮

对于这些消息,如果uState指定为TRUE,那么按钮会分别被设置为选中、允许、隐藏和按下状态;如果uState指定为FALSE,按钮会被设置为非选中、灰化、显示和凸起的状态。

同样,要一次性设置所有状态,可以发送TB_SETSTATE消息:

    invoke  SendMessage;hToolbar;TB_PRESSBUTTON;idButton;uState 

uState参数可以指定为TBSTATE_INDETERMINATE,TBSTATE_CHECKED,TBSTATE _ENABLED,TBSTATE_HIDDEN或TBSTATE_PRESSED等按钮状态的组合值。

9。3。3  工具栏的通知消息

大部分通用控件向父窗口发送的通知消息是WM_NOTIFY,为了便于和菜单消息使用同一段命令处理的逻辑代码,当按动工具栏按钮的时候,工具栏控件向父窗口发送的是WM_MAND消息,但其他情况下发送的通知消息仍然是WM_NOTIFY消息。

工具栏发送的WM_NOTIFY消息主要用于显示工具提示和定制工具栏。

1。 工具提示

当工具栏的风格包含TBSTYLE_TOOLTIPS的时候,CreateToolbarEx函数自动创建一个工具提示控件(Tool Tip),并为工具栏上的每个按钮注册提示文本,当鼠标指针移动到按钮上并停留片刻的时候,工具提示信息会自动显示出来。

工具提示信息是工具提示控件通过包含TTN_NEEDTEXT通知码的WM_NOTIFY消息向父窗口索取的,所以这个WM_NOTIFY消息严格地说应该属于工具提示控件的通知消息而不是工具栏的通知消息,但这里的工具提示控件是CreateToolbarEx函数自动创建的,所以还是一起介绍。

在包含TTN_NEEDTEXT通知码的WM_NOTIFY消息中,lParam指向一个TOOLTIPTEXT结构——慢着!前面不是说WM_NOTIFY消息的lParam参数指向一个NMHDR吗?怎么又是TOOLTIPTEXT结构呢?由于不同控件的通知消息都使用WM_NOTIFY消息,有些通知消息可能需要附带其他数据,这时仅使用一个NMHDR结构来表达是不够的,Windows的处理办法是为需要附带其他数据的WM_NOTIFY消息定义不同的数据结构,但这些结构头部都是一个NMHDR结构,NMHDR结构以后才是其他字段,这样在得知通知码之前,把lParam参数指针当做一个NMHDR结构来处理总是正确的。而且只有先把lParam参数指针当做NMHDR结构处理并从中获取通知码以后,才真正知道lParam指向的究竟是什么结构。

好了,问题解决了,言归正传。TTN_NEEDTEXT通知码的lParam指向一个TOOLTIPTEXT结构,这个结构的定义是: 

TOOLTIPTEXT STRUCT

  hdr             NMHDR         ;头部位置是一个NMHDR结构

  lpszText       DWORD      ?    ;工具提示字符串指针

  szText         BYTE 80 dup (?) ;工具提示字符串缓冲区

  hInst           DWORD       ?        ;包含字符串资源的模块句柄

  uFlags          DWORD       ?        ;标志

TOOLTIPTEXT ENDS

当需要显示工具提示信息的时候,工具提示控件向父窗口发送TTN_NEEDTEXT通知码,父窗口将需要显示的提示字符串放在TOOLTIPTEXT结构中并返回以后,工具提示控件就会把它显示出来。设置TOOLTIPTEXT结构的办法有3种,读者可以任选其一:

(1)字符串包含在资源中,这时可以将hInst字段设置为包含资源的模块句柄,并把lpszText字段设置为字符串ID,其他字段保持为NULL,工具提示会自己使用LoadString函数装入字符串。

(2)将字符串放在内存中,将内存指针放入lpszText字段中,其他字段保持NULL。

(3)将字符串拷入szText字段中,其他字段保持NULL。

例子程序使用了第一种办法。由于NMHDR结构的idFrom字段已经返回了按钮的命令ID,所以在资源脚本文件中将字符串的ID和命令ID一一对应定义,然后使用第一种方法是最方便的,代码如下:

        。elseif eax   WM_NOTIFY

                mov     ebx;lParam

                。if     'ebx + NMHDRde'  TTN_NEEDTEXT

                        assume  ebx:ptr TOOLTIPTEXT

                        mov     eax;'ebx'。hdr。idFrom

                        mov     'ebx'。lpszText;eax

                        push        hInstance

                        pop     'ebx'。hinst

                        assume  ebx:nothing

                        。。。

读者可以自己尝试一下其他的方法。



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


第9章 通用控件


9。3 使用工具栏(6)

    
2。 定制工具栏

定制功能是工具栏中最令人兴奋的特征:当工具栏包含CCS_ADJUSTABLE风格的时候,用户可以通过按下Shift键并拖动工具栏上的按钮来移动按钮位置;如果将按钮拖出工具栏的边界,按钮会被删除;更重要的是,如果向工具栏发送TB_CUSTOMIZE消息或者在工具栏的空白处双击鼠标,会显示出一个如图9。7所示的“自定义工具栏”对话框,对话框右边的列表框中列出了当前显示在工具栏上的按钮,左边列表框列出了可以添加到工具栏上的按钮,用户可以将一个按钮随意在使用和不使用之间切换,并且可以通过拖动按钮的上下位置来决定按钮在工具栏上的位置。

工具栏通过一系列的通知信息来和父窗口交互,共同维护“自定义工具栏”对话框,在这个对话框建立和关闭的时候,工具栏通过TBN_BEGINADJUST和TBN_ENDADJUST通知码来通知父窗口;每次按钮被调整的时候,发送的是TBN_TOOLBARCHANGE通知码;在按下对话框中的“帮助”按钮和“重置”按钮的时候,发送的是TBN_CUSTHELP和TBN_RESET通知码,对于这些通知码,父窗口可以不必响应,这并不会影响对话框的使用。

与对话框是否能够正常运行有关的通知码是TBN_QUERYINSERT,TBN_QUERYDELETE和TBN_GETBUTTONINFO,父窗口必须应答这些通知码。


图9。7  自定义工具栏对话框

当用户在指定位置插入一个按钮的时候,工具栏发送TBN_QUERYINSERT通知码询问父窗口是否允许此操作,这时lParam指向一个TBNOTIFY结构,这个结构定义如下:

TBNOTIFY STRUCT

  hdr            NMHDR       ;显然,这里肯定是NMHDR结构

  iItem          DWORD      ?  ;按钮的位置索引

  tbButton       TBBUTTON  ;包含按钮信息的TBBUTTON结构

  cchText        DWORD      ? ;pszText中字符串的长度

  pszText        DWORD      ? ;按钮的说明字符串

TBNOTIFY ENDS

 

如果程序允许在此按钮前面插入一个新按钮,那么返回TRUE,否则返回FALSE。另外当自定义对话框刚显示的时候,父窗口也会收到这个通知码,这时必须返回TRUE,否则对话框在屏幕上一闪就消失了。

当用户要删除一个按钮的时候,工具栏发送TBN_QUERYDELETE通知码,询问父窗口是否允许此操作,这时lParam也指向一个TBNOTIFY结构,用来说明将要删除的按钮,如果程序允许此操作则返回TRUE,否则返回FALSE。

    。elseif ('ebx + NMHDRde'  TBN_QUERYINSERT) ||     

            ('ebx + NMHDRde'  TBN_QUERYDELETE)  ;现在ebx = lParam

            mov eax;TRUE

            ret

在例子程�
返回目录 上一页 下一页 回到顶部 赞(0) 踩(1)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!