爱爱小说网 > 其他电子书 > windows环境下32位汇编语言程序设计 >

第46章

windows环境下32位汇编语言程序设计-第46章

小说: windows环境下32位汇编语言程序设计 字数: 每页3500字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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

返回目录 上一页 下一页 回到顶部 2 2

你可能喜欢的