八喜电子书 > 经管其他电子书 > windows环境下32位汇编语言程序设计 >

第20部分

windows环境下32位汇编语言程序设计-第20部分

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

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



⒒一⒏吡料允疽约�3种分隔线,读者可以用test指令测试相应的数据位来分辨菜单项处于哪种状态,一般的测试代码如下:

invoke    GetMenuState;hMenu;IDM_XXX;MF_BYMAND

。if       eax & MF_CHECKED

          ;表示IDM_XXX菜单项现在是选中状态

。endif

同样,读者也可以用eax & MF_DISABLED和eax & MF_GRAYED等条件测试其他状态。

设置菜单项的状态可以用下列3个函数来实现不同的功能:

invoke  EnableMenuItem;hMenu;uIDEnableItem;uEnable

invoke  CheckMenuItem;hMenu;uIDCheckItem;uCheck

invoke  CheckMenuRadioItem;hMenu;idFirst;idLast;idCheck;uFlags

EnableMenuItem函数将菜单项在禁用、可用和灰化状态之间切换,uEnable可以取值为MF_DISABLED,MF_ENABLED和MF_GRAYED,分别代表这3种状态。

CheckMenuItem函数将菜单项在非互斥的选定状态和非选定状态之间切换(即前面是否有对钩),uCheck的取值可以是MF_CHECKED或MF_UNCHECKED,代表选定或非选定状态。

CheckMenuRadioItem将菜单项在互斥的选定状态和非选定状态之间切换(即前面是否有圆点标志),由于互斥的菜单项在一个范围内只有一个是可以选定的,当选定另一个的时候,原来的选定应该撤销,idFirst和idLast就指定了这个互斥范围。函数在选定idCheck指定的菜单项的同时将自动清除idFirst和idLast范围内的其他选定。所以uFlags中无需指定状态,只需指定MF_BYMAND或MF_BYPOSITION定位方法。

在这些函数的参数中,uIDEnableItem,uIDCheckItem,idFirst,idLast和idCheck用来定位菜单项,同样,参数的取值可以是菜单项的命令ID或位置索引,可以在状态参数(uEnable,uCheck,uFlags)中组合定义MF_BYMAND或MF_BYPOSITION来决定使用哪种方法。

在例子程序中,当选中IDM_TOOLBAR和IDM_STATUSBAR之间的菜单项的时候,程序先用invoke GetMenuState;hMenu;ebx;MF_BYMAND获取当前的状态,检查是否选定,并将选定状态反转后用CheckMenuItem重新设置:

。elseif eax 》=  IDM_TOOLBAR && eax =  IDM_BIG && eax 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

#include           

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

#define   ICO_BIG            Ox1000

#define   ICO_SMALL          Ox1001

#define   CUR_2               Ox1000

#define   IDM_MAIN                Ox2000

#define   IDM_EXIT                Ox2101

#define   IDM_BIG             Ox2201

#define   IDM_SMALL          Ox2202

#define   IDM_CUR1                Ox2203

#define   IDM_CUR2                Ox2204

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

ICO_SMALL          ICON       〃Small。ico〃

ICO_BIG            ICON       〃Big。ico〃

CUR_2              CURSOR     〃2。cur〃

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

IDM_MAIN  menu     discardable

BEGIN

          popup    〃文件(&F)〃

          BEGIN

                   menuitem   〃退出(&X)〃;     IDM_EXIT

          END

          popup    〃图标和光标(&I)〃

          BEGIN

                   menuitem   〃大图标(&G)〃;   IDM_BIG

                   menuitem   〃小图标(&M)〃;   IDM_SMALL

                   menuitem   separator

                   menuitem   〃光标A(&A)〃;   IDM_CUR1

                   menuitem   〃光标B(&B)〃;   IDM_CUR2

          END

END

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

经过上一节的“洗礼”,读者对菜单的定义应该很熟悉了,这里就不再说明IDM_MAIN的定义了,脚本文件中定义了ICO_SMALL,ICO_BIG两套图标和CUR_2静态光标,磁盘上还有个动态光标文件1。ani。

Icon。asm的大部分是窗口模板程序的内容,和FirstWindow。asm是相同的,仅在窗口过程的WM_CREATE和WM_MAND增加了一些内容:

                       nst

szCursorFile  db      '1。ani';0

                       de

                       …

              。if     eax   WM_CREATE

                       invoke  LoadIcon;hInstance;ICO_BIG

                       mov     hIcoBig;eax

                       invoke  LoadIcon;hInstance;ICO_SMALL

                       mov     hIcoSmall;eax

                       invoke  LoadCursorFromFile;addr szCursorFile

                       mov     hCur1;eax

                      invoke  LoadCursor;hInstance;CUR_2

                       mov     hCur2;eax

                       invoke  SendMessage;hWnd;WM_MAND;IDM_BIG;NULL

                      invoke  SendMessage;hWnd;WM_MAND;IDM_CUR1;NULL

              。elseif eax   WM_MAND

                       mov     eax;wParam

                      movzx   eax;ax

                       。if     eax     IDM_EXIT

                              call  _Quit

                      。elseif eax     IDM_BIG

                               invoke    SendMessage;hWnd;WM_SETICON;ICON_BIG;hIcoBig

                              invoke    CheckMenuRadioItem;hMenu;

                                IDM_BIG;IDM_SMALL;IDM_BIG;MF_BYMAND

                      。elseif eax     IDM_SMALL

                              invoke    SendMessage;hWnd;

                                WM_SETICON;ICON_BIG;hIcoSmall

                              invoke    CheckMenuRadioItem;hMenu;

                                IDM_BIG;IDM_SMALL;IDM_SMALL;MF_BYMAND

                      。elseif eax     IDM_CUR1

                              invoke    SetClassLong;hWnd;GCL_HCURSOR;hCur1

                              invoke    CheckMenuRadioItem;hMenu;

                              IDM_CUR1;IDM_CUR2;IDM_CUR1;MF_BYMAND

      

返回目录 上一页 下一页 回到顶部 赞(1) 踩(1)

你可能喜欢的