- UID
- 460236
- 帖子
- 23
- 主題
- 13
- 精華
- 0
- 積分
- 27
- 楓幣
- 877
- 威望
- 26
- 存款
- 0
- 贊助金額
- 0
- 推廣
- 0
- GP
- 14
- 閱讀權限
- 10
- 性別
- 保密
- 在線時間
- 22 小時
- 註冊時間
- 2024-10-12
- 最後登入
- 2024-12-30
|
windows應用程式中的功能表(menu)有三種:
1.主功能表:位於標題欄下方,並非每個應用程式都有。
2.系統功能表:以滑鼠左鍵點擊位於標題欄最左邊的圖示才出現。
3.快捷功能表:以滑鼠右鍵點擊工作區才出現,但並非每個應用程式都有。
這一篇要討論如何製作主功能表,製作主功能表的方式有許多種,這裏採用在資源描述檔中描述
功能表的方式。在資源描述檔中描述功能表的語法如下:- MenuID MENU
- [optional-statements]
- BEGIN
- MENUITEM text, ID [,option]
- POPUP text
- BEGIN
- ...
- END
- ...
- END
複製代碼 這裡的MENU是關鍵字,說明在這之後是功能表的描述
1.MenuID是1~65535之間的整數,是功能表識別碼。
2.optional-statements:與https://bingfong.com/forum.php?m ... 1&extra=#pid5469926
中對話盒的一樣。
3.在BEGIN/END之間的是選項或子功能表,假如是選項就用MENUITEM,如果使子功能表用POPUP,
也可以用「MENUITEM SEPARATOR」畫出分隔線。
A.MENUITEM:代表選項,的text會顯示在功能表的選項上。ID是選項識別碼,在1~65535之間
的正整數。
B.POPUP:表示子功能表。
例如底下的資源描述檔,MENU.RC:- #include "C:\MASM32\INCLUDE\RESOURCE.H"
- #define IDD_DLG 1000
- #define IDM_MENU 1001
- #define IDS_MENU 1002
- #define IDB_QUIT 1003
- #define IDM_OPEN 1004
- #define IDM_SAVE 1005
- #define IDM_QUIT 1006
- #define IDM_COPY 1007
- #define IDM_PASTE 1008
- #define IDM_HELP 1009
- IDM_MENU MENU
- BEGIN
- POPUP "檔案"
- {
- MENUITEM "開啟",IDM_OPEN
- MENUITEM "儲存",IDM_SAVE
- MENUITEM SEPARATOR
- MENUITEM "離開",IDM_QUIT
- }
- POPUP "編輯"
- {
- MENUITEM "複製",IDM_COPY
- MENUITEM "貼上",IDM_PASTE
- }
- MENUITEM "說明",IDM_HELP
- END
- IDD_DLG DIALOG 340,150,120,50
- CAPTION "功能表"
- FONT 10,"細明體"
- STYLE WS_VISIBLE|WS_OVERLAPPEDWINDOW
- MENU IDM_MENU
- BEGIN
- LTEXT "",IDS_MENU,2,30,72,10
- PUSHBUTTON "離開",IDB_QUIT,75,30,40,15
- END
複製代碼 底下是MENU.ASM的內容:- .586
- .MODEL FLAT,STDCALL
- OPTION CASEMAP:NONE
- IDD_DLG EQU 1000
- IDM_MENU EQU 1001
- IDS_MENU EQU 1002
- IDB_QUIT EQU 1003
- IDM_OPEN EQU 1004
- IDM_SAVE EQU 1005
- IDM_QUIT EQU 1006
- IDM_COPY EQU 1007
- IDM_PASTE EQU 1008
- IDM_HELP EQU 1009
- INCLUDE c:\masm32\include\windows.inc
- INCLUDE c:\masm32\include\kernel32.inc
- INCLUDE c:\masm32\include\user32.inc
- INCLUDELIB c:\masm32\lib\kernel32.lib
- INCLUDELIB c:\masm32\lib\user32.lib
- ;*******************************************************************************
- .DATA
- hInst DD ?
- hMenu DD ? ;主功能表
- hFile DD ? ;檔案子功能表
- hEdit DD ? ;編輯子功能表
- sYouPre DB "你按下"
- buffer DB 20h DUP (0)
- ;*******************************************************************************
- .CODE
- ;-------------------------------------------------------------------------------
- DlgProc PROC hDlg:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
- .IF uMsg==WM_COMMAND
- mov edx,wParam
- mov eax,wParam
- shr edx,10h ;DX=通知碼
- and eax,0ffffh ;AX=控制元件識別碼
- .IF ax==IDB_QUIT
- jmp quit
- .ELSEIF ax==IDM_OPEN
- INVOKE GetMenuString,hFile,eax,OFFSET buffer,SIZEOF buffer,MF_BYCOMMAND
- .ELSEIF ax==IDM_SAVE
- INVOKE GetMenuString,hFile,eax,OFFSET buffer,SIZEOF buffer,MF_BYCOMMAND
- .ELSEIF ax==IDM_QUIT
- jmp quit
- .ELSEIF ax==IDM_COPY
- INVOKE GetMenuString,hEdit,eax,OFFSET buffer,SIZEOF buffer,MF_BYCOMMAND
- .ELSEIF ax==IDM_PASTE
- INVOKE GetMenuString,hEdit,eax,OFFSET buffer,SIZEOF buffer,MF_BYCOMMAND
- .ELSEIF ax==IDM_HELP
- INVOKE GetMenuString,hMenu,eax,OFFSET buffer,SIZEOF buffer,MF_BYCOMMAND
- .ENDIF
- INVOKE SetDlgItemText,hDlg,IDS_MENU,OFFSET sYouPre
- .ELSEIF uMsg==WM_INITDIALOG
- INVOKE GetMenu,hDlg
- mov hMenu,eax
- INVOKE GetSubMenu,hMenu,0
- mov hFile,eax
- INVOKE GetSubMenu,hMenu,1
- mov hEdit,eax
- .ELSEIF uMsg==WM_CLOSE
- quit: INVOKE EndDialog,hDlg,0
- .ELSE ;其他未處理的訊息返回0,通知系統此訊息未處理
- xor eax,eax
- ret
- .ENDIF ;已處理的訊息返回1,通知系統此訊息已處理
- mov eax,1
- ret
- DlgProc ENDP
- ;-------------------------------------------------------------------------------
- main PROC
- INVOKE GetModuleHandle,0
- mov hInst,eax
- INVOKE DialogBoxParam,hInst,IDD_DLG,0,OFFSET DlgProc,0
- INVOKE ExitProcess,0
- main ENDP
- ;*******************************************************************************
- END main
複製代碼 把MENU.ASM、MENU.RC放在同一資料夾,開啟命令提示字元,切換到該資料夾,輸入下面指令即可。- path c:\masm32\bin;%path%
- rc menu.rc
- ml /coff menu.asm /link menu.res /subsystem:windows
複製代碼 執行結果: |
|