windows环境下32位汇编语言程序设计-第46章
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
mov @stWndClass。hIcon;eax
mov @stWndClass。hIconSm;eax
invoke LoadCursor;0;IDC_ARROW
mov @stWndClass。hCursor;eax
push hInstance
pop @stWndClass。hInstance
mov @stWndClass。cbSize;sizeof WNDCLASSEX
mov @stWndClass。style;CS_HREDRAW or CS_VREDRAW
mov @stWndClass。lpfnWndProc;offset _ProcWinMain
mov @stWndClass。hbrBackground;COLOR_BTNFACE+1
mov @stWndClass。lpszClassName;offset szClassName
invoke RegisterClassEx;addr @stWndClass
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第9章 通用控件
9。3 使用工具栏(3)
;********************************************************************
; 建立并显示窗口
;********************************************************************
invoke CreateWindowEx;NULL;
offset szClassName;offset szCaptionMain;
WS_OVERLAPPEDWINDOW;
CW_USEDEFAULT;CW_USEDEFAULT;700;500;
NULL;hMenu;hInstance;NULL
mov hWinMain;eax
invoke ShowWindow;hWinMain;SW_SHOWNORMAL
invoke UpdateWindow;hWinMain
;********************************************************************
; 消息循环
;********************************************************************
。while TRUE
invoke GetMessage;addr @stMsg;NULL;0;0
。break 。if eax 0
invoke TranslateMessage;addr @stMsg
invoke DispatchMessage;addr @stMsg
。endw
ret
_WinMain endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
start:
call _WinMain
invoke ExitProcess;NULL
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
end start
资源脚本文件Toolbar。rc的内容如下:
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
#include
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
#define ICO_MAIN 1000
#define IDM_MAIN 1000
#define IDM_NEW 1101
#define IDM_OPEN 1102
#define IDM_SAVE 1103
#define IDM_PAGESETUP 1104
#define IDM_PRINT 1105
#define IDM_EXIT 1106
#define IDM_CUT 1201
#define IDM_COPY 1202
#define IDM_PASTE 1203
#define IDM_FIND 1204
#define IDM_REPLACE 1205
#define IDM_HELP 1301
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
ICO_MAIN ICON 〃Main。ico〃
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
IDM_MAIN menu discardable
BEGIN
popup 〃文件(&F)〃
BEGIN
menuitem 〃新文件(&N)。。。〃; IDM_NEW
menuitem 〃打开文件(&O)。。。〃; IDM_OPEN
menuitem 〃保存文件(&S)〃; IDM_SAVE
menuitem separator
menuitem 〃页面设置(&A)。。。〃; IDM_PAGESETUP
menuitem 〃打印(&P)。。。〃; IDM_PRINT
menuitem separator
menuitem 〃退出(&X)〃; IDM_EXIT
END
popup 〃编辑(&E)〃
BEGIN
menuitem 〃剪切(&U)〃; IDM_CUT
menuitem 〃拷贝(&C)〃; IDM_COPY
menuitem 〃粘贴(&P)〃; IDM_PASTE
menuitem separator
menuitem 〃查找字符串(&S)。。。〃;IDM_FIND
menuitem 〃替换字符串(&R)。。。〃;IDM_REPLACE
END
popup 〃帮助(&H)〃
BEGIN
Menuitem 〃帮助(&H)〃; IDM_HELP
END
END
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
stringtable discardable
BEGIN
IDM_NEW 〃新建文件〃
IDM_OPEN 〃打开文件〃
IDM_SAVE 〃保存文件〃
IDM_PAGESETUP 〃页面设置〃
IDM_PRINT 〃打印〃
IDM_COPY 〃拷贝〃
IDM_CUT 〃剪切〃
IDM_PASTE 〃粘贴〃
IDM_FIND 〃查找〃
IDM_REPLACE 〃替换〃
IDM_HELP 〃帮助〃
END
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
资源脚本文件中定义了一些菜单,和状态栏例子程序一样,这些菜单也是仅用来做演示用途的,源程序中并没有书写处理菜单项的代码。
字符串表中定义的字符串是供工具提示信息使用的。
例子程序在主窗口的WM_CREATE消息中使用CreateToolbarEx函数建立工具栏。可以注意到,主程序建立了一个标准的窗口,而不是使用对话框做主窗口,这是为什么呢?这是因为在对话框中无法实现工具栏的高级功能,原因如下:
对话框过程的返回值是用来通知“对话框管理器”是否处理了相关消息的,这个返回值并不会被对话框管理器返回到工具栏子窗口去,对于大部分的控件来说,向父窗口发送WM_NOTIFY消息时并不需要父窗口回应一个返回值,但对于工具栏来说,父窗口必须根据WM_NOTIFY消息的处理情况返回TRUE或FALSE,工具栏要根据返回值再做不同的动作,如果返回值无法返回,就意味着工具栏无法做正确的动作。
所以在对话框中是无法使用工具栏的高级功能(如用户定制按钮等)的,但仅为了使用对话框的按钮当做菜单快捷按钮的情况不在此列,因为这时只需要处理WM_MAND消息,WM_MAND消息并不需要返回一个值。
例子程序中要演示用户定制工具栏按钮的功能,无法使用对话框当做主窗口,所以程序建立了一个常规的窗口。
9。3。1 创建工具栏
创建工具栏的专用函数是CreateToolbarEx,使用CreateWindowEx函数利用类名“ToolbarWindow32”也可以创建工具栏,但CreateWindowEx函数仅创建一个空的工具栏,在创建完成后还要初始化工具栏以及分多次插入按钮,而CreateToolbarEx函数可以一次创建工具栏以及上面的全部按钮。
CreateToolbarEx函数的用法是:
invoke CreateToolbarEx;hwnd;ws;wID;nBitmaps;hBMInst;wBMID;lpButtons;
iNumButtons;dxButton;dyButton;dxBitmap;dyBitmap;uStructSize
mov hToolbar;eax
各参数的说明如下。
hwnd参数是父窗口的句柄,ws是工具栏的风格,wID是工具栏的子窗口ID,这几个参数也可以用在使用CreateWindowEx函数创建工具栏的调用中,ws参数使用的窗口风格必须包括WS_CHILD和WS_VISIBLE,另外还可以组合使用下面的特殊风格:
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第9章 通用控件
9。3 使用工具栏(4)
● TBSTYLE_FLAT——按钮的样式为平面样式,如果指定TBSTYLE_FLAT风格,创建的工具栏如图9。5上方的工具栏所示,如果不指定这个风格,则创建如图9。5下方所示的传统样式的工具栏。
● CCS_NODIVIDER——工具栏边上没有分隔线,如果指定这个风格,那么图9。5中就不会有数字(1)标出的横线。
● TBSTYLE_WRAPABLE——工具栏支持多行显示。
● CCS_TOP,CCS_BOTTOM或CCS_NOMOVEY——指定工具栏的位置,分别表示工具栏位于窗口的上方(默认风格)、底部和不会自动在垂直方向移动。
● CCS_NOPARENTALIGN——工具栏自动设置自己的高度,但不自动设置宽度和位置。
● CCS_NORESIZE——禁止工具栏的自动缩放功能,相当于禁止了上面的CCS_TOP、CCS_BOTTOM,CCS_NOMOVEY和CCS_NOPARENTALIGN风格。
● CCS_ADJUSTABLE——允许用户在按下Shift键的同时通过拖动工具栏上的按钮来调整按钮位置以及删除按钮。
● TBSTYLE_ALTDRAG——对CCS_ADJUSTABLE风格的工具栏将拖动时的按键由Shift键改为Alt键。
● TBSTYLE_TOOLTIPS——工具栏支持工具提示信息。
图9。5 工具栏的风格
hBMInst和wBMID参数用来指定绘画工具栏上的按钮使用的位图,位图可以在资源中定义也可以是已经装入内存的位图。如果使用资源中的位图,那么hBMInst指定包含位图资源的模块的实例句柄,wBMID指定位图资源的ID;如果hBMInst指定为NULL,那就表示要使用一个已经装入内存的位图,这时wBMID必须指定一个合法的位图句柄。
指定了使用的位图以后,nBitmaps,dxBitmap和dyBitmap参数继续给出了位图的属性,工具栏中的每个按钮并不使用一幅单独的位图,而是所有按钮的位图水平排列在一起组成一幅大的位图,nBitmaps参数说明了这幅大位图中包含多少个按钮位图,dxBitmap和dyBitmap参数指出了单个按钮位图的宽度和高度。显然,整个位图的高度就等于dyBitmap,宽度等于nBitmaps乘以dxBitmap。
图9。6是一幅典型的在工具栏中使用的位图,位图中包含了15个按钮。由于工具栏按照位置来分隔并使用位图,所以位图中各按钮的位置必须严格按照尺寸等距离排列,而且位图中不同按钮位图的尺寸必须是相同的。
图9。6 工具栏使用的位图
除了使用自定义的位图以外,ctl32。dll库文件中也提供一些通用的位图供工具栏使用。为了使用这组位图,可以在hBMInst参数中使用预定义的模块实例句柄HINST_MCTRL。
ctl32。dll包含了两组可以使用的位图。第一组就是如图9。6所示的位图,可以在wBMID中指定IDB_STD_LARGE_COLOR(24×24像素)或IDB_STD_SMALL_COLOR(16×16像素)来引用它们。这组位图包括15个按钮,Windows。inc文件中已经为每个按钮的位置索引定义了预定义值,从左到右分别是STD_CUT,STD_COPY,STD_PASTE,STD_UNDO,STD_REDOW(不知道REDO后面为什么有个W),STD_DELETE,STD_FILENEW,STD_FILEOPEN,STD_FILESAVE,STD_PRINTPRE,STD_PROPERTIES,STD_HELP,STD_FIND,STD_REPLACE和STD_PRINT。
第二组位图可以在wBMID中使用IDB_VIEW_LARGE_COLOR或IDB_VIEW_SMALL_COLOR来引用它们,这个位图包含12个按钮图像,索引值0~11分别被预定义为VIEW_LARGEICONS,VIEW_SMALLICONS,VIEW_LIST,VIEW_DETAIL,VIEW_SORTNAME,VIEW_SORTSIZE,VIEW_SORTDATE,VIEW_SORTTYPE,VIEW _PARENTFOLDER,VIEW_NETCONNECT,VIEW_NETDISCONNECT和VIEW _NEWFOLDER,读者从字面上就可以想出这些位图究竟是什么样的。
参数dxButton和dyButton指定工具栏上按钮的尺寸,按钮的尺寸一般比按钮图像的尺寸要大一点。
剩余的3个参数lpButtons,iNumButtons和uStructSize用来定义工具栏上的按钮,函数根据它们给出的数据创建工具栏上的全部按钮。lpButtons参数指向一组按顺序排列的TBBUTTON结构,每个TBBUTTON结构定义一个按钮,TBBUTTON结构的排列顺序决定了按钮在工具栏上的排列顺序;iNumButtons参数指定工具栏上的按钮总数,也就是lpButtons指向的数据中包含的TBBUTTON结构的总数;uStructSize参数指明TBBUTTON结构的长度。
TBBUTTON结构的定义如下:
TBBUTTON STRUCT
iBitmap DWORD ? ;按钮使用的位图编号
idmand DWORD ? ;按钮按下时在WM_MAND中使用的ID
fsState BYTE ? ;按钮状态
fsStyle BYTE ? ;按钮风格
_wPad1 WORD ? ;
dwData DWORD ? ;自定义数据
iString DWORD ? ;按钮字符串索引
TBBUTTON ENDS
上面的结构定义取自MASM32软件包所附带的Windows。inc文件,但是Microsoft Win32 API手册中的结构定义并没有_wPad1字段,现在并没有资料判定Windows。inc中的定义是否正确,但这个定义在实际使用中并不会出错,所以本书中的例子沿用这个定义,这一点请读者注意。结构中各字段的含义如下。
● iBitmap——按钮使用的图像在wBMID 参数指定的位图中的位置索引。位置索引从0开始,也就是说第一个按钮图像的位置索引是0。
● idmand——按下按钮以后,工具栏会向父窗口发送WM_MAND消息,这个字段指定消息附带的命令ID号,一般在这里指定与按钮对应的菜单项使用的ID。
● fsState——按钮的类型和初始状态,可以是下面取值的组合:
■ TBSTATE_CHECKED——按钮的类型是复选框按钮,并且按钮初始化为选中状态(即保持按下状态)。
■ TBSTATE_ENABLED——按钮被允许,如果不指定这个标志,按钮将显示为灰色,并且不会接收用户的动作。
■ TBSTATE_HIDD