冰楓論壇

 找回密碼
 立即註冊
搜索
查看: 126|回覆: 0
打印 上一主題 下一主題

[心得] 功能表

[複製鏈接]

13

主題

0

好友

27

積分

新手上路

Rank: 1

UID
460236
帖子
23
主題
13
精華
0
積分
27
楓幣
877
威望
26
存款
0
贊助金額
0
推廣
0
GP
14
閱讀權限
10
性別
保密
在線時間
22 小時
註冊時間
2024-10-12
最後登入
2024-12-30
跳轉到指定樓層
1
發表於 2024-12-4 22:03:14 |只看該作者 |倒序瀏覽
windows應用程式中的功能表(menu)有三種:
1.主功能表:位於標題欄下方,並非每個應用程式都有。
2.系統功能表:以滑鼠左鍵點擊位於標題欄最左邊的圖示才出現。
3.快捷功能表:以滑鼠右鍵點擊工作區才出現,但並非每個應用程式都有。
這一篇要討論如何製作主功能表,製作主功能表的方式有許多種,這裏採用在資源描述檔中描述
功能表的方式。在資源描述檔中描述功能表的語法如下:
  1. MenuID MENU
  2. [optional-statements]
  3. BEGIN
  4. MENUITEM text, ID [,option]
  5. POPUP text
  6.   BEGIN
  7.    ...
  8.   END
  9. ...
  10. 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:
  1. #include "C:\MASM32\INCLUDE\RESOURCE.H"
  2. #define IDD_DLG   1000
  3. #define IDM_MENU  1001
  4. #define IDS_MENU  1002
  5. #define IDB_QUIT  1003
  6. #define IDM_OPEN  1004
  7. #define IDM_SAVE  1005
  8. #define IDM_QUIT  1006
  9. #define IDM_COPY  1007
  10. #define IDM_PASTE 1008
  11. #define IDM_HELP  1009

  12. IDM_MENU MENU
  13. BEGIN
  14. POPUP "檔案"
  15. {
  16.    MENUITEM "開啟",IDM_OPEN
  17.    MENUITEM "儲存",IDM_SAVE
  18.    MENUITEM SEPARATOR
  19.    MENUITEM "離開",IDM_QUIT
  20. }
  21. POPUP "編輯"
  22. {
  23.    MENUITEM "複製",IDM_COPY
  24.    MENUITEM "貼上",IDM_PASTE
  25. }
  26. MENUITEM "說明",IDM_HELP
  27. END

  28. IDD_DLG DIALOG 340,150,120,50
  29. CAPTION "功能表"
  30. FONT 10,"細明體"
  31. STYLE WS_VISIBLE|WS_OVERLAPPEDWINDOW
  32. MENU  IDM_MENU
  33. BEGIN
  34. LTEXT "",IDS_MENU,2,30,72,10
  35. PUSHBUTTON "離開",IDB_QUIT,75,30,40,15
  36. END
複製代碼
底下是MENU.ASM的內容:
  1. .586
  2. .MODEL  FLAT,STDCALL
  3. OPTION  CASEMAP:NONE
  4. IDD_DLG   EQU 1000
  5. IDM_MENU  EQU 1001
  6. IDS_MENU  EQU 1002
  7. IDB_QUIT  EQU 1003
  8. IDM_OPEN  EQU 1004
  9. IDM_SAVE  EQU 1005
  10. IDM_QUIT  EQU 1006
  11. IDM_COPY  EQU 1007
  12. IDM_PASTE EQU 1008
  13. IDM_HELP  EQU 1009
  14. INCLUDE    c:\masm32\include\windows.inc
  15. INCLUDE    c:\masm32\include\kernel32.inc
  16. INCLUDE    c:\masm32\include\user32.inc
  17. INCLUDELIB c:\masm32\lib\kernel32.lib
  18. INCLUDELIB c:\masm32\lib\user32.lib
  19. ;*******************************************************************************
  20. .DATA
  21. hInst   DD ?
  22. hMenu   DD ? ;主功能表
  23. hFile   DD ? ;檔案子功能表
  24. hEdit   DD ? ;編輯子功能表
  25. sYouPre DB "你按下"
  26. buffer  DB 20h DUP (0)
  27. ;*******************************************************************************
  28. .CODE
  29. ;-------------------------------------------------------------------------------
  30. DlgProc PROC    hDlg:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
  31. .IF uMsg==WM_COMMAND
  32.         mov     edx,wParam
  33.         mov     eax,wParam
  34.         shr     edx,10h    ;DX=通知碼
  35.         and     eax,0ffffh ;AX=控制元件識別碼
  36.   .IF ax==IDB_QUIT
  37.         jmp     quit
  38.   .ELSEIF ax==IDM_OPEN
  39.         INVOKE  GetMenuString,hFile,eax,OFFSET buffer,SIZEOF buffer,MF_BYCOMMAND
  40.   .ELSEIF ax==IDM_SAVE
  41.         INVOKE  GetMenuString,hFile,eax,OFFSET buffer,SIZEOF buffer,MF_BYCOMMAND
  42.   .ELSEIF ax==IDM_QUIT
  43.         jmp     quit
  44.   .ELSEIF ax==IDM_COPY
  45.         INVOKE  GetMenuString,hEdit,eax,OFFSET buffer,SIZEOF buffer,MF_BYCOMMAND
  46.   .ELSEIF ax==IDM_PASTE
  47.         INVOKE  GetMenuString,hEdit,eax,OFFSET buffer,SIZEOF buffer,MF_BYCOMMAND
  48.   .ELSEIF ax==IDM_HELP
  49.         INVOKE  GetMenuString,hMenu,eax,OFFSET buffer,SIZEOF buffer,MF_BYCOMMAND
  50.   .ENDIF
  51.         INVOKE  SetDlgItemText,hDlg,IDS_MENU,OFFSET sYouPre

  52. .ELSEIF uMsg==WM_INITDIALOG
  53.         INVOKE  GetMenu,hDlg
  54.         mov     hMenu,eax
  55.         INVOKE  GetSubMenu,hMenu,0
  56.         mov     hFile,eax
  57.         INVOKE  GetSubMenu,hMenu,1
  58.         mov     hEdit,eax

  59. .ELSEIF uMsg==WM_CLOSE
  60. quit:   INVOKE  EndDialog,hDlg,0

  61. .ELSE   ;其他未處理的訊息返回0,通知系統此訊息未處理
  62.         xor     eax,eax
  63.         ret

  64. .ENDIF  ;已處理的訊息返回1,通知系統此訊息已處理
  65.         mov     eax,1
  66.         ret
  67. DlgProc ENDP
  68. ;-------------------------------------------------------------------------------
  69. main    PROC
  70.         INVOKE  GetModuleHandle,0
  71.         mov     hInst,eax
  72.         INVOKE  DialogBoxParam,hInst,IDD_DLG,0,OFFSET DlgProc,0
  73.         INVOKE  ExitProcess,0
  74. main    ENDP
  75. ;*******************************************************************************
  76. END     main
複製代碼
把MENU.ASM、MENU.RC放在同一資料夾,開啟命令提示字元,切換到該資料夾,輸入下面指令即可。
  1. path c:\masm32\bin;%path%
  2. rc menu.rc
  3. ml /coff menu.asm /link menu.res /subsystem:windows
複製代碼
執行結果:

MENU.png (3.22 KB, 下載次數: 0)

MENU.png

收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1鑰匙
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們管群招募本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-12-31 02:23

回頂部