²Ä¤Q¤C³¹¡@¥\¯àªí¡]¤T¡^

³o¤@³¹ÁÙ¬O½Í¥\¯àªí¡A¦ý¬O§ï¥Î¥H©I¥s CreateMenu¡BInsertMenuItem¡BSetMenu µ¥ Win64 API ¨Ó«Ø¥ß¥D¥\¯àªí¡A¦Ó¤£¦A¨Ï¥Î¸ê·½´y­zÀɤ¤ªº MENU °Ï¶ô¡C¥H«eªÌ¤è¦¡«Ø¥ßªº¥\¯àªí¡A¸û¬°ÆF¬¡¡A¥i¥H¥´³y¨ã¦³«È»s¤Æ¯S¦âªº¥\¯àªí¡A¯ÊÂI¤]¬OÅã¦Ó©ö¨£ªº¡A¨º´N¬O½ÆÂø¡C¦b¶i¤J¥DÃD¤§«e¡A¥ý¤¶²Ð³o¤@³¹·|¥Î±o¨ìªº Win64 API¡C


»P¥\¯àªí¬ÛÃöªº Win64 API

CreateMenu API

CreateMenu ·|«Ø¥ß¤@­Ó¥\¯àªí¡A¦¹¥\¯àªí³Ìªì¬OªÅªº¡A¤@µL©Ò¦³¡AÀ³¥Îµ{¦¡¥i¥H©I¥s InsertMenuItem¡BAppendMenu¡BInsertMenu ¦b³o·s«Øªº¥\¯àªí²K¥[¤À¹j½u¡B¿ï¶µ¡B¼u¥X¿ï¶µ¡CCreateMenu ¨S¦³°Ñ¼Æ¡A¨ä­ì«¬¬O¡G

call    CreateMenu

invoke °²«ü¥O¡]¹ï UASM ¦Ó¨¥¡^©Î¥¨¶°¡]¹ï MASM64 SDK ¦Ó¨¥¡^¬O¥Î¨Ó±N°Ñ¼Æ¦s¤J¼È¦s¾¹©Î°ïÅ|¤¤¡A³Ì«á¤@©w·|°õ¦æ CALL «ü¥O¡C©I¥s CreateMenu ®É¡A¦]¬°¨S¦³°Ñ¼Æ¡A©Ò¥H¥i¥Hª½±µ¨Ï¥Î CALL¡A·íµM¤]¥i¥H¨Ï¥Î invoke¡C¦pªG CreateMenu ¦¨¥\«Ø¥ß¥\¯àªí¡A¦^¶Ç­È¬O¨ä¥N½X¡F¦pªG¥¢±Ñ¡A¦^¶Ç­È¬O¹s¡C

InsertMenuItem API

¦b¥\¯àªí¤¤¥[¤J·sªº¤À¹j½u¡B¿ï¶µ¡B¼u¥X¿ï¶µ¡C

invoke  InsertMenuItem,\
        hMenu,\         ; handle to menu to be changed
        uItem,\         ; identifier or position
        fByPosition,\   ; value specifying the meaning of uItem
        lpmii           ; pointer to a MENUITEMINFO structure

¦pªG InsertMenuItem °õ¦æ¦¨¥\¡A¦^¶Ç­È¬°«D¹s¡F¤Ï¤§¦^¶Ç­È¬°¹s¡C©³¤U»¡©ú¦U¶µ°Ñ¼Æªº·N¸q¡G

MENUITEMINFO    STRUCT 
  cbSize        DWORD     ?         ;MENUITEMINFO ªºªø«×¡A¥H¦ì¤¸²Õ³æ¦ì
  fMask         DWORD     ?         ;ºX¼Ð¡A«ü©w­n¦s¨ú MENUITEMINFO ¤¤ªº­þ¤@Äæ
  fType         DWORD     ?         ;¿ï¶µÃþ«¬
  fState        DWORD     ?         ;¿ï¶µª¬ºA
  wID           DWORD     2 DUP(?)  ;¿ï¶µÃѧO½X
  hSubMenu      HMENU     ?         ;¤l¥\¯àªí¥N½X
  hbmpChecked   HBITMAP   ?         ;¤Ä¿ï¤§¿ï¶µ«eªº¦ì¤¸¹Ï
  hbmpUnchecked HBITMAP   ?         ;¥¼¤Ä¿ï¤§¿ï¶µ«eªº¦ì¤¸¹Ï
  dwItemData    ULONG_PTR ?         ;
  dwTypeData    LPSTR     ?         ;¿ï¶µ¤å¦r©Î¹Ï¤ù
  cch           DWORD     2 DUP (?) ;¿ï¶µ¦r¦êªø«×
  hbmpItem      HBITMAP	  ?         ;¥H¦ì¤¸¹Ï¥N´À¿ï¶µ¦r¦ê
MENUITEMINFO    ENDS

MENUITEMINFO µ²ºcÅé«Ü½ÆÂø¡A©³¤U»¡©ú¦UÄæ¦ìªº·N¸q¡C³Ì²³æªº¬O²Ä¤@­ÓÄæ¦ì¡AcbSize¡A¬O«ü MENUITEMINFO µ²ºcÅé¤j¤p¡A³æ¦ì¬O¦ì¤¸²Õ¡A¦b©I¥s InsertMenuItem «e¥²¶·³]©w cbSize Äæ¦ì¡AWindows ¾a¦¹¼Æ­È§PÂ_¨Ï¥Î­þ­Óª©¥»ªº API¡C­Y¨S³]¦n cbSize¡A´N·|µo¥Í¿ù»~¡C

²Ä¤G­ÓÄæ¦ì¡AfMask¡A¨M©w¤F InsertMenuItem¡BGetMenuItemInfo »P SetMenuItemInfo ·|¨Ï¥Î MENUITEMINFO ¤¤ªº­þ¨ÇÄæ¦ì¡A¦Ó¨ä¥LÄæ¦ìµL¥Î¡C¨Ò¦p©I¥s InsertMenuItem ¤§«e¡A§â fMask ¬° MIIM_ID¡A¨º´N¥²¶·¦P®É§â wID Äæ¦ì³]¬°¿ï¶µÃѧO½X¡A³o¼Ë©I¥s§¹¤§«á´N¯à§â·s¥[¤Jªº¿ï¶µ³]¦n¿ï¶µÃѧO½X¡F¦pªG©I¥s GetMenuItemInfo ¤§«e¡AfMask ¬° MIIM_ID¡A©I¥s§¹«á¨t²Î·|§â¿ï¶µÃѧO½X¦s¤J¨ì wID Äæ¦ì¤¤¡C

©³¤U¬O fMask Äæ¦ì¥i¥H³]©wªº¼Æ­È¡A¦pªG­n¤@¦¸³]©w©Î¬O±o¨ì¬Y¿ï¶µªº¼ÆºØ¸ê®Æ¡A¥i¥H¥Î¡uOR¡v¹Bºâ¤l³s±µ¡A¦ý¦¹ OR ¨Ã«D x64 CPU «ü¥O¡A¦Ó¬O²ÕĶ¾¹°õ¦æªº°²«ü¥O¡C

fMaskÀ³³]©w©Î
Àò¨úªºÄæ¦ì
»¡¡@©ú
MIIM_BITMAP
80H
hbmpItem ¿ï¶µ¥H¦ì¤¸¹ÏÅã¥Ü¡A­nÅã¥Üªº¦ì¤¸¹Ï¥N½X¦s©ó hbmpItem Äæ¦ì¤¤¡A¦ì¤¸¹Ï¥N½X¥i¥H¥Ñ¸ê·½¤¤¸ü¤J¡A¤]¥i¥H¬O¤º«Øªº¦ì¤¸¹Ï¡A¨Ò¦p HBMMENU_MBAR_CLOSE¡BHBMMENU_MBAR_MINIMIZE¡A¤À§O¬OÃö³¬¡B³Ì¤p¤Æªº¦ì¤¸¹Ï¡A§ó¦hªº¤º«Ø¦ì¤¸¹Ï½Ð¬d¾\ MSDN¡ChbmpItem ¤]¥i¥H¬O HBMMENU_CALLBACK¡A¥Nªí¦Û¦æø»s¿ï¶µ¡AÀ³¥Îµ{¦¡¥²¶·³B²z WM_MEASUREITEM ©Î WM_DRAWITEM °T®§¡C
MIIM_CHECKMARKS
8H
hbmpChecked
hbmpUnchecked
MIIM_CHECKMARKS ¬O³]©w¤Ä¿ïªº©Î¥¼¤Ä¿ïªº¦ì¤¸¹Ï¡A¦¹¦ì¤¸¹Ï·|Åã¥Ü¦b¿ï¶µ¤å¦r¤§«e¡ChbmpChecked «ü©w¤Ä¿ï®É©ÒÅã¥Üªº¦ì¤¸¹Ï¡FhbmpUnchecked «ü©w¥¼¤Ä¿ï®É©ÒÅã¥Üªº¦ì¤¸¹Ï¡ChbmpChecked¡BhbmpUnchecked ³£À³¸Ó¬O¦ì¤¸¹Ï¥N½X¡A¦ý¬O¦pªG hbmpChecked ¬O NULL¡A¦Ó¥B fType¡BfState ¤À§O³]¬° MFT_RADIOCHEC¡BfState ®É¡A«h¥H●ªí¥Ü¤Ä¿ïªº¿ï¶µ¡F¦pªG hbmpChecked ¬O NULL¡A¥B fType¡BfState §¡¬°¹s¡A«h¥H✔ªí¥Ü¤Ä¿ïªº¿ï¶µ¡C
MIIM_DATA
20H
dwItemData»P¥\¯àªí¶µ¬ÛÃöÁpªºÀ³¥Îµ{¦¡©w¸q­È¡C
MIIM_FTYPE
100H
fType ·í fMask ³]¬° MIIM_FTYPE ®É¡A¶·©ó fType Äæ¦ì«ü©w©ÎªÌÀò¨ú¿ï¶µÃþ«¬¡A¿ï¶µÃþ«¬¥i¥H¬O¤U­±¼Æ­È¡A©Î¬O¬Û¤¬¶¡¥H OR ¹Bºâ¤l¹Bºâªºµ²ªG¡A¦ý¬O¤£¯à¦P®É«ü©w MFT_BITMAP¡BMFT_SEPARATOR¡BMFT_STRING¡C
  1. MFT_BITMAP¡G¥Î¦ì¤¸¹ÏÅã¥Ü¿ï¶µ¦Ó¤£¥Î¤å¦r¡A¸Ó¦ì¤¸¹Ï¥N½X¦s©ó dwTypeData Äæ¦ì¥B©¿²¤ cch Äæ¦ì¡CMFT_BITMAP ¤§­È¬° 4¡C
  2. MFT_MENUBARBREAK¡G¹ï¥D¿ï³æ¦Ó¨¥¡A¦Û¦¹¿ï¶µ¶}©lÅã¥Ü©ó¤U¤@¦C¡F¹ï¤l¥\¯àªí¡B§Ö±¶¥\¯àªí¦Ó¨¥¡AÅã¥Ü©ó¤U¤@¦æ¥B¨â¦æ¶¡¦³¹]Áè½u¤À¹j¡CMFT_MENUBARBREAK ¤§­È¬° 20H¡C
  3. MFT_MENUBREAK¡G¦P¤W¡A¦ý¨S¦³¹]Áè½u¤À¹j¡CMFT_MENUBREAK ¤§­È¬° 40H¡C
  4. MFT_OWNERDRAW¡G¨ã¦³ MFT_OWNERDRAW ªº¿ï¶µ¡A¥²¶·¥ÑÀ³¥Îµ{¦¡¾á­t°_ø»s¦¹¿ï¶µªº³d¥ô¡C²Ä¤@¦¸Åã¥Ü¿ï¶µ¤§«e¡AÀ³¥Îµ{¦¡·|¦¬¨ì WM_MEASUREITEM °T®§¡A¨C·í§ó·s¿ï¶µ¥~Æ[®É·|¦¬¨ì WM_DRAWITEM °T®§¡AÀ³¥Îµ{¦¡Âǵ۳o¨â«h°T®§Ã¸»s¿ï¶µ¡C«ü©w MFT_OWNERDRAW ®É¡AdwTypeData ¥i¥H«ü©wÀ³¥Îµ{¦¡¦Û¦æ©w¸qªº¼Æ­È¡CÀ³¥Îµ{¦¡·|¦¬¨ìªº WM_MEASUREITEM¡BWM_DRAWITEM °T®§¤¤¡AlParam ¤À§O¬O MEASUREITEMSTRUCT¡BDRAWITEMSTRUCT µ²ºcÅé¦ì§}¡A¨ä¤¤ªº¦P¦WÄæ¦ì itemData ¤º¦sµÛ dwTypeData ¦Û¦æ©w¸qªº¼Æ­È¡CMFT_OWNERDRAW ¤§­È¬° 100H¡C
  5. MFT_RADIOCHECK¡G·í hbmpChecked ¬°¹s¥B fState ¬° MFS_CHECKED¡A¨º»ò¨ã¦³ MFT_RADIOCHECK Ãþ«¬ªº¿ï¶µ«e¥H●ªí¥Ü¤Ä¿ïª¬ºA¡CMFT_RADIOCHECK ¤§­È¬° 200H¡C
  6. MFT_RIGHTJUSTIFY¡G±q¨ã¦³ MFT_RIGHTJUSTIFY ªº¿ï¶µ¶}©l¡A±Æ¦C¦b¥D¥\¯àªíªº¥kÃä¡CMFT_RIGHTJUSTIFY ¥u¯à¥Î©ó¥D¥\¯àªí¤¤ªº¿ï¶µ¡A¨ä­È¬° 4000H¡C
  7. MFT_RIGHTORDER¡Gªü©Ô§B»y¡B§Æ§B¨Ó»yª©¥»ªº Windows ¤~¯à¨Ï¥Î¡A¨Ï¿ï¶µ¦r¦ê¥Ñ¥k¦Ü¥ª¾\Ū¡C
  8. MFT_SEPARATOR¡G¦b¤l¥\¯àªí¡B§Ö±¶¥\¯àªí¤¤¡A¨ã¦³ MFT_SEPARATOR ®É¡AÅã¥Ü¤ô¥­¤À¹j½u¡CdwTypeData¡Bcch ·|³Q©¿²¤¡CMFT_SEPARATOR ¤§­È¬° 800H¡C
  9. MFT_STRING¡G¥Î¦r¦êªí¥Ü¿ï¶µ¡AdwTypeData ¬°¦r¦ê¦ì§}¡A¦¹¦r¦ê¶·¥H¹sµ²§À¡Ccch ¬°¦r¦êªø«×¡CMFT_STRING ¤§­È¬°¹s¡C
MIIM_ID
2
wID ¦s¨ú wID Äæ¦ì¡C·í©I¥s InsertMenuItem¡BSetMenuItemInfo «e¡A¶·§â wID ³]©w¬°¿ï¶µÃѧO½X¡F©I¥s GetMenuItemInfo «á¡AwID ·|¦s¦³¿ï¶µÃѧO½X¡C
MIIM_STATE
1
fState ¥u¦³·í fMask ³]¬° MIIM_STATE ®É¡A«ü©w¿ï¶µª¬ºA¡A¥Ñ fState Äæ¦ìªí¥Üª¬ºA¡A¥i¥H¬O¤U­±¼Æ­È¡G
  1. MFS_CHECKED¡G¦¹¿ï¶µ¬°¤Ä¿ïªº¡A¨ä­È¬° 8¡C­Y¨ã¦³¤Ä¿ïª¬ºA¡A¥²¶·¶i¤@¨B³]©w hbmpChecked ¬°¬Y¹Ï¤ùªº¦ì¤¸¹Ï¥N½X¡A¦¹¹Ï¤ù·|Åã¥Ü¦b¤Ä¿ïªº¿ï¶µ«e­±¡F¦pªG hbmpChecked ³]¬°¹s¡A«h¨Ï¥Î¹w³]¹Ï¤ù¡C¦pªG fType ³]©w MFT_RADIOCHECK¡A¨º»ò¹w³]¹Ï¤ù¬O●¡C­Y­n³]©w hbmpUnchecked¡A¥²¶·§â fMask Äæ¦ì³]¬° MIIM_CHECKMARKS¡C
  2. MFS_DEFAULT¡G¦¹¿ï¶µ¬°¤º©wªº¿ï¶µ¡A¤@¥\¯àªí¤¤¥u¦³¤@­Ó¿ï¶µ¬O¤º©wªº¡A¥B¥H²ÊÅé¦rªí¥Ü¡CMFS_DEFAULT ¤§­È¬° 1000H¡C
  3. MFS_DISABLED¡G¦¹ª¬ºAªº¿ï¶µ¬O¸T¥Îªº¥B¥H¦Ç¦â¦rªí¥Ü¡AµLªk³Q¨Ï¥ÎªÌÂI¿ï¡A»P MFS_GRAYED ¦P¸q¡CMFS_DISABLED ¤§­È¬° 3¡C
  4. MFS_ENABLED¡G¦¹ª¬ºAªº¿ï¶µ¬O±Ò¥Îªº¡A¥i¥H³Q¨Ï¥ÎªÌÂI¿ï¡A¨ä­È¬° 0¡C
  5. MFS_GRAYED¡G»P MFS_DISABLED ¦P¸q¡AMFS_GRAYED ¬° 3¡C
  6. MFS_HILITE¡G¥H°ª«G«×Åã¥Ü¿ï¶µ¡A¨ä­È¬° 80H¡C
  7. MFS_UNCHECKED¡G¥¼¤Ä¿ïªº¿ï¶µ¡A¨ä­È¬° 0¡C­Y¨ã¦³¥¼¤Ä¿ïª¬ºA¡A¥²¶·¶i¤@¨B³]©w hbmpUnchecked ¬°¬Y¹Ï¤ùªº¦ì¤¸¹Ï¥N½X¡A¦¹¹Ï¤ù·|Åã¥Ü¦b¥¼¤Ä¿ïªº¿ï¶µ«e­±¡F¦pªG hbmpUnchecked ³]¬°¹s¡A«h¤£¨Ï¥Î¥ô¦ó¹Ï¤ù¡C­Y­n³]©w hbmpUnchecked¡A¥²¶·§â fMask Äæ¦ì³]¬° MIIM_CHECKMARKS¡C
MIIM_STRING
40H
dwTypeData ¥H¦r¦êªí¥Ü¿ï¶µ¡C¦r¦ê¶·¥H¹sµ²§À¡A¨ä¦ì§}¦s©ó dwTypeData¡Ccch ¬°¦r¦êªø«×¡CMIIM_STRING ¥i¥H¨ú¥N MFT_STRING¡C
MIIM_SUBMENU
4
hSubMenu ±N¬Y¤@¿ï¶µ³]¬°¼u¥X¿ï¶µ¡A¯àÅã¥Ü¤l¥\¯àªí¡C·í fMask «ü©w¤F MIIM_SUBMENU ®É¡A¶·¦P®É©ó hSubMenu «ü©w¤l¥\¯àªí¤§¥N½X¡A±N¸Ó¤l¥\¯àªíªþ¦b InsertMenuItem¡BSetMenuItemInfo ªº²Ä¤@­Ó°Ñ¼Æ¡AhMenu¡A¤§¤U¡C
MIIM_TYPE
10H
fType
dwTypeData
¥²¶·³]©w fType »P dwTypeData¡A°Ñ¦Ò MIIM_BITMAP¡BMIIM_FTYPE »P MIIM_STRING¡A¦]¬° MIIM_TYPE ±N³v¨B³Q«e¤TªÌ¨ú¥N¡C

°²³]­n¦b¬Y­Ó¥\¯àªí¤º·s²K¤@¿ï¶µ¡A³q±`·|¦P®É³]©w¿ï¶µ¤å¦r»P¿ï¶µÃѧO½X¡A¨º»ò´N·|¨Ï¥Î¤U­±µ{¦¡½X¡G

        mov     mii.fMask,MIIM_STRING or MIIM_ID
        mov     mii.wID,¿ï¶µÃѧO½X
        lea     r10,¦r¦êÅܼÆ
        mov     mii.dwTypeData,r10
        invoke  InsertMenuItem,hMenu,0,TRUE,ADDR mii

¤W­±²Ä¤@¦æµ{¦¡½X¤¤ªº MIIM_STRING ±`¼Æ¬° 40H¡A´«ºâ¬°¤G¶i¦ì¬O 0100 0000¡FMIIM_ID ¬° 2¡A¤G¶i¦ì¬O 0010¡A¸g¹L¡uOR¡v¹Bºâ¤§«á¬° 0100 0010¡A¸g¥Ñ MENUITEMINFO ±N¦¹¸ê®Æ¶Çµ¹ InsertMenuItem¡AInsertMenuItem ´N¯àª¾¹D¨Ï¥ÎªÌ­n·s²Kªº¿ï¶µ¨ã¦³­þ¨Ç©Ê½è¡C¦b Windows µ{¦¡³]­p¤¤¡A¦³³\¦hÃþ¦ü³o¼Ëªº±`¼Æ¡A³£ºÙ¤§¬°ºX¼Ð¡A¥¦­Ì¥Nªí¤F¬Y­Ó¦ì¤¸¡A­Y¬°¤@ªí¥Ü­n¨M©w¤F¬Y­Óª«¥óªº©Ê½è¡A­Y¬°¹sªí¥Ü¨S¦³¦¹©Ê½è¡C

DrawMenuBar API

DrawMenuBar ¥Î¨Ó­«·sø»s¥\¯àªí¡A³q±`¬O¦b©I¥s InsertMenuItem¡BRemoveMenu¡BSetMenuItemInfo ¤§«á¨Ï±o¥\¯àªíµo¥ÍÅܤơA©I¥s DrawMenuBar §ó·s¥\¯àªí¥~Æ[¡CDrawMenuBar ªº­ì«¬¬O¡G

invoke  DrawMenuBar,\
        hWnd            ; handle to window with menu bar to redraw

hWnd ¬O»Ý­n§ó·s¥\¯àªí¥~Æ[ªºµøµ¡¤§µøµ¡¥N½X¡C¦pªG DrawMenuBar ¦¨¥\°õ¦æ¡A¦^¶Ç­È¬°«D¹s¡F­Y¥¢±Ñ¡A¦^¶Ç­È¬°¹s¡C


¤£¨Ï¥Î¸ê·½´y­zÀɤ¤ªº MENU °Ï¶ô«Ø¥ß¥\¯àªí

¨Ò¤l¡GDRAW5.ASM

³o¤@³¹ªº¨Ò¤l¬O DRAW5¡A¥¦ªº¥D¥\¯àªí¤£¨Ï¥Î¸ü¤J¸ê·½¤¤ªº MENU ¸ê·½¡A¦Ó§ï¥Î©I¥s CreateMenu¡BSetMenu¡BInsertMenuItem «Ø¥ß¡A¥¦¤]¬O¥H²Ä¤Q¤­³¹ªº DRAW2 ¶i¦æ­×§ï¦Ó¦¨¡C¥Ñ©ó¥u­×§ï³¡¤À¤º®e¡A©Ò¥H DRAW5 »P DRAW2 ¤j¦P¤p²§¡A©³¤U¥u¦C¥X­«­n¥B¤£¦Pªº³¡¤À¡A§¹¾ãªº­ì©lÀɮ׽Шì³oùؤU¸ü¡C±N¨ä¤¤ªº DRAW5.ASM »P DRAW5.RC ©ñ¦b¦P¤@¤l¥Ø¿ý¡A²ÕĶ¤èªk»P²Ä¤Q¤­³¹ªº DRAW2 ¬Û¦P¡A¤£­«½Æ±Ô­z¡C

1
⁝ 
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
⁝ 
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
⁝ 
363
364
;©I¥s CreateMenu¡BInsertMenuItem¡BSetMenu«Ø¥ß¥D¥\¯àªí¡A¤£¥ÎMENU°Ï¶ô
    ⁝

;©³¤U¬OWinInc¨S¦³«Å§iªº±`¼Æ¥H¤Î§ó¥¿«áMENUITEMINFOµ²ºcÅé
MIIM_STRING     EQU     40H
MIIM_BITMAP     EQU     80H
MIIM_FTYPE      EQU     100H
MY_MENUITEMINFO STRUCT
  cbSize        DWORD     ?
  fMask         DWORD     ?
  fType         DWORD     ?
  fState        DWORD     ?
  wID           DWORD     2 DUP(?)
  hSubMenu      HMENU     ?
  hbmpChecked   HBITMAP   ?
  hbmpUnchecked HBITMAP   ?
  dwItemData    ULONG_PTR ?
  dwTypeData    LPSTR     ?
  cch           DWORD     2 DUP (?)
  hbmpItem      HBITMAP  ?
MY_MENUITEMINFO ENDS
;*****************************************************************************************
.CONST
szIconName      LABEL   BYTE
szClassName     DB      "DRAW5",0
szAppName       DB      "¶W²³æø¹Ï",0
szText          DB      "DRAW5¶È¯àø»s¾ò¶ê»P¤âø¹Ï",0dh,0ah,"¡A¥B¤£¯à¦sÀɤ]¤£¯à½s¿è¡C",0
szMouseFmt      DB      "(%03d,%03d)",0
szColor         DB      "¶Â¦â¬õ¦âºñ¦âÂŦâ"
szClear         DB      5 DUP ("¡@")
szQuit          DB      "Â÷¶}",0
szView          DB      "À˵ø",0
szXy            DB      "®y¼Ð",0
szPenColor      DB      "µeµ§ÃC¦â",0
szDraw          DB      "ø¹Ï",0
szEllipse       DB      "¾ò¶ê",0
szTrace         DB      "¤âø¹Ï",0
szBlack         DB      "¶Â",0
szRed           DB      "¬õ",0
szGreen         DB      "ºñ",0
szBlue          DB      "ÂÅ",0
szHelp          DB      "À°§U",0
;*****************************************************************************************
         ⁝
  .case WM_CREATE
      ;«Ø¥ß¥\¯àªí¡A¨Ã±N¨ä³]¬°¥D¿ï³æ
        call    CreateMenu
        mov     hMenu,rax
        invoke  SetMenu,hWnd,hMenu
      ;¦b¥D¥\¯àªí¤¤´¡¤J¡uÂ÷¶}¡v¿ï¶µ
        mov     mii.cbSize,SIZEOF mii
        mov     mii.fMask,MIIM_STRING or MIIM_ID
        lea     r10,szQuit
        mov     mii.wID,IDM_QUIT
        mov     mii.dwTypeData,r10
        invoke  InsertMenuItem,hMenu,0,TRUE,ADDR mii
      ;¦b¥D¥\¯àªí¤¤´¡¤J¡uÀ˵ø¡v¤l¥\¯àªí
        call    CreateMenu
        mov     hViewSubMenu,rax
        mov     mii.fMask,MIIM_SUBMENU or MIIM_STRING
        lea     r11,szView
        mov     mii.hSubMenu,rax
        mov     mii.dwTypeData,r11
        invoke  InsertMenuItem,hMenu,1,TRUE,ADDR mii
      ;¦b¥D¥\¯àªí¤¤´¡¤J¡uø¹Ï¡v¤l¥\¯àªí
        call    CreateMenu
        mov     hDrawSubMenu,rax
        lea     r10,szDraw
        mov     mii.hSubMenu,rax
        mov     mii.dwTypeData,r10
        invoke  InsertMenuItem,hMenu,2,TRUE,ADDR mii
      ;¦b¥D¥\¯àªí¤¤´¡¤J¡uÀ°§U¡v¿ï¶µ
        mov     mii.fMask,MIIM_TYPE or MIIM_ID
        mov     mii.fType,MFT_STRING or MFT_RIGHTJUSTIFY
        lea     r11,szHelp
        mov     mii.wID,IDM_HELP
        mov     mii.dwTypeData,r11
        invoke  InsertMenuItem,hMenu,3,TRUE,ADDR mii
      ;¦b¡uÀ˵ø¡v¤l¥\¯àªí¤¤´¡¤J¡u®y¼Ð¡v¿ï¶µ
        mov     mii.fMask,MIIM_STRING or MIIM_ID or MIIM_STATE
        mov     mii.fState,MFS_CHECKED
        lea     r10,szXy
        mov     mii.wID,IDM_XY
        mov     mii.dwTypeData,r10
        invoke  InsertMenuItem,hViewSubMenu,0,TRUE,ADDR mii
      ;¦b¡uÀ˵ø¡v¤l¥\¯àªí¤¤´¡¤J¡uµeµ§ÃC¦â¡v¿ï¶µ
        lea     r11,szPenColor
        mov     mii.wID,IDM_COLOR
        mov     mii.dwTypeData,r11
        invoke  InsertMenuItem,hViewSubMenu,1,TRUE,ADDR mii
      ;¦b¡uø¹Ï¡v¤l¥\¯àªí¤¤´¡¤J¡u¾ò¶ê¡v¿ï¶µ
        mov     mii.fMask,MIIM_STRING or MIIM_ID
        lea     r10,szEllipse
        mov     mii.wID,IDM_ELLIPSE
        mov     mii.dwTypeData,r10
        invoke  InsertMenuItem,hDrawSubMenu,0,TRUE,ADDR mii
      ;¦b¡uø¹Ï¡v¤l¥\¯àªí¤¤´¡¤J¡u¤âø¹Ï¡v¿ï¶µ
        mov     mii.fMask,MIIM_STRING or MIIM_ID or MIIM_STATE or MIIM_FTYPE
        lea     r11,szTrace
        mov     mii.wID,IDM_TRACE
        mov     mii.dwTypeData,r11
        mov     mii.fState,MFS_CHECKED
        mov     mii.fType,MFT_RADIOCHECK
        mov     mii.hbmpChecked,0
        invoke  InsertMenuItem,hDrawSubMenu,1,TRUE,ADDR mii
      ;¦b¡uø¹Ï¡v¤l¥\¯àªí¤¤´¡¤J¤À¹j½u
        mov     mii.fMask,MIIM_FTYPE
        mov     mii.fType,MFT_SEPARATOR
        invoke  InsertMenuItem,hDrawSubMenu,2,TRUE,ADDR mii
      ;¦b¡uø¹Ï¡v¤l¥\¯àªí¤¤´¡¤J¡u¶Â¡v¿ï¶µ
        mov     mii.fMask,MIIM_STRING or MIIM_ID or MIIM_STATE or MIIM_FTYPE
        lea     r10,szBlack
        mov     mii.wID,IDM_BLACK
        mov     mii.dwTypeData,r10
        mov     mii.fState,MFS_CHECKED
        mov     mii.fType,MFT_RADIOCHECK
        invoke  InsertMenuItem,hDrawSubMenu,3,TRUE,ADDR mii
      ;¦b¡uø¹Ï¡v¤l¥\¯àªí¤¤´¡¤J¡u¬õ¡v¿ï¶µ
        mov     mii.fMask,MIIM_STRING or MIIM_ID
        lea     r11,szRed
        mov     mii.wID,IDM_RED
        mov     mii.dwTypeData,r11
        invoke  InsertMenuItem,hDrawSubMenu,4,TRUE,ADDR mii
      ;¦b¡uø¹Ï¡v¤l¥\¯àªí¤¤´¡¤J¡uºñ¡v¿ï¶µ
        lea     r10,szGreen
        mov     mii.wID,IDM_GREEN
        mov     mii.dwTypeData,r10
        invoke  InsertMenuItem,hDrawSubMenu,5,TRUE,ADDR mii
      ;¦b¡uø¹Ï¡v¤l¥\¯àªí¤¤´¡¤J¡uÂÅ¡v¿ï¶µ
        lea     r11,szBlue
        mov     mii.wID,IDM_BLUE
        mov     mii.dwTypeData,r11
        invoke  InsertMenuItem,hDrawSubMenu,6,TRUE,ADDR mii
      ;§ó·s¥D¿ï³æ¥~Æ[
        invoke  DrawMenuBar,hWnd
         ⁝
;*****************************************************************************************
END     main

¸Ñ»¡

DRAW5.ASM ²Ä 27¡ã29 ¦æ¡A«Å§i¤F¤T­Ó±`¼Æ MIIM_STRING¡BMIIM_BITMAP¡BMIIM_FTYPE¡A¨ä¹ê¦b winuser.inc ¤¤¦³«Å§i³o¤T­Ó±`¼Æ¡A¦ý¬O¦³±ø¥ó¡A¥²¶·«Å§i WINVER ±`¼Æ¥B¨ä­È¬° 500H ©Î§ó¤j¤~¦æ¡C¦b winuser.inc ­ì¨Óªºªºµ{¦¡¬O¡G

if (WINVER ge 0500h)
MIIM_STRING	EQU	00000040h
MIIM_BITMAP	EQU	00000080h
MIIM_FTYPE	EQU	00000100h
  ⁝
endif

¦]¦¹¡A¦pªG DRAW5.ASM ¤¤¡A¦b¡uINCLUDE WINDOWS.INC¡v¤§«e¡A¦³«Å§i WINVER ±`¼Æ¦Ü¤Ö¬° 500H¡A¨º»ò´N¥i¥H¬Ù²¤²Ä 27¡ã29 ¦æ¡A¦Ü©ó MENUITEMINFO µ²ºcÅ骺¿ù»~½Ð°Ñ¦Òµù¤@¡C

±µ¤U¨Ó¬Ý²Ä 202¡ã205 ¦æ¡A³o¥|¦æ«ü¥O¬O©I¥s CreateMenu «Ø¥ßªÅªº¥\¯àªí¡A¦A©I¥s SetMenu ³]©w DRAW5 µøµ¡ªº¥\¯àªí¬°­è­è«Ø¥ßªº¥\¯àªí¡C±µ¤U¨Ó¬O¦b³o·s«Øªº¥\¯àªí¤¤¡A²K¥[¿ï¶µ¡B¼u¥X¿ï¶µ¡C³oùحȱo¤@´£ªº¬O¡A¦pªG«Ø¥ß¥\¯àªí¤§«á¡A¥ý¦bªÅªº¥\¯àªí²K¥[¿ï¶µ¡B¼u¥X¿ï¶µ¡A¦A©I¥s SetMenu ³]©w¥\¯àªí¤]¥i¥H¡C

DRAW5 ªº¥D¥\¯àªí¦³¨â­Ó¿ï¶µ¡B¨â­Ó¼u¥X¿ï¶µ¡A¨Ï¥ÎªÌÂI¿ï¼u¥X¿ï¶µ·|¥X²{¤l¥\¯àªí¡A¦Ó³o¨Ç¤l¥\¯àªí¦³¨Ç¨ã✔ªº¤Ä¿ïª¬ºA¡A¦³¨Ç¨ã¦³●ªº¤Ä¿ïª¬ºA¡C©³¤U±N°w¹ï³o¨Ç¤£¦Pªºª¬ªp»¡©ú¡A¥ý»¡©ú³Ì²³æªº±¡ªp¡A¨S¦³¤Ä¿ïª¬ºAªº¿ï¶µ¡C

¨S¦³¤Ä¿ïª¬ºAªº¿ï¶µ³Ì³æ¯Â¡A¥¦³Ì­«­nªºÄݩʬO¦WºÙ»PÃѧO½X¡A¦WºÙ¬O¥H¹sµ²§Àªº¦r¦ê¡AÃѧO½X«h¬O¤Q¤»¦ì¤¸ªºµL¸¹¼Æ¡A­n³]©w³o¨âºØÄÝ©Ê¡A±N MENUITEMINFO ªº fMask ³]¬° MIIM_STRING or MIIM_ID¡C¦]¬°¦³ MIIM_STRING ©Ò¥HÁÙ­nÄ~Äò³]©w dwTypeData ¬°ªí¥Ü¦WºÙ¦r¦êªº¦ì§}¡A¦]¬°¦³ MIIM_ID ©Ò¥H­n³]©w wID¡C¨£²Ä 207¡ã212 ¦æ¡C¦¹¥~¡A¦pªG¥ý¤£³]©w¿ï¶µÃѧO½X¡Aµ¥´¡¤J¿ï¶µ¤§«á¦A³]¤]¬O¥i¥Hªº¡A¨Ò¦p¤U­±ªºµ{¦¡½X¡G

        mov     mii.cbSize,SIZEOF mii
        mov     mii.fMask,MIIM_STRING
        lea     r10,szQuit
        mov     mii.dwTypeData,r10
        invoke  InsertMenuItem,hMenu,0,TRUE,ADDR mii
        mov     mii.fMask,MIIM_ID
        mov     mii.wID,IDM_QUIT
        invoke  SetMenuItemInfo,hMenu,0,TRUE,ADDR mii

¦pªG¤Ï¹L¨Ó¡A¥ý©I¥s InsertMenuItem ®É¤w³]¦nÃѧO½X¡A¦A©I¥s SetMenuItemInfo ³]©w¿ï¶µ¦WºÙ¡A¸Ó¿ï¶µ¤£¯à¥¿±`¹B§@¡C¤p¤ì°¸¤£ª¾¹D½T¤Áªº­ì¦]¡A±À´ú¬O¿ï¶µ¦WºÙ¬O¿ï¶µ¤¤³Ì­«­nªº³¡¤À¡A¥²¶·¥ý½T¥ß¦WºÙ¤§«á¡A¦A¹ï¿ï¶µ­×¹¢¡C

·s²K¤W­zªº¿ï¶µÁÙ¦³¥t¤@ºØ¤è¦¡¡AÁöµM³o¬OÂ¥Ϊk¡A¦ýÁÙ¬O»¡¤@»¡¡C§â fMask ³]¬° MIIM_TYPE or MIIM_ID¡A¦A¶i¤@¨B§â fType ³]¬° MFT_STRING¡A³Ì«á©ó dwTypeData ³]©w¦r¦êªº¦ì§}¡A¨£²Ä 228¡ã234 ¦æ¡C§A·|µo²{¨Ï¥Î¤èªk­n¤T¨BÆJ¡F¦Ó¤W¤@ºØ¤èªk¶È¨â¨BÆJ¡C

¦p¦ó¥H InsertMenuItem ²K¥[¼u¥X¿ï¶µ©O¡H¼u¥X¿ï¶µ¨S¦³¿ï¶µÃѧO½X¡A¦ý¥²¶·¦³¦WºÙ»P¤l¥\¯àªí¥N½X¡A³oùتº¤l¥\¯àªí¬O¨Ï¥ÎªÌÂI¿ï¦¹¼u¥X¿ï¶µ«á¥X²{ªº¡C¦]¬°¼u¥X¿ï¶µ¦³¤l¥\¯àªí¡A©Ò¥H¥²¶·¥ý©I¥s CreateMenu «Ø¥ß¤@¥\¯àªí¡A¦A§â fMask ³]¬° MIIM_SUBMENU or MIIM_STRING¡A±µµÛ±N MENUITEMINFO ¤¤ªº hSubMenu Äæ¦ì³]¬° CreateMenu «Ø¥ßªº¥\¯àªí¥N½X¡C³Ì«á±N dwTypeData ³]¬°¤@­Ó¥H¹sµ²§Àªº¦r¦ê¤§¦ì§}¡A¦¹¦r¦ê´N¬O¼u¥X¿ï¶µªº¦WºÙ¡C¨£ DRAW5.ASM ²Ä 213¡ã220 ¦æ¡C

¦p¦ó²K¥[¨ã¦³✔¤Ä¿ïª¬ºAªº¿ï¶µ©O¡H¨ä¹ê¤£Ãø¡A¸ò«e­±³]©w¤£¨ã¤Ä¿ï¿ï¶µÃþ¦ü¡A¥u¬O¦h¤F­n±N¨ä³]¬°¤Ä¿ïª¬ºA¡C¸Ô²Óªº»¡´N¬O¥ý§â MENUITEMINFO ªº fMask ³]¬° MIIM_STRING or MIIM_ID or MIIM_STATE¡A±µ¤U¨Ó¿ï¶µ¦WºÙ»PÃѧO½X¸ò«e­±¬Û¦P¡A¦ý¦h¤F¤@¨B§â MENUITEMINFO ªº fState Äæ¦ì³]¬° MFS_CHECKED¡C¨£²Ä 235¡ã241 ¦æ¡C

¦p¦ó²K¥[¨ã¦³●¤Ä¿ïª¬ºAªº¿ï¶µ©O¡H¨ã¦³●¤Ä¿ïª¬ºA¡A¥²¶·¥ý³]¨ä¬°¤Ä¿ïª¬ºA¡AµM«á¤~¯à±N¨ä¶i¤@¨B³]¬°●ªºª¬ºA¡C©Ò¥H¥ý§â MENUITEMINFO ªº fMask ³]¬° MIIM_STRING or MIIM_ID or MIIM_STATE or MIIM_FTYPE¡A«e­±¤w¸g¸ÑÄÀ¹L«e¤TºØ¡A³Ì«á¤@­Ó MIIM_FTYPE¡A¥²¶·§â fType ³]¬° MFT_RADIOCHECK¡C¨£²Ä 253¡ã261 ¦æ¡C

³Ì«á¤@ºØ¡A¦p¦ó³]©w¤À¹j½u©O¡H­º¥ý±N fMask Äæ¦ì³]¬° MIIM_FTYPE¡AµM«á¦A§â fType ³]¬° MFT_SEPARATOR¡C¨£²Ä 262¡ã265 ¦æ¡C


µù¸Ñ

µù¤@¡GMENUITEMINFO µ²ºcÅé

¦b MASM64 SDK »P WinInc ¤¤¡AMENUITEMINFO µ²ºcÅ骺©w¸q¤À§O win64.inc »P winuser.inc ¥]§tÀɤº¡A¨ä¤º®e¦p¤U¡G

MASM64 win64.incWinInc winuser.inc¤p¤ì°¸
MENUITEMINFO    STRUCT
  cbSize        UINT      ?
  fMask         UINT      ?
  fType         UINT      ?
  fState        UINT      ?
  wID           UINT      ?
                DWORD     ?
  hSubMenu      HMENU     ?
  hbmpChecked   HBITMAP   ?
  hbmpUnchecked HBITMAP   ?
  dwItemData    ULONG_PTR ?
  dwTypeData    LPTSTR    ?
  cch           UINT      ?
                DWORD     ?
  hbmpItem      HBITMAP   ?
MENUITEMINFO    ENDS
MENUITEMINFOA   STRUCT
  cbSize        DWORD     ?
  fMask         DWORD     ?
  fType         DWORD     ?
  fState        DWORD     ?
  wID           DWORD     ?
  hSubMenu      HMENU     ?
  hbmpChecked   HBITMAP   ?
  hbmpUnchecked HBITMAP   ?
  dwItemData    ULONG_PTR ?
  dwTypeData    LPSTR     ?
  cch           DWORD     ?
  if (WINVER ge 0500h)
    hbmpItem    HBITMAP   ?
  endif
MENUITEMINFOA   ENDS
MENUITEMINFO    STRUCT 
  cbSize        DWORD     ?
  fMask         DWORD     ?
  fType         DWORD     ?
  fState        DWORD     ?
  wID           DWORD     2 DUP(?)
  hSubMenu      HMENU     ?
  hbmpChecked   HBITMAP   ?
  hbmpUnchecked HBITMAP   ?
  dwItemData    ULONG_PTR ?
  dwTypeData    LPSTR     ?
  cch           DWORD     2 DUP (?)
  hbmpItem      HBITMAP	  ?
MENUITEMINFO    ENDS

¦ý³o¨â­Ó©w¸q³£¬O¿ùªº¡C¤£½×¬O 32 ¦ì¤¸ÁÙ¬O 64 ¦ì¤¸ªº Windows ¤¤¡AUINT ¥NªíµL¸¹¾ã¼Æ¡]unsigned integer¡^¡Aªø«×À³¬° DWORD¡A¦ý¦b win64.inc ¤¤»~´Ó¬° QWORD¡CWinInc ¤¤ªº MENUITEMINFO ¦b winuser.inc ¤¤«Å§i¡A¨ä¤¤ªº wID »P cch ¨âÄæ¦ìªø«×¬° DWORD ¬O¨S¿ù¡A¦ý¬O¤ñ¥¦­Ì°ª¥|­Ó¦ì¤¸²Õªº¦ì§}¬O¤@­ÓªÅ¤U¨Ó¨S¨Ï¥ÎªºÂù¦r²Õ¡A©Ò¥H¥¦­Ìªº¤U¤@­ÓÄæ¦ìªº¦ì§}¥²¶·¦A¤ñ¥¦­Ìªº¦ì§}¼W¥[¤K­Ó¦ì¤¸²Õ¤~¹ï¡C¤p¤ì°¸´¿¼¶¼gµ{¦¡¡A©I¥s GetMenuItemInfo ¤Ï¦V±À½×¦ÓÅçÃÒ¦¹¤@·Qªk¡A¨Ã±N¥¿½Tªº MENUITEMINFO µ²ºcÅé¼g¦b¤Wªí³Ì¥kÄæ¡C

¥t¥~¡AWinInc ¤¤ªº MENUITEMINFO ¦³¨â­Óª©¥»¡A¤À§O¹ïÀ³ ANSI ½s½Xªº¦r¦ê»P¼e¦r¤¸½s½Xªº¦r¦ê¡C¥¦­Ì¤§¶¡ªº®t§O¥u¦³ dwTypeData Äæ¦ìªº¸ê®ÆÃþ«¬¤£¦P¡A«eªÌ¬O LPSTR¡A«áªÌ¦p¤U¡G

dwTypeData  LPWSTR  ?

¤£¹L¡A¤£½×¬O LPSTR ©Î LPWSTR¡A¹ê»Ú¤W³£¬O QWORD¡A¥¦­Ì³£¥Nªí¦r¦ê¦ì§}¡A¨ä¹ê¬O¨S¦³®t§O¡C