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,另外还可以组合使用下面的特殊风格:

上页:第09章 通用控件 · 9.3 使用工具栏(2) 下页:第09章 通用控件 · 9.3 使用工具栏(4)

第09章 通用控件

版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号