按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
iPart参数指定需要获取的分栏编号,lpsz指向一个缓冲区,用来接收返回的字符串,消息的返回值是用SB_SETTEXT设置分栏文字时使用的uType,所以返回值可能是SBT_NOBORDERS或SBT_POPOUT等数值。
在发送SB_GETTEXT消息之前,也可以首先通过发送SB_GETTEXTLENGTH消息来获取分栏中字符串的长度:
invoke SendMessage;hWinStatus; SB_GETTEXTLENGTH;iPart;0
and eax;0ffffh
mov dwTextLength;eax
消息返回值的低16位是字符串的长度,高16位是用SB_SETTEXT设置分栏文字时使用的uType。
3。 移动和缩放状态栏
当状态栏的父窗口改变大小的时候,程序必须移动和缩放状态栏以保证它以正确的尺寸位于正确的位置上。虽然以默认风格建立的状态栏是可以自动缩放和移动位置的,但这并不代表父窗口不用通知它,实际上,“自动缩放和移动位置”的含义是父窗口通知状态栏需要移动和缩放的时候,并不需要将正确的位置和大小告诉状态栏,新的位置和大小是由状态栏自己计算的。
所以,例子程序中当父窗口收到WM_SIZE消息的时候,用下面的代码来移动和缩放状态栏:
invoke MoveWindow;hWinStatus;0;0;0;0;TRUE
我们看到,代码中并不需要指定有效的位置和尺寸。
如果创建状态栏的时候指定了CCS_NOPARENTALIGN或CCS_NORESIZE风格的话,那么在使用MoveWindow函数移动状态栏位置的时候就必须首先计算出正确的位置和大小。
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第9章 通用控件
9。2 使用状态栏(4)
9。2。3 在状态栏上显示菜单提示信息
本节演示当用户浏览菜单项的时候如何在状态栏上面显示菜单提示信息。每当用户将鼠标移过一个菜单项的时候,Windows会向窗口过程发送一条WM_MENUSELECT消息,当用户真正选择了菜单项的时候,Windows才会发送WM_MAND消息,为了显示菜单项提示信息,必须响应WM_MENUSELECT消息并根据浏览的菜单项显示对应的提示信息。
如果由我们自己实现这个功能,那么可以用4个步骤完成:首先是响应WM_MENUSELECT消息并从消息参数中获取用户浏览的菜单项ID;第2步是根据菜单项ID获取对应的提示信息字符串;第3步是将状态栏的分栏取消以便用整个状态栏显示提示信息;第4步是在状态栏上显示字符串。
但在现实中不必这样做,在状态栏上面显示菜单提示信息的应用是这样的广泛,以至于系统为此设置了一个专用的函数MenuHelp:
invoke MenuHelp;uMsg;wParam;lParam;hMenu;hInstance;hwndStatus;lpwIDs
这个函数是和WM_MENUSELECT消息配合使用的,输入参数中的uMsg,wParam和lParam可以取自WM_MENUSELECT消息的对应参数,hMenu是用户当前浏览的菜单句柄,由于WM_MENUSELECT消息的lParam参数传递过来的就是菜单句柄,所以函数的hMenu参数也可以直接使用lParam。hwndStatus参数指定了状态栏窗口的句柄。
hInstance和lpwIDs配合指定了需要显示的提示信息字符串,MenuHelp函数使用的字符串必须放在资源文件的字符串表中,函数会自动使用LoadString装入正确的字符串,参数hInstance指定了包含字符串资源的模块的实例句柄。lpwIDs指向一个包含4个双字的数组,用来指定函数装入的字符串的ID值基数,第一个双字指定命令菜单项的基数,第二个双字指定弹出式菜单的基数。基数加上用户当前浏览的菜单项ID得到的数值就是MenuHelp函数要装入的字符串ID。
举例说明,例子程序中调用MenuHelp函数如下:
dwMenuHelp dd 0;IDM_MENUHELP;0;0
。。。
。elseif eax WM_MENUSELECT
invoke MenuHelp;WM_MENUSELECT;wParam;lParam;lParam;hInstance;
hWinStatus;offset dwMenuHelp
资源脚本文件中的字符串表定义如下:
stringtable discardable
BEGIN
IDM_MENUHELP 〃包含文件操作的命令〃
IDM_MENUHELP+1 〃包含操作视图的命令〃
IDM_OPEN 〃打开需要编辑的文件〃
IDM_SAVEAS 〃以另外一个文件名保存文件〃
IDM_PAGESETUP 〃选择打印机以及设置页边距、纸张大小等打印参数〃
。。。
dwMenuHelp数值第一项指定的基数为0,所以对于IDM_OPEN和IDM_SAVEAS等命令菜单项,MenuHelp显示的字符串就等于菜单项ID,我们在资源脚本中只要将对应菜单项的提示字符串ID等同于菜单项ID定义就可以了。
dwMenuHelp数值第二项指定的基数为IDM_MENUHELP,由于弹出式菜单没有ID,系统按照菜单的索引号加上基数当做字符串ID,所以对于第一个弹出式菜单“文件”,函数显示的是ID号为IDM_MENUHELP的字符串,对于第二个弹出式菜单“查看”,菜单索引为1,所以函数显示的是ID为IDM_MENUHELP+1的字符串。
用例子程序中这种简单的逻辑可以显示命令菜单项和第一级弹出式菜单的提示信息,但是无法显示第二级弹出式菜单的提示信息,如果要显示第二级弹出式菜单的提示信息,就必须根据WM_MENUSELECT消息的参数自己判断菜单是否是二级弹出式菜单,并根据不同的情况调用不同参数的MenuHelp函数来实现。
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第9章 通用控件
9。3 使用工具栏(1)
工具栏一般位于主窗口菜单栏的下方。工具栏也是一个子窗口,它包含多个由位图组成的按钮,工具栏上的按钮从功能上看和菜单项是类似的,用户可以通过按动按钮来选择程序提供的各种功能。
工具栏上可以有不同种类的按钮,有的按钮按下后会自动弹起,有的按钮按下后保留在“选中”状态,再按一次后恢复弹起状态,按钮的“选中”状态可以是不互斥的或是互斥的,另外,按钮也可以被灰化或隐藏。所有这些按钮的属性和菜单项的属性是非常相似的,所以工具栏往往用做菜单的补充,为用户提供一个快捷的程序功能选择方式。
由于工具栏的主要用途是当做菜单的补充,为了和菜单逻辑使用同一套代码,当用户按下工具栏上的按钮时,工具栏向父窗口发送WM_MAND消息,除了按动按钮的通知消息之外,工具栏同样使用WM_NOTIFY消息将其他动作通知父窗口,如用户拖动按钮来调整按钮的位置等。
工具栏上面的按钮看起来和对话框中的按钮很相似,但实际上它们不是真正的按钮,而仅是被工具栏控件绘画成按钮的样子罢了,也就是说,对话框中的按钮是子窗口,而工具栏上的按钮并不是子窗口,工具栏控件处理这些“仿真”按钮的方式就和一些图形界面的游戏一样,在屏幕上绘画“模拟”的按钮样子并自行处理用户的鼠标动作,以此检测用户在“按钮”上的动作。
本节的例子程序创建一个如图9。4所示的平面样式的工具栏,当鼠标箭头移动到按钮上面的时候,按钮会以凸起的形状显示,鼠标停留片刻后,会出现一条简短的工具提示信息(图中鼠标箭头下方显示的“新建文件”)。
该例子程序代码在所附光盘的Chapter09Toolbar目录中,目录中包含汇编源文件Toolbar。asm以及资源脚本文件Toolbar。rc文件。
图9。4 工具栏例子的运行结果
Toolbar。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 ctl32。inc
includelib ctl32。lib
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; Equ 等值定义
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
ICO_MAIN equ 1000
IDM_MAIN equ 1000
IDM_NEW equ 1101
IDM_OPEN equ 1102
IDM_SAVE equ 1103
IDM_PAGESETUP equ 1104
IDM_PRINT equ 1105
IDM_EXIT equ 1106
IDM_CUT equ 1201
IDM_COPY equ 1202
IDM_PASTE equ 1203
IDM_FIND equ 1204
IDM_REPLACE equ 1205
IDM_HELP equ 1301
ID_TOOLBAR equ 1
ID_EDIT equ 2
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 数据段
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
。data?
hInstance dd ?
hWinMain dd ?
hMenu dd ?
hWinToolbar dd ?
hWinEdit dd ?
nst
szClass db 'EDIT';0
szClassName db 'ToolbarExample';0
szCaptionMain db '工具栏示例';0
szCaption db '命令消息';0
szFormat db '收到 WM_MAND 消息,命令ID:%d';0
stToolbar equ this byte
TBBUTTON
TBBUTTON
TBBUTTON
TBBUTTON
TBBUTTON
TBBUTTON
TBBUTTON
TBBUTTON
TBBUTTON
TBBUTTON
TBBUTTON
TBBUTTON
TBBUTTON
TBBUTTON
TBBUTTON
TBBUTTON
NUM_BUTTONS EQU 16
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 代码段
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第9章 通用控件
9。3 使用工具栏(2)
de
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_Resize proc
local @stRect:RECT;@stRect1:RECT
invoke SendMessage;hWinToolbar;TB_AUTOSIZE;0;0
invoke GetClientRect;hWinMain;addr @stRect
invoke GetWindowRect;hWinToolbar;addr @stRect1
mov eax;@stRect1。bottom
sub eax;@stRect1。top
mov ecx;@stRect。bottom
sub ecx;eax
invoke MoveWindow;hWinEdit;0;eax;@stRect。right;ecx;TRUE
ret
_Resize endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_ProcWinMain proc uses ebx edi esi hWnd;uMsg;wParam;lParam
local @szBuffer'128':byte
mov eax;uMsg
;********************************************************************
。if eax WM_CLOSE
invoke DestroyWindow;hWinMain
invoke PostQuitMessage;NULL
;********************************************************************
。elseif eax WM_CREATE
mov eax;hWnd
mov hWinMain;eax
invoke CreateWindowEx;WS_EX_CLIENTEDGE;addr szClass;
NULL;WS_CHILD or WS_VISIBLE or ES_MULTILINE
or ES_WANTRETURN or WS_VSCROLL or
ES_AUTOHSCROLL;0;0;0;0;
hWnd;ID_EDIT;hInstance;NULL
mov hWinEdit;eax
invoke CreateToolbarEx;hWinMain;WS_VISIBLE or
WS_CHILD or TBSTYLE_FLAT or TBSTYLE_TOOLTIPS or
CCS_ADJUSTABLE;ID_TOOLBAR;0;HINST_MCTRL;
IDB_STD_SMALL_COLOR;offset stToolbar;
NUM_BUTTONS;0;0;0;0;sizeof TBBUTTON
Mov hWinToolbar;eax
Call _Resize
;********************************************************************
。elseif eax WM_MAND
mov eax;wParam
。if ax IDM_EXIT
invoke EndDialog;hWnd;NULL
。elseif ax != ID_EDIT
invoke wsprintf;addr @szBuffer;
addr szFormat;wParam
invoke MessageBox;hWnd;addr @szBuffer;
addr szCaption;
MB_OK or MB_ICONINFORMATION
。endif
;********************************************************************
。elseif eax WM_SIZE