³o¤@³¹ÁÙ¬O½Í¥\¯àªí¡A¦ý¬O§ï¥Î¥H©I¥s CreateMenu¡BInsertMenuItem¡BSetMenu µ¥ Win64 API ¨Ó«Ø¥ß¥D¥\¯àªí¡A¦Ó¤£¦A¨Ï¥Î¸ê·½´yzÀɤ¤ªº 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
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
¦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
°£¤F InsertMenuItem ¨Ï¥Î MENUITEMINFO µ²ºcÅ餧¥~¡AÁÙ¦³ GetMenuItemInfo »P SetMenuItemInfo ¤]¨Ï¥Î¡C©³¤U¬O MENUITEMINFO ¤ºªº¦UÄæ¦ì¡]µù¤@¡^¡G
MENUITEMINFO STRUCT cbSize DWORD ? ;MENUITEMINFO ªºªø«×¡A¥H¦ì¤¸²Õ³æ¦ì fMask DWORD ? ;ºX¼Ð¡A«ü©wn¦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¡CY¨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ªGn¤@¦¸³]©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¦ì¤¸¹ÏÅã¥Ü¡AnÅã¥Üªº¦ì¤¸¹Ï¥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
|
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
|
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Ӧ줸¡AY¬°¤@ªí¥Ün¨M©w¤F¬YÓª«¥óªº©Ê½è¡AY¬°¹sªí¥Ü¨S¦³¦¹©Ê½è¡C
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¡FY¥¢±Ñ¡A¦^¶ÇȬ°¹s¡C
³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¸¹¼Æ¡An³]©w³o¨âºØÄÝ©Ê¡A±N MENUITEMINFO ªº fMask ³]¬° MIIM_STRING or MIIM_ID¡C¦]¬°¦³ MIIM_STRING ©Ò¥HÁÙnÄ~Äò³]©w dwTypeData ¬°ªí¥Ü¦WºÙ¦r¦êªº¦ì§}¡A¦]¬°¦³ MIIM_ID ©Ò¥Hn³]©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¤Wzªº¿ï¶µÁÙ¦³¥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²{¨Ï¥Î¤èªkn¤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¤Fn±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
¦b MASM64 SDK »P WinInc ¤¤¡AMENUITEMINFO µ²ºcÅ骺©w¸q¤À§O win64.inc »P winuser.inc ¥]§tÀɤº¡A¨ä¤º®e¦p¤U¡G
MASM64 win64.inc | WinInc 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