菜单和加速键

来源:互联网 发布:亚特兰大机场数据 编辑:程序博客网 时间:2024/05/16 12:12

1.菜单的定义

在资源脚本文件中菜单的定义格式是:菜单ID MENU [DISCARDABLE]

BEGIN

     菜单项定义

END


菜单项目的定义方法有三种:

a. MENUITEM 菜单文字,命令ID [,选项列表]

b. MENUITEM SEPARATOR

c. POPUP 菜单文字,[,选项列表]

    BEGIN

     item-definitions

    ...

    END


加速键的定义

加速键ID ACCELERATORS

BEGIN

       键名,命令ID [,类型][,选项]

      ...

END


资源文件源代码:

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>#include<resource.h>//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>#defineICO_MAIN0x1000//图标//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>#defineIDM_MAIN0x2000//菜单#defineIDA_MAIN0x2000//加速键#defineIDM_OPEN0x4101#defineIDM_OPTION0x4102#defineIDM_EXIT0x4103   #defineIDM_SETFONT0x4201#defineIDM_SETCOLOR    0x4202#defineIDM_INACT0x4203#defineIDM_GRAY0x4204#defineIDM_BIG0x4205#defineIDM_SMALL0x4206#defineIDM_LIST0x4207#defineIDM_DETAIL0x4208#defineIDM_TOOLBAR0x4209#defineIDM_TOOLBARTEXT0x4210#defineIDM_INPUTBAR0x4211#defineIDM_STATUSBAR0x4212#defineIDM_HELP0x4301#defineIDM_ABOUT0x4302//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ICO_MAINICON"Main.ico"//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IDM_MAINmenudiscardableBEGINpopup"文件(&F)"BEGINmenuitem"打开文件(&O)...",IDM_OPENmenuitem"关闭文件(&C)...",IDM_OPTIONmenuitemseparatormenuitem"退出(&X)",IDM_EXITENDpopup"查看(&V)"BEGINmenuitem"字体(&F)...\tAlt+F",IDM_SETFONTmenuitem"背景色(&B)...\tCtrl+Alt+B",IDM_SETCOLORmenuitemseparatormenuitem"被禁用的菜单项",IDM_INACT,INACTIVEmenuitem"被灰化的菜单项",IDM_GRAY,GRAYEDmenuitemseparatormenuitem"大图标(&G)",IDM_BIGmenuitem"小图标(&M)",IDM_SMALLmenuitem"列表(&L)",IDM_LISTmenuitem"详细资料(&D)",IDM_DETAILmenuitemseparatorpopup"工具栏(&T)"BEGIN   menuitem"标准按钮(&S)",IDM_TOOLBAR   menuitem"文字标签(&C)",IDM_TOOLBARTEXT   menuitem"命令栏(&I)",IDM_INPUTBARENDmenuitem"状态栏(&U)",IDM_STATUSBARENDpopup"帮助(&H)",HELPBEGINmenuitem"帮助主题(&H)\tF1",IDM_HELPmenuitemseparatormenuitem"关于本程序(&A)...",IDM_ABOUTENDEND//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IDA_MAINacceleratorsBEGINVK_F1,IDM_HELP,VIRTKEY"B",IDM_SETCOLOR,VIRTKEY,CONTROL,ALT"F",IDM_SETFONT,VIRTKEY,ALTEND//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>



在完成资源文件rc的编写后 来看看如何在程序中使用菜单键和加速键

1.加载菜单键

2.加载加速键

3.菜单和加速键消息

4.菜单项的修改

5.使用系统菜单

6.右键弹出菜单

7.菜单状态的检测和设置

8.其他菜单函数


menu.asm 如下

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; Sample code for < Win32ASM Programming 2nd Edition>; by 罗云彬, http://asm.yeah.net;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; Menu.asm; 菜单资源的使用例子;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 使用 nmake 或下列命令进行编译和链接:; ml /c /coff Menu.asm; rc Menu.rc; Link /subsystem:windows Menu.obj Menu.res;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.386.model flat, stdcalloption casemap :none;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; Include 文件定义;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>includewindows.incincludeuser32.incincludelibuser32.libincludekernel32.incincludelibkernel32.lib;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; Equ 等值定义;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ICO_MAINequ1000h;图标IDM_MAINequ2000h;菜单IDA_MAINequ2000h;加速键IDM_OPENequ4101hIDM_OPTIONequ4102hIDM_EXITequ4103hIDM_SETFONTequ4201hIDM_SETCOLORequ4202hIDM_INACTequ4203hIDM_GRAYequ4204hIDM_BIGequ4205hIDM_SMALLequ4206hIDM_LISTequ4207hIDM_DETAILequ4208hIDM_TOOLBARequ4209hIDM_TOOLBARTEXTequ4210hIDM_INPUTBARequ4211hIDM_STATUSBARequ4212hIDM_HELPequ4301hIDM_ABOUTequ4302h;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 数据段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.data?hInstancedd?hWinMaindd?hMenudd?hSubMenudd?;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 数据段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.constszClassNamedb'Menu Example',0szCaptionMaindb'Menu',0szMenuHelpdb'帮助主题(&H)',0szMenuAboutdb'关于本程序(&A)...',0szCaptiondb'菜单选择',0szFormatdb'您选择了菜单命令:%08x',0;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 代码段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.code;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_DisplayMenuItemproc_dwCommandIDlocal@szBuffer[256]:bytepushadinvokewsprintf,addr @szBuffer,addr szFormat,_dwCommandIDinvokeMessageBox,hWinMain,addr @szBuffer,offset szCaption,MB_OKpopadret_DisplayMenuItemendp;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_QuitprocinvokeDestroyWindow,hWinMaininvokePostQuitMessage,NULLret_Quitendp;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_ProcWinMainprocuses ebx edi esi hWnd,uMsg,wParam,lParamlocal@stPos:POINTlocal@hSysMenumoveax,uMsg.ifeax ==WM_CREATEinvokeGetSubMenu,hMenu,1movhSubMenu,eax;********************************************************************;在系统菜单中添加菜单项;********************************************************************invokeGetSystemMenu,hWnd,FALSEmov@hSysMenu,eaxinvokeAppendMenu,@hSysMenu,MF_SEPARATOR,0,NULLinvokeAppendMenu,@hSysMenu,0,IDM_HELP,offset szMenuHelpinvokeAppendMenu,@hSysMenu,0,IDM_ABOUT,offset szMenuAbout;********************************************************************; 处理菜单及加速键消息;********************************************************************.elseifeax ==WM_COMMANDinvoke_DisplayMenuItem,wParammoveax,wParammovzxeax,ax.ifeax ==IDM_EXITcall_Quit.elseifeax >=IDM_TOOLBAR && eax <= IDM_STATUSBARmovebx,eaxinvokeGetMenuState,hMenu,ebx,MF_BYCOMMAND.ifeax ==MF_CHECKEDmoveax,MF_UNCHECKED.elsemoveax,MF_CHECKED.endifinvokeCheckMenuItem,hMenu,ebx,eax.elseifeax >=IDM_BIG && eax <= IDM_DETAILinvokeCheckMenuRadioItem,hMenu,IDM_BIG,IDM_DETAIL,eax,MF_BYCOMMAND.endif;********************************************************************; 处理系统菜单消息;********************************************************************.elseifeax == WM_SYSCOMMANDmoveax,wParammovzxeax,ax.ifeax == IDM_HELP || eax == IDM_ABOUTinvoke_DisplayMenuItem,wParam.elseinvokeDefWindowProc,hWnd,uMsg,wParam,lParamret.endif;********************************************************************; 按下右键时弹出一个POPUP菜单;********************************************************************.elseif eax == WM_RBUTTONDOWNinvokeGetCursorPos,addr @stPosinvokeTrackPopupMenu,hSubMenu,TPM_LEFTALIGN,@stPos.x,@stPos.y,NULL,hWnd,NULL;********************************************************************.elseifeax ==WM_CLOSEcall_Quit;********************************************************************.elseinvokeDefWindowProc,hWnd,uMsg,wParam,lParamret.endif;********************************************************************xoreax,eaxret_ProcWinMainendp;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>_WinMainproclocal@stWndClass:WNDCLASSEXlocal@stMsg:MSGlocal@hAcceleratorinvokeGetModuleHandle,NULL  ;获得窗口句柄movhInstance,eaxinvokeLoadMenu,hInstance,IDM_MAIN;使用LoadMenu函数获得菜单句柄movhMenu,eaxinvokeLoadAccelerators,hInstance,IDA_MAIN;获得加速键的句柄mov@hAccelerator,eax;********************************************************************; 注册窗口类;********************************************************************invokeRtlZeroMemory,addr @stWndClass,sizeof @stWndClassinvokeLoadIcon,hInstance,ICO_MAINmov@stWndClass.hIcon,eaxmov@stWndClass.hIconSm,eaxinvokeLoadCursor,0,IDC_ARROWmov@stWndClass.hCursor,eaxpushhInstancepop@stWndClass.hInstancemov@stWndClass.cbSize,sizeof WNDCLASSEXmov@stWndClass.style,CS_HREDRAW or CS_VREDRAWmov@stWndClass.lpfnWndProc,offset _ProcWinMainmov@stWndClass.hbrBackground,COLOR_WINDOW + 1mov@stWndClass.lpszClassName,offset szClassNameinvokeRegisterClassEx,addr @stWndClass;********************************************************************; 建立并显示窗口;********************************************************************invokeCreateWindowEx,WS_EX_CLIENTEDGE,\;CreateWindowEx指明菜单句柄 加载菜单offset szClassName,offset szCaptionMain,\WS_OVERLAPPEDWINDOW,\100,100,400,300,\NULL,hMenu,hInstance,NULLmovhWinMain,eaxinvokeShowWindow,hWinMain,SW_SHOWNORMALinvokeUpdateWindow,hWinMain;********************************************************************; 消息循环;********************************************************************.whileTRUEinvokeGetMessage,addr @stMsg,NULL,0,0.break.if eax== 0invokeTranslateAccelerator,hWinMain,@hAccelerator,addr @stMsg.ifeax == 0invokeTranslateMessage,addr @stMsginvokeDispatchMessage,addr @stMsg.endif.endwret_WinMainendp;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>start:call_WinMaininvokeExitProcess,NULL;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>endstart










0 0
原创粉丝点击