WIN32汇编: 27.工具提示控件[1]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 goddragon 的 blog

第27课 工具提示控件


我们将学习工具提示控件:它是什么如何创建和使用.下载例子

理论:

工具提示是当鼠标在某特定区域上停留时显示的一个矩形窗口.工具提示窗口包含一些编程者想要显示的文本.在这点上,工具提示同状态栏的作用是一样的,所不同的是工具提示当单击或者远离指定区域的时候就会消逝,你可能熟悉与工具栏相关联的工具提示,那些"提示"是工具栏控件提供的便利.如果你想要在其它窗口、控件中显示工具提示的话,就不得不自己创建他们.

既然已经了解了什么是工具提示,就让我们来看看如何创建他们.大致步骤如下:

  1. 用createwindowex函数创建工具提示控件.
  2. 定义一个工具提示控件将要监视鼠标移动的区域.
  3. 将区域传递给工具提示控件
  4. 将传递区域的鼠标消息转送给工具提示控件.(这步或许更早,具体依据转播消息的方法)
下面我们就来详细的讨论每一步.

工具提示控件的创建

工具提示控件是一种通用控件.同样,要在源代码某处调用initcommoncontrols以便masm能够将你的程序和comctl32.dll连接. 用createwindowex创建工具提示控件,典型代码如下:
.data
tooltipclassname db "tooltips_class32",0
.code
.....
invoke initcommoncontrols
invoke createwindowex, null, addr tooltipclassname, null, tis_alwaystip, cw_usedefault, cw_usedefault, cw_usedefault, cw_usedefault, null, null, hinstance, null
注意窗口风格:tis_alwaystip指定了工具提示不管包含指定区域的窗口状态如何,当鼠标移过指定区域的时候,工具提示总是显示.简单的说就是,即使窗口处于非激活状态,鼠标移过工具提示指定区域的时候,工具提示也会出现.
你不必在createwindowex中包括ws_popupws_ex_toolwindow风格,因为工具提示处理过程会自动加上,你也不必指定工具提示窗口的坐标和宽高,控件会依据要显示的文字自动调节.四个参数,均使用cw_usedefault ,其余的参数都不太重要.

指定工具

工具提示控件创建了但还没有显示,我们想要当鼠标指针在某个区域之上时显示工具提示窗口.现在需要指定这个区域.我们称这样的区域为"工具",“工具”就是工具提示控件监视鼠标指针是否移过的位于窗口客户区的一个方形区域.如果鼠标指针移过"工具",工具提示窗口就显示."工具"可覆盖整个客户区或者仅仅是它的一部分.因此我们把"工具"分成两种类型,一种是作为一个窗口,另一种则是某窗口客户区的一部分.两种各有所用.覆盖整个客户区的"工具"通常用于按钮、编辑控件等,你不必指定焦点域的坐标和大小:它被假定为窗口的整个客户区.仅覆盖窗口客户区一部分的"工具"在你想把窗口客户区分成几个部分但又不想使用子窗口时特别有用,但需要指定左上角的坐标和宽高.

使用如下的 toolinfo 结构定义"工具":

toolinfo struct
  cbsize             dword      ?
  uflags             dword      ?
  hwnd               dword      ?
  uid                dword      ?
  rect               rect      <>
  hinst              dword      ?
  lpsztext           dword      ?
  lparam             lparam     ?
toolinfo ends
域名 说明
cbsize toolinfo结构的大小.必须填充, 如果这个区域不被正确填充windows并不会报错,但你会得到不可预料的奇怪结果.
uflags 指定焦点域的属性,可以是如下标志的联合:
  • ttf_idishwnd  "id is hwnd".如果你指定了这个标志,就意味着你要使用覆盖整个客户区的"工具" (上面第一种"工具"). 如果你使用了这个标志,你必须用你要使用的窗口句柄填充uid成员,如果你不指定这个成员,就意味着你要使用第二种"工具"、客户区窗口的一方形区域.在这种情况下,你就必须以方形区域的大小填充rect成员.
  • ttf_centertip  通常工具提示窗口显示在鼠标的右下方,如果你指定了这个标志,不管鼠标的位置如何,工具提示总显示在焦点域总的中下方.
  • ttf_rtlreading  .如果你的程序不是为阿拉伯或者希伯来语系统设计的,你完全可以不理它,它使得提示文本以从右至左的顺序显示,在其它系统中无效.
  • ttf_subclass  如果你使用了这个标志,工具提示控件将子类化"工具"所在窗口以便截取发送给它的的鼠标消息,这个标志非常有用,否则你将不得不做更多的工作来向工具提示控件转发消息.
hwnd 包含"工具"的窗口句柄,如果你指定了ttf_idishwnd标志,windows将忽略该值,而使用uid成员的值作为窗口句柄.你需要填充这个域域如果:
  • 你不使用 ttf_idishwnd标志 (换句话说,你使用局部"工具")
  • 你在 lpsztext 成员中指定了lpstr_textcallback .这个值告诉工具提示控件当需要显示提示窗口时,必须向包含"工具"的窗口查询应该显示什么. 这是一种实时的控件文本更新.如果你需要动态改变提示文本,你应当在 lpsztext成员中指定lpstr_textcallback值,控件就会向hwnd指定的窗口发送ttn_needtext 消息.
uid 这个域的值可能有两种含义,依 uflags 是否包含ttf_idishwnd.
  • 如果ttf_idishwnd标志没有被指定就代表应用程序定义的"工具"id,由于这意味着你使用仅覆盖客户区一部分的"工具",逻辑的推出一个客户区可能存在多个同样的焦点域(不存在交迭),hwnd成员的一个窗口句柄就不够了,应用程序定义id以区分他们因此而显得必要,只要唯一id可以是任何值.
  • 如果ttf_idishwnd标志被指定就表示整个客户区都作为焦点域的窗口句柄,你或许会奇怪为什么不用上面提到的hwnd成员的值来储存窗口句柄.答案是:如果lpsztext指定为lpstr_textcallback,hwnd 可能已经被填充了.还有提供提示文本的窗口和包含"工具"的窗口可能不是同一个!(你可以设计一个提供两种服务的窗口程序,但太严格了,在这点上,微软为我们提供了更大的自由,欢呼吧!)
rect 指定"工具"大小的rect结构.这个结构定义了一个以hwnd指定窗口客户区左上角为基点的方形大小,简言之,如果你想指定客户区的一部分作为"工具"就得填充这个结构,如果你指定了ttf_idishwnd标志 ,控件就会忽略这个值.(你已经选择整个客户区作为"工具")
hinst 如果lpsztext指定了字符串资源的标识,包含将作为工具提文本字符串资源的实例句柄.听起来有点费解,阅读一下lpsztext的说明就可以明白这个域是干什么用的了.若lpsztext不包含字符串资源标识,控件会忽略这个域.
lpsztext 这个域可以有如下几个值:
  • 如果指定为lpstr_textcallback, 工具提示控件就会向hwnd窗口发送ttn_needtext消息以获得将要显示的字符串.提示文本的动态更新方法:每次显示提示窗口都改变提示文本.
  • 如果在这个域中指定字符串资源标识,当控件要在提示窗口中显示提示文本时,就搜索hinst成员标识的实例的字符串资源列表.由于字符串资源列表标识总是16位值,这个域的高字节将永远为0,这种方法在你想移植程序时非常有用,由于字符串资源以脚本形式定义,你不必修改源代码.只需要修改字符串列表提示文本就会相应改变,而不必担心引进bugs.
  • 如果这个域的值不是lpstr_textcallback并且高字节不为零, 控件截取这个值作为提示文本的指针,这是最简单的方法但也最不稳定.通过检查高字节区分字符串资源标识.

本文关键:asm
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top