第三篇 菜單、表徵圖與游標的使用

來源:互聯網
上載者:User

這篇博文將會簡單介紹下菜單、表徵圖與游標在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

三、代碼中表徵圖與游標檔案下載

表徵圖與游標檔案

 

四、關於本篇博文的例子

程式運行起來後,選擇菜單中的項目可以看到表徵圖與游標的改變。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.