這篇博文將會簡單介紹下菜單、表徵圖與游標在Windows視窗程序中如何使用。
一、菜單、表徵圖、游標都是作為資源在資源檔中定義的。
1、菜單的定義方法:
菜單ID MENU [DISCARDABLE]
BEGIN
功能表項目定義
END
功能表項目定義:
定義普通功能表項目:
MENUITEM 菜單文字 ,命令ID [,選項列表]
定義分割線:
MENUITEM SEPARATOR
定義彈出式菜單:
POPUP 菜單文字 [,選項列表]
BEGIN
功能表項目定義
END
2、表徵圖與游標的定義
表徵圖ID ICON [DISCARDABLE] 表徵圖檔案名稱
游標ID CURSOR [DISCARDABLE] 游標檔案名稱
3、注意
所謂的XXID都是使用者自訂的一些數值,範圍是0~0FFFFH
DISCARDABLE是記憶體選項,表示在不用時可以自動釋放記憶體
4、例子
#include <resource.h>//菜單選項#defineIDM_MAIN0x1000#define IDM_ICOHEAD0x2000#defineIDM_ICOARROW0x2001#defineIDM_CURDINOSAUR0x2002#defineIDM_CURHAND0x2003//表徵圖#defineICON_HEAD0x3000#define ICON_ARROW0x3001//游標#defineCUR_HAND0x4000ICON_ARROWicondiscardable "Arrow.ico"ICON_HEADicondiscardable "Head.ico"CUR_HANDcursordiscardable "Hand.cur"IDM_MAINmenudiscardableBEGINpopup"表徵圖與游標選項(&C)..."BEGINmenuitem"頭像表徵圖",IDM_ICOHEADmenuitem"箭頭表徵圖",IDM_ICOARROWmenuitemseparatormenuitem"恐龍游標",IDM_CURDINOSAURmenuitem"手掌游標",IDM_CURHANDENDEND
二、在主視窗程式中使用菜單、表徵圖、游標資源
1、如何建立視窗:第二篇 第一個視窗程序
2、使用方法
①使用菜單
首先,在獲得模組控制代碼後將菜單(由菜單ID—IDM_MAIN指定)載入進應用程式
invokeGetModuleHandle,NULLmovhInstance,eaxinvokeLoadMenu,hInstance,IDM_MAINmovhMenu,eax
其次,在建立視窗時將菜單控制代碼hMenu作為參數傳遞進去
invokeCreateWindowEx,WS_EX_CLIENTEDGE,\offset szClassName,offset szClassName,\WS_OVERLAPPEDWINDOW,\200,200,300,200,\NULL,hMenu,hInstance,NULL
②使用游標與表徵圖的方法
在調用CreateWindowEx建立視窗時,在函數返回前系統會向視窗程序發出WM_CREATE訊息。我們可以
此時載入游標與表徵圖資源。然後緊接著調用SendMessage函數將預設建立的表徵圖與游標類型發送給視窗程
序處理。
.ifeax == WM_CREATEinvokeLoadIcon,hInstance,ICON_HEADmovhIconHead,eaxinvokeLoadIcon,hInstance,ICON_ARROWmovhIconArrow,eaxinvokeLoadCursor,hInstance,CUR_HANDmovhCurHand,eaxinvokeLoadCursorFromFile,addr szCursorFilemovhCurDinosaur,eaxinvokeSendMessage,hWnd,WM_COMMAND,IDM_ICOHEAD,NULLinvokeSendMessage,hWnd,WM_COMMAND,IDM_CURHAND,NULL
3、例子
.386.model flat,stdcalloption casemap:noneincludewindows.incincludeuser32.incincludelibuser32.libincludekernel32.incincludelibkernel32.lib;下面的equ定義千萬不要寫成0x...;菜單ID的定義IDM_MAINequ1000hIDM_ICOHEADequ2000hIDM_ICOARROWequ2001hIDM_CURDINOSAURequ2002hIDM_CURHANDequ2003h;表徵圖ID的定義ICON_HEADequ3000hICON_ARROWequ3001h;靜態游標檔案的定義CUR_HANDequ4000h;控制代碼定義.data?hInstancedd?hMenudd?hWinMaindd?hCurDinosaurdd?hCurHanddd?hIconHeaddd?hIconArrowdd?.constszCursorFiledb'Dinosaur.ani',0 ;儲存於磁碟上的動態游標檔案 szClassNamedb'Icon and Cursor!',0.code_QuitprocinvokeDestroyWindow,hWinMaininvokePostQuitMessage,NULLret_Quitendp_WinMainProcprocuses ebx edi esi hWnd,uMsg,wParam,lParammoveax,uMsg.ifeax == WM_CREATEinvokeLoadIcon,hInstance,ICON_HEADmovhIconHead,eaxinvokeLoadIcon,hInstance,ICON_ARROWmovhIconArrow,eaxinvokeLoadCursor,hInstance,CUR_HANDmovhCurHand,eaxinvokeLoadCursorFromFile,addr szCursorFilemovhCurDinosaur,eaxinvokeSendMessage,hWnd,WM_COMMAND,IDM_ICOHEAD,NULLinvokeSendMessage,hWnd,WM_COMMAND,IDM_CURHAND,NULL.elseifeax == WM_COMMANDmoveax,wParammovzxeax,ax.ifeax == IDM_ICOHEAD;ICON_BIG是WM_SETICON中預定義的invokeSendMessage,hWnd,WM_SETICON,ICON_BIG,hIconHead invokeCheckMenuRadioItem,hMenu,IDM_ICOHEAD,IDM_ICOARROW,\IDM_ICOHEAD,MF_BYCOMMAND.elseifeax == IDM_ICOARROW;ICON_SMALL是WM_SETICON中預定義的invokeSendMessage,hWnd,WM_SETICON,ICON_SMALL,hIconArrow invokeCheckMenuRadioItem,hMenu,IDM_ICOHEAD,IDM_ICOARROW,\IDM_ICOARROW,MF_BYCOMMAND.elseifeax == IDM_CURDINOSAURinvokeSetClassLong,hWnd,GCL_HCURSOR,hCurDinosaurinvokeCheckMenuRadioItem,hMenu,IDM_CURDINOSAUR,IDM_CURHAND,\IDM_CURDINOSAUR,MF_BYCOMMAND.elseifeax == IDM_CURHANDinvokeSetClassLong,hWnd,GCL_HCURSOR,hCurHandinvokeCheckMenuRadioItem,hMenu,IDM_CURDINOSAUR,IDM_CURHAND,\IDM_CURHAND,MF_BYCOMMAND.endif.elseifeax == WM_CLOSEinvoke_Quit.elseinvokeDefWindowProc,hWnd,uMsg,wParam,lParamret.endifmoveax,0ret_WinMainProcendp_WinMainproclocal@stWndClass:WNDCLASSEXlocal@stMsg:MSGinvokeGetModuleHandle,NULLmovhInstance,eaxinvokeLoadMenu,hInstance,IDM_MAINmovhMenu,eaxinvokeRtlZeroMemory,addr @stWndClass,sizeof @stWndClasspushhInstancepop@stWndClass.hInstancemov@stWndClass.cbSize,sizeof @stWndClassmov@stWndClass.style,CS_HREDRAW or CS_VREDRAWmov@stWndClass.lpfnWndProc,offset _WinMainProcmov@stWndClass.hbrBackground,COLOR_WINDOW + 1mov@stWndClass.lpszClassName,offset szClassNameinvokeRegisterClassEx,addr @stWndClassinvokeCreateWindowEx,WS_EX_CLIENTEDGE,\offset szClassName,offset szClassName,\WS_OVERLAPPEDWINDOW,\200,200,300,200,\NULL,hMenu,hInstance,NULLmovhWinMain,eaxinvokeShowWindow,hWinMain,SW_SHOWNORMALinvokeUpdateWindow,hWinMain.whileTRUEinvokeGetMessage,addr @stMsg,NULL,0,0.break.ifeax == 0invokeTranslateMessage,addr @stMsginvokeDispatchMessage,addr @stMsg.endwret_WinMainendpstart:invoke_WinMaininvokeExitProcess,NULLendstart
三、代碼中表徵圖與游標檔案下載
表徵圖與游標檔案
四、關於本篇博文的例子
程式運行起來後,選擇菜單中的項目可以看到表徵圖與游標的改變。