WIN32汇编语言教程:第09章 通用控件 · 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 <resource.h> //################################################################## #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_COMMAND消息,WM_COMMAND消息并不需要返回一个值。
例子程序中要演示用户定制工具栏按钮的功能,无法使用对话框当做主窗口,所以程序建立了一个常规的窗口。
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,另外还可以组合使用下面的特殊风格: