«e¨â³¹½Í¨ì¤F¸ê·½´yzÀÉ¡A¤¶²Ð¤F¤TºØ¸ê·½¡G¹Ï¥Ü¡B·Æ¹«´å¼Ð»P¦ì¤¸¹Ï¡C±µ¤U¨Óªº´X³¹±N¦A±µ¦A¼F¡A¤¶²Ð¥t¤@ºØ¸ê·½¡A¥\¯àªí¡]menu¡A¤]¦³¤åÄm½Ķ¦¨¿ï³æ¡A¤j³°Â½¦¨µæ³æ¡^¡C
¦b Windows §@·~¨t²Î¤¤¡A¨Ì¾Ú¥X²{¦ì¸m¡A¥\¯àªí¥i¤À¬°¤U¦C¤TºØ¡G
¤@¯ë¦Ó¨¥¡A·íµøµ¡«Ø¥ß¦¨¥\¨ÃÅã¥Ü©ó¿Ã¹õ¤W¡A¥D¥\¯àªí´N·|¥X²{¡A¬O³Ì®e©ö¬°¨Ï¥ÎªÌµo²{¡A©Ò¥H¥»³¹ªº«ÂI¦b©ó¥D¥\¯àªí¡A¤U¤@³¹¦A¤¶²Ð§Ö±¶¥\¯àªí»P¨t²Î¥\¯àªí¡C
¦b¥\¯àªí¤Wªº¶µ¥Ø¡A¤À¬°¤TºØ¡G①¿ï¶µ¡]menuitem¡^¡B②¼u¥X¿ï¶µ¡]pop menu¡^¡B③¤À¹j½u¡]separator¡^¡C¤À¹j½u¥u¬Oµøı¤Wªº§@¥Î¡A¥Î¨Ó¤ÀÃþ¥\¯àªí¤W¤£¦PºØÃþªº¿ï¶µ¡C¿ï¶µ¤Î¼u¥X¿ï¶µªº®t§O¦b©ó·í¨Ï¥ÎªÌ¿ï¾Ü¿ï¶µ«á¡A¥\¯àªí·|®ø¥¢¡AÀ³¥Îµ{¦¡´N§¹¦¨¸Ó¿ï¶µ©Ò«ü©wªº¤u§@¡F¨Ï¥ÎªÌ¿ï¾Ü¼u¥X¿ï¶µ®É¡A·|¥X²{¥t¤@Ó§ó¸Ô²Óªº¥\¯àªí¡A¦A¨Ñ¨Ï¥ÎªÌ¿ï¾Ü¡A³oºØ§ó¸Ô²Óªº¥\¯àªíºÙ¬°¡u¤l¥\¯àªí¡v¡]submenu ©Î popup menus¡A¤]½¦¨¤l¿ï³æ©Î¤U©Ô¦¡¥\¯àªí¡^¡C¤@¯ë¦Ó¨¥¡A¼u¥X¿ï¶µ¥kÃ䦳ӽb¸¹¡Aªí¥ÜÂIÀ»«á·|¥X²{¤l¥\¯àªí¡C
¹³¤W¹ÏªºÀ³¥Îµ{¦¡¡A¤pµe®aªº¥D¿ï³æ¥]§tÀɮסB½s¿è¡BÀ˵ø¡B¼v¹³¡B¦â±m¡B»¡©ú¡A¥¦Ì³£¬O¼u¥X¿ï¶µ¡A¥¦Ì¥iµø¬°²Ä¤@¼h¥\¯àªí¡C·í¨Ï¥ÎªÌ¿ï¾Ü¥D¥\¯àªí¤¤ªºÀ˵ø®É¡A·|¥X²{¤l¥\¯àªí¡A¬°²Ä¤G¼h¥\¯àªí¡A¥]§t¤F¤u¨ã½c¡B¦â¶ô¡Bª¬ºA¦C¡B¤å¦r¤u¨ã¦C¡BÀ˵øÂI°}¹Ïµ¥§¡¬°¿ï¶µ¡F¦ÓÁY©ñ¬O¼u¥X¿ï¶µ¡A¦pªG¿ï¾Ü¥¦¡A¤S·|¦A¥X²{¤@Ó¡u¤l¥\¯àªí¡v¡A¬°²Ä¤T¼h¥\¯àªí¡C³oÓ¤l¥\¯àªí¥»À³¬O¡u®]¥\¯àªí¡v¡A¦ý³o¼Ë¤Ó³Â·Ð¤F¡C§Ú̳W©w¡A³Ì¤W¼hªº¬O¥D¥\¯àªí¡A¤§«á¥Ñ¼u¥X¿ï¶µ¤Þµoªº³£ºÙ¬°¤l¥\¯àªí¡C
¤W±¨Ò¤l¤¤ªº¤u¨ã½c¡B¦â¶ô¡Bª¬ºA¦C¡B¤å¦r¤u¨ã¦Cµ¥¡AºÙ¬°¿ï¶µ¡]menuitem¡^¡A¿ï¶µ¨ã¦³©³¤UªºÄÝ©Ê¡G
¦³Ãö¥\¯àªíªº°T®§«Ü¦h¡A¨ä¤¤³Ì«nªº¬O WM_COMMAND¡C·í¨Ï¥ÎªÌ¥H·Æ¹«ÂI¿ï¥\¯àªí¤¤ªº¬YÓ¤w±Ò¥Îªº¿ï¶µ®É¡A·|²£¥Í WM_COMMAND °T®§¡C¤£¹L¯à²£¥Í WM_COMMAND °T®§ªº¤£¶È¶È¥\¯àªí¡A¤l±±¨î¶µ»P¥[³tÁä¤]³£¯à²£¥Í WM_COMMAND °T®§¡C¾ã²z¦p¤Uªí¡G
¨Æ¥ó | wParam | lParam | |
16¡ã31 ¦ì¤¸ | 0¡ã15 ¦ì¤¸ | ||
¨Ï¥ÎªÌÂIÀ»¿ï¶µ ©Î«ö¤U§U¾ÐÁä | 0 | ¿ï¶µÃѧO½X | 0 |
¨Ï¥ÎªÌ«ö¤U¥[³tÁä | 1 | ¥[³tÁäÃѧO½X | 0 |
¨Ï¥ÎªÌÂIÀ»±±¨î¶µ | ³qª¾½X | ±±¨î¶µÃѧO½X | ±±¨î¶µ¥N½X |
°²¦p¦³¤@Óµ{¦¡¡A¦³¥\¯àªí¡B§U¾ÐÁä¡B±±¨î¶µ¡B¥[³tÁä¡An°Ï¤À¨Ï¥ÎªÌ¨ì©³¬OÂI¿ïþ¤@Ó¡A¬d¾\¤Wªí´N¯àª¾¹D¡C¦pªG¨Ï¥ÎªÌÂI¿ï¿ï¶µ¡A¨º»ò WM_COMMAND ¤¤ªº lParam ¬°¹s¡A¥B wParam ªº°ª¦r²Õ¡]§Y²Ä 16¡ã31 ¦ì¤¸¡^¥ç¬°¹s¡Cµ{¦¡¥i¥H¥Ñ WM_COMMAND ¤¤¡AwParam ªº²Ä 0¡ã15 ¦ì¤¸¡A´N¯àª¾¹D¨Ï¥ÎªÌÂI¿ï¤Fþӿﶵ¡C
·í Windows §Y±NÅã¥Ü¤l¥\¯àªí®É¡A·|²£¥Í WM_INITMENUPOPUP °T®§¡A¦¹°T®§¤@¯ë±¡§Î·|¥æµ¹ DefWindowProc ³B²z¡C¦ý¬O¦pªGn¦b¤l¥\¯àªí¤¤±Ò¥Î©Î¸T¥Î¬Y¨Ç¿ï¶µ¡A¨º´Nn³B²z WM_INITMENUPOPUP °T®§¡C¨Ò¦p¤å®Ñ³B²z³nÅé¦b©|¥¼½Æ»s¤å¦r«e¡AÀ³¸Ó¸T¥Î¡u¶K¤W¡v¿ï¶µ¡CWM_INITMENUPOPUP °T®§¤¤ªº wParam ¬O¤l¥\¯àªí¥N½X¡AlParam ªº²Ä 0¡ã15 ¦ì¤¸¬O¼u¥Xªº¤l¥\¯àªí¦ì©ó²Ä´XÓ¦ì¸m¡A²Ä 16¡ã31 ¦ì¤¸¬O¥Nªí¬O§_¬°¨t²Î¥\¯àªí¡A¦p¬°¨t²Î¥\¯àªí¸Ó¼ÆȬ°¤@¡A§_«h¬°¹s¡C
«Ø¥ß¥\¯àªíªº¤èªk¡A³Ì±`¥Îªº¬O¦b¸ê·½´yzÀɤ¤«Ø¥ß MENU °Ï¶ô¡AMENU ¤£¹³ ICON ©Î CURSOR »Ýn¥Î¨ìÃB¥~ªºÀɮסA¥¦¥i¥Hª½±µ¦b¸ê·½´yzÀɤ¤ª½±µ¥H¤å¦r´yz¡CMENU °Ï¶ôªº®æ¦¡¦p¤U¡J
MenuTableName MENU [optional-statements] BEGIN MENUITEM text, ID [,option] ⁝ END
MenuTableName ¬O¦b 1 ¨ì 65535 ¤§¶¡ªº¥¿¾ã¼Æ¡A¦¹¬°¥\¯àªíÃѧO½X¡F¦ý MenuID ¤]¥i¥H¬O¦r¦ê¡A§Y¬°¥\¯àªí¦WºÙ¡CÁöµM¨âªÌ§¡¥i¡A¦ý¦bì©lµ{¦¡¤¤¡A¥²¶·¬Û¤¬°t¦X¡A¤]´N¬O»¡¦pªG¦b¸ê·½´yzÀɤ¤ªº MenuID ¬O¥¿¾ã¼Æ¡A¨º»òì©lµ{¦¡¤¤¸ü¤J¥\¯àªí®É¤]n¥H¬Û¦Pªº¥¿¾ã¼Æ¬°°Ñ¼Æ©I¥s LoadMenu¡F¤Ï¤§¥çµM¡C
optional-statements ¦b¤@¹ï¡u[¡v¡B¡u]¡v¤º¥Nªí¥i¥H¥þ³¡¬Ù²¤¡A¤]¥i¥H¬O¥X²{¤U±¤@ºØ¡B¨âºØ©Î¥þ³£¥X²{±¡§Î¡G
¦b BEGIN¡þEND ¤§¶¡ªº¤º®e¡A¬O¨Cӿﶵªº©w¸q¡ABEGIN¡þEND ¤]¥i¥H¥Î¤@¹ï¡u{¡v¡B¡u}¡v¥N´À¡C¦b BEGIN¡þEND ©Î¤@¹ï¤j¬A¸¹¤§¶¡¥i¥H¨Ï¥Î¨âºØ±Ôz¡G
MENUITEM text, ID [,option] MENUITEM SEPARATOR
¨ä¤¤ªº¡utext¡v¬O¥H¤@¹ï¤Þ¸¹¡A¤]´N¬O¨âÓ¡u"¡v¥]§t¦íªº¦r¦ê¡A¤£¥i¨Ï¥Î¡u'¡v¡A¦¹¦r¦ê·|Åã¥Ü¦b¥\¯àªí¤W±¡Ctext ¤º¥i¥H¥]§t¡u\T¡v©Î¡u\t¡v¦r¤¸¡A¦b³o¦r¤¸¤§«áªº¤å¦r·|¦V¥k¹ï»ô¡A³q±`¥Î¨Óªí¥Ü¥[³tÁä¡Ctext ¤]¥i¥H¥]§t¡u&¡v¦r¤¸¡Aºò±µµÛ¡u&¡v¤§«áªº¦r¤¸¡A·|¦b¨Ï¥ÎªÌ«ö¤U ALT Á䤧«á·|¥X²{©³½u¡A¸Ó¦r¤¸ªº«öÁäºÙ¬°¦s¨úÁä¡C¡]¡u\t¡v»P¡u&¡vªº¨Ò¤l¨£²Ä¤Q¤E³¹¡^
ID ¬O¿ï¶µÃѧO½X¡A¬O¦b 1 ¨ì 65535 ¤§¶¡ªº¾ã¼Æ¡A·í¨Ï¥ÎªÌ¿ï¾Ü¦¹¿ï¶µ«á¡A¿ï¶µÃѧO½X·|ÀHµÛ WM_COMMAND °T®§¶Ç°e¦Üµøµ¡¨ç¦¡¤§¤¤¡C
MENUITEM ³Ì«á±ªº¡uoption¡v¥H¤¤¬A¸¹¡][ ]¡^¬A¦í¡Aªí¥Ü¥i¥H¬Ù²¤¡A¦pªG¤£¬Ù²¤®É¥i¥H¥Î¤U±´XºØ¡AY¶W¹L¤@ºØ®É¥H¡u,¡v¹j¶}¡C
¡uMENUITEM SEPARATOR¡v·|¦b¥\¯àªí¤Wµe¥X¾î½u¡A¥Nªí¤À¹j¤§·N¡A¦b¤À¹j½u¤W¤è»P¤U¤èªº¿ï¶µ©Ò¥Nªíªº¥\¯à¨Ã¤£¬ÛÃö¡C
②¡BPOPUP¡G¥Î©ó©w¸q¼u¥X¿ï¶µ¡A¨ä»yªk¦p¤U¡G
POPUP text[,option] { ⁝ }
·í¨Ï¥ÎªÌÂI¿ï¼u¥X¿ï¶µ®É¡A·|¥X²{¤l¥\¯àªí¡A¤l¥\¯àªí©w¸q¦b POPUP ¤§«áªº¤@¹ï¤j¬A¸¹¤º¡A¤j¬A¸¹¤]¯à¥Î¡uBEGIN¡v©M¡uEND¡v¥N´À¡C¦b³o¹ï¤j¬A¸¹©Î¡uBEGIN/END¡v¤§¶¡¥i¥H¬O MENUITEM¡A¤]¥i¥H¬O¥t¤@Ó POPUP¡C¦pªG¬O¥t¤@Ó POPUP¡A¨º»ò´Nªí¥Ü³o¥\¯àªí¦³¦n´X¼h¡C¦b POP ¤§«áªº text »P option »P«ez MENUITEM ¤§«áªº¬Û¦P¡C
©³¤U¨Ó¬Ý¨âÓ§¹¾ãªº MENU ¨Ò¤l¡C¥ý¨Ó¬Ý¥ªÃ䪺¨Ò¤l¡A¥¦©Ò²£¥Íªº¥D¥\¯àªí¦bªí¤U±ªº¥ª¹Ï¡Aª`·N¨ì MENU °Ï¶ô¤¤¡Aµµ¬õ¦âªº¡u,CHECKED,MENUBREAK¡v¡A¨Ï±o¡u¶Â¡v¿ï¶µ«e¦³Ó¡u✔¡v°O¸¹¡A¦P®É¦Û³oÓ¡u¶Â¡v¿ï¶µ¶}©l¡AÅã¥Ü©ó¤l¥\¯àªí¦h¥Xªº¤@¦æ¡C¦Aª`·N¨ì¥Õ¦â¦rªº¡u,HELP¡v¨Ï±o±q¡uÀ°§U¡v¿ï¶µ¶}©lÅã¥Ü¦b¥D¥\¯àªíªº¥kÃä¡C
DRAW2 MENU { MENUITEM "Â÷¶}",IDM_QUIT POPUP "À˵ø" { MENUITEM "®y¼Ð",IDM_XY,CHECKED MENUITEM "µeµ§ÃC¦â",IDM_COLOR,CHECKED } POPUP "ø¹Ï" { MENUITEM "¾ò¶ê",IDM_ELLIPSE MENUITEM "¤âø¹Ï",IDM_TRACE,CHECKED MENUITEM "¶Â",IDM_BLACK,CHECKED,MENUBREAK MENUITEM "¬õ",IDM_RED MENUITEM "ºñ",IDM_GREEN MENUITEM "ÂÅ",IDM_BLUE } MENUITEM "À°§U",IDM_HELP,HELP } |
DRAW2 MENU { MENUITEM "Â÷¶}",IDM_QUIT POPUP "À˵ø" { MENUITEM "®y¼Ð",IDM_XY,CHECKED MENUITEM "µeµ§ÃC¦â",IDM_COLOR,CHECKED } POPUP "ø¹Ï",MENUBARBREAK { MENUITEM "¾ò¶ê",IDM_ELLIPSE MENUITEM "¤âø¹Ï",IDM_TRACE,CHECKED MENUITEM "¶Â",IDM_BLACK,CHECKED,MENUBARBREAK MENUITEM "¬õ",IDM_RED MENUITEM "ºñ",IDM_GREEN MENUITEM "ÂÅ",IDM_BLUE } MENUITEM "À°§U",IDM_HELP } |
²Ä¤GÓ¨Ò¤lªº MENU °Ï¶ô¤º®e¦p¤Wªí¥kÃä¡A¦Ó¨ä²£¥Íªº¥D¥\¯àªí¦p¤W±¥k¹Ï¡Cª`·N¨ìªí¤¤ªºÂŦr¡A¡u,MENUBARBREAK¡v¡A¥¦¨Ï±o±q¡u¶Â¡v¿ï¶µÅã¥Ü¦b¤U¤@¦æ¡A¦ý¨â¦æ¤§¶¡¦³¤@±ø¹]Áè½u¡A³oÂI»P MENUBREAK ¤£¦P¡C¶À¦â¦rªº¡u,MENUBARBREAK¡v¬O¦b²Ä¤@¼h¥\¯àªí¡A¦]¦¹¨Ï¥D¥\¯àªí¦h¤F¤@¦C¡A¤]´N¬O¡uÂ÷¶}¡v¡B¡uÀ˵ø¡v¦P¤@¦C¡A¦Ó¡uø¹Ï¡v¡B¡uÀ°§U¡v¦b¤U¤@¦C¡A¦ý¨â¦C¤§¶¡µL¤ô¥½u¤À¹j¡C
¤W±¨â¨Ò¦³¨Ç·å²«¡A¦pªG¨Ï¥ÎªÌ¥Î¸Óø¹Ïµ{¦¡µe¹Ï¡A¦pªG¿ï¾Ü¶Â¦âµeµ§´N¤£¥i¯à¤S¦P®É¨Ï¥Î¨ä¥L¦âµ§¡A¦]¦¹¤W±¤l¥\¯àªí¤¤ªº¥|ºØÃC¦â¬O¤¬¥¸ªº¡A¤Ä¿ïª¬ºAÀ³¥H●ªí¥Ü¡C¦P¼Ëªº¡A¾ò¶ê»P¤âø¹Ï¤]¬O¤¬¥¸ªº¡C¦ý¤p¤ì°¸¥Î³o¨âÓ¨Ò¤l¥u¬O»¡©ú MENU °Ï¶ô¡A«j±j¤@¥Î¡A¹ê»Ú¼gµ{¦¡®ÉÀ³¥[¥Hקï¡C
¦b¸ê·½´yzÀɤ¤©w¸q¦n¥\¯àªí¤§«á¡A¨Ã¤£¬O¥ß§Y´N¯à¦bµ{¦¡¤¤¬Ý¨£¥\¯àªí¡AÁÙ¥²¶·¦bì©lµ{¦¡¥H¬Y¨Çµ{¦¡½X¸ü¤J¤~¯à¬Ý¨ì¥\¯àªí¡A¤èªk¦³¤T¡G
①¡B¦bµù¥Uµøµ¡Ãþ§O®É¤Þ¥Î¥\¯àªí¡C³oºØ¤è¦¡«Ü³æ¯Â¡A¦b©I¥s RegisterClassEx ¤§«e¡Aª½±µ¦b WNDCLASSEX µ²ºcÅ餤ªº lpszMenuName Äæ¦ì¶ñ¤W¸ê·½´yzÀɤ¤¥\¯àªí¦WºÙ©Î¥\¯àªíÃѧO½X§Y¥i¡C¨Ò¦p©³¤Uªº¨Ò¤l¡A¸ê·½´yzÀɤ¤©w¸qªº¥\¯àªí¬°¡G
DRAW2 MENU { ⁝ }
¨º»ò¦bì©lµ{¦¡¤¤¡A¤Þ¥Î¥\¯àªí®É¡A¥i¥H¨Ï¥Î¤U±¨BÆJ¡G
.DATA szMenuName DB "DRAW2",0 wc WNDCLASSEX <> ⁝ .CODE ⁝ lea rdx,szMenuName mov wc.lpszMenuName,rdx invoke RegisterClassEx,ADDR wc
§ó²³æªº¤èªk¬O¡A¦b¸ê·½´yzÀÉ©w¸q¥\¯àªí®É¡A¤£¨Ï¥Î¦r¦ê§@¬°¥\¯àªí¦WºÙ¡A¦Ó§ï¥Î¥\¯àªíÃѧO½X¡C¦]¬°¥\¯àªíÃѧO½X¬O¤@Ó 1 ¦Ü 65535 ¤§¶¡ªº¾ã¼Æ¡A©Ò¥H¦bì©lµ{¦¡¤¤¡A¥u»Ý§â wc.lpszMenuName ¤§È¦¨§ï¸Ó¾ã¼Æ§Y¥i¡C
②¡B¦b«Ø¥ßµøµ¡®É¤Þ¥Î¥\¯àªí¡C³oºØ¤è¦¡¬O¦b©I¥s CreateWindowEx «Ø¥ßµøµ¡¤§«e¡A¥ý©I¥s LoadMenu API ¨ú±o¸ê·½´yzÀɤ¤ªº¥\¯àªí¥N½X¡AµM«á±N¦¹¥\¯àªí¥N½X°µ¬° CreateWindowEx ªº²Ä¤QӰѼơC¨Ò¦p©³¤Uªº¨Ò¤l¡A°²³]¸ê·½´yzÀɤ¤©w¸qªº¥\¯àªí¸ò¤W±¤è¦¡¤@¼Ë¡A¦Óì©lµ{¦¡¤¤«h¬O¼g¦¨¤U±ªº¼Ë¤l¡G
.DATA szMenuName DB "DRAW2",0 hMenu HMENU ? ⁝ .CODE ⁝ invoke LoadMenu,hInstance,ADDR szMenuName mov hMenu,rax invoke CreateWindowEx,0,OFFSET szClassName,OFFSET szAppName,WS_OVERLAPPEDWINDOW,0,\ 0,400,400,0,hMenu,hInstance,0
③¡B°²¦p¤£¦b¤W±①¡B②±¡ªp¤¤¤Þ¥Î¥\¯àªí¡A¤]¥i¥H¦b³B²z WM_CREATE °T®§®É©I¥s SetMenu API ¤Þ¥Î¥\¯àªí¡C¨Ò¦p©³¤Uªº¨Ò¤l¡G
.DATA szMenuName DB "DRAW2",0 hMenu HMENU ? ⁝ .CODE ⁝ .elseif uMsg==WM_CREATE invoke LoadMenu,hInstance,ADDR szMenuName mov hMenu,rax invoke SetMenu,hWnd,hMenu
¤W±¤w¸g»¡§¹¥Î¤TºØ¤è¦¡¸ü¤J¥\¯àªí¡A¦ý¨ä¤¤¦³¨Ç Win64 API ¥¼´¿¤¶²Ð¡A©³¤U´N³o¨Ç¥H¤Îµy«á½d¨Ò·|¨Ï¥Î¨ìªº Win64 API ¥[¥H»¡©ú¡C
LoadMenu API ±q¥i°õ¦æÀɤ¤ªº¸ê·½¸ü¤J¥\¯àªí¡A¨ä»yªk¬O¡G
invoke LoadMenu,\ hInstance,\ ; handle of application instance lpMenuName ; menu name string or menu-resource identifier
hInstance ¬O¼Ò²Õ¥N½X¡A¬O©I¥s GetModuleHandle API «áªº¦^¶ÇÈ¡ClpMenuName ¬O¥\¯àªí¦WºÙªº¦ì§}©Î¬O¥\¯àªíÃѧO½X¡A¤£½×þ¤@ºØ¡A³£¥²¶·»P¸ê·½´yzÀɤ¤ªº¿ï¶µ¦WºÙ©Î¥\¯àªíÃѧO½X¤@¼Ë¡C¦pªG©I¥s¦¨¥\¡A¨º»ò LoadMenu ªº¦^¶ÇȬO¥\¯àªí¥N½X¡F¦pªG¥¢±Ñ¡A¶Ç¦^ 0¡C
SetMenu API ¬°µøµ¡«ü©w¬YÓ¥\¯àªí¡A¨ä»yªk¦p¤U¡G
invoke SetMenu,\ hWnd,\ ; handle of window hMenu ; handle of menu
hWnd ¬Oµøµ¡¥N½X¡AY¦¨¥\°õ¦æ SetMenu «á¦¹µøµ¡·|Åã¥Ü¥\¯àªí¡A¦Ó hMenu §Y¬°Åã¥Üªº¥\¯àªí¤§¥N½X¡CSetMenu ªº¦^¶ÇȬ°¹s¡Aªí¥Ü©I¥s¥¢±Ñ¡FY¬°«D¹s¡Aªí¥Ü©I¥s¦¨¥\¡C
¦pªG¸Óµøµ¡¥»¨¤w¦³¥\¯àªí¡A¨º»ò°Ñ¼Æ hMenu ©Ò«ü©w¥\¯àªí·|¨ú¥N즳ªº¥\¯àªí¡A¦ý즳ªº¥\¯àªí¨Ã¨S¦³¾P·´¡C¥²¶·©I¥s DestroyMenu ¤~¯à¨Ï¥\¯àªí¾P·´¡C
©I¥s LoadMenu ®É¡A¥Ñ¸ê·½¸ü¤Jªº¥\¯àªí¥]§t¤F¥D¥\¯àªí»P¤l¥\¯àªí¡A¦ý LoadMenu ¥u¯à¶Ç¦^¥D¥\¯àªí¥N½X¡C¦pªGnÀò±o¤l¥\¯àªí¥N½X¡A¥²¶·©I¥s GetSubMenu¡AGetSubMenu ªº»yªk¬O¡G
invoke GetSubMenu,\ hMenu,\ ; handle of menu nPos ; menu item position
hMenu ¬O¤W¼h¥\¯àªíªº¥\¯àªí¥N½X¡A¦pªGnÀò±o¡u®]¥\¯àªí¡vªº¥\¯àªí¥N½X¡A¨º»ò³oÓ hMenu ´NÀ³¸Ó¬O¡u¤l¥\¯àªí¡vªº¥\¯àªí¥N½X¡CnPos ¬O¤l¥\¯àªí©Ò¦b¦ì¸m¡A¥Ñ¹s¶}©l¡A¦p¦³¤À¹j½u¤]ºâ¤@Ó¡C¦pªG©I¥s¦¨¥\¡AGetSubMenu ªº¦^¶ÇȧY¬°¤l¥\¯àªíªº¥\¯àªí¥N½X¡F¦pªG¥¢±Ñ¡A¨Ò¦p¸Ó¦ì¸m¤£¬O¤l¥\¯àªí¡A«h¦^¶ÇȬ°¹s¡C
CheckMenuItem ¬O¥Î¨Ó³]©w¥\¯àªí¤ºªº¿ï¶µ¬°¡u¤Ä¿ïªº¡vÁÙ¬O¡u¥¼¤Ä¿ïªº¡v¡A³q±`¥Î¦b¤£¨ã¤¬¥¸ªº¿ï¶µ¤W¡A¤]´N¬O¥i¥H¿ï¾Ü¶W¹L¤@Óªº±¡§Î¡A¦]¦¹¦b¿ï¶µ«e¥X²{ªº¬O¡u✔¡v¡CÁöµM·L³n¤w«Å¥¬¥¦³Q¥\¯à§ó¦hªº SetMenuItemInfo ¨ú¥N¡A¦ý¦pªG¥u¬O³æ¯Â¦a§ïÅܿﶵ¤Ä¿ïª¬ºAªº¸Ü¡A©I¥s CheckMenuItem API ÁÙ¬O«D±`¤è«Kªº¡CCheckMenuItem ªº»yªk¬O¡G
invoke CheckMenuItem,\ hMenu,\ ; handle to menu uIDCheckItem,\ ; menu item to check or uncheck uCheck ; menu item flags
hMenu ¬On§ïÅܤĿ窱ºA¿ï¶µ©Ò¦bªº¥\¯àªí¥N½X¡CuIDCheckItem ¬On§ïÅܤĿ窱ºA¿ï¶µ¤§¿ï¶µÃѧO½X©Î¬O¿ï¶µ¦ì¸m¡A¨ì©³¬O¿ï¶µÃѧO½X¡AÁÙ¬O¿ï¶µ¦ì¸m¡A¥Ñ²Ä¤TӰѼƨM©w¡C
CheckMenuRadioItem ¥i¥H¦b¤l¥\¯àªí¤º¡A«ü©w¼ÆÓ³sÄòªº¿ï¶µ¬°¤@²Õ¡A¦Ó³]©w¨ä¤¤ªº¬Y¤@¿ï¶µ¬°¤Ä¿ïªº¡A¦Ó¨ä¥L¿ï¶µ³]¬°¥¼¤Ä¿ïªº¡C«ü©wªº¤@²Õ¿ï¶µ¡A¥i¥H¨Ì¾Ú¿ï¶µ¦ì¸m¡A¤]¥i¥H¨Ì¾Ú¿ï¶µÃѧO½X¡C¦]¬°¥u¯à«ü©w¨ä¤¤¬Y¤@¶µ¬°¤Ä¿ïªº¡A©Ò¥H±`¥Î©ó¨ã¦³¤¬¥¸ªº¿ï¶µ¡A¦b¤Ä¿ïªº¿ï¶µ«e¥X²{ªº¬O¡u●¡v°O¸¹¡C
invoke CheckMenuRadioItem,\ hMenu,\ ; handle to menu idFirst,\ ; identifier or position of the first menu item idLast,\ ; identifier or position of the last menu item idCheck,\ ; identifier or position of the menu item to check uFlags ; menu item flags
hMenu ¬On§ïÅܤĿ窱ºA¿ï¶µ©Ò¦bªº¤l¥\¯àªí¥N½X¡CidFirst¡BidLast ¤À§O¬O«ü©w¤@²Õ³sÄò¿ï¶µªº²Ä¤@Ó©M³Ì«á¤@ӿﶵ¡CidCheck ¬O«ü©w¤@²Õ¿ï¶µ¤ºªºþ¤@ӿﶵn³]¬°¤Ä¿ïªº¡CuFlags ¥i¥H¬O MF_BYCOMMAND ©Î MF_BYPOSITION ¨ä¤¤¤§¤@¡A«eªÌ¥Nªí idFirst¡BidLast¡BidCheck ¥Nªí¿ï¶µÃѧO½X¡A«áªÌ¥Nªí¸Ó¤TªÌ¬°¿ï¶µ¦ì¸m¡C
¦pªG CheckMenuRadioItem °õ¦æ¦¨¥\¡A¦^¶ÇȬ°«D¹s¡F¦pªG¥¢±Ñ¡A¦^¶ÇȬ° 0¡C
Ellipse ¬O¥Î¨Óø»s¾ò¶êªº¡Aø»s¤è¦¡¬O«ü©w¨âÓÂI¡A³o¨âÓÂIºc¦¨¤@Ó¯x§Î¡]¯x§Î´N¬Oªø¤è§Î¡^¡A¦¹¯x§Îªºªø»P¤ô¥½u¥¦æ¡B°ª»P¹]Áè½u¥¦æªº¯x§Î¡C¦Ó¦¹¯x§Î¨Ã¤£·|µe¥X¨Ó¡Anµe¥X¨Óªº¾ò¶ê´N¬O¸Ó¯x§Îªº¤º¤Á¾ò¶ê¡A©Ò¥Hø»s¥X¨Óªº¾ò¶êªø¶b¡Bµu¶b¤]·|»P¤ô¥½u©M¹]Áè½u¥¦æ¡C¥Ñ¤W±´N¯àª¾¹D¡An¸g¥Ñ Ellipse µe¥X¾ò¶ê¡A¥²¶·«ü©w¦¹¥~¤Á¯x§Îªº¥ª¤W¨¤»P¥k¤U¨¤®y¼Ð¡A©Ò¥H Ellipse ªº»yªk¦p¤U¡A¤]´N¤£©_©Ç¤F¡C
invoke Ellipse,\ hdc,\ ; handle to device context nLeftRect,\ ; x-coord. of bounding rectangle's upper-left corner nTopRect,\ ; y-coord. of bounding rectangle's upper-left corner nRightRect,\ ; x-coord. of bounding rectangle's lower-right corner nBottomRect ; y-coord. bounding rectangle's f lower-right corner
nLeftRect¡BnTopRect ¤À§O¬O¯x§Îªº¥ª¤W¨¤ X¡BY ®y¼Ð¡AnRightRect¡BnBottomRect «h¬O¯x§Îªº¥k¤U¨¤ X¡BY ®y¼Ð¡CÁöµM³o¥|ӰѼơA«ü¦W¯x§Îªº¥ª¤W¨¤¤Î¥k¤U¨¤¡A¦ý¹ê»Ú¤W¤]¥i¥H¬O¥ª¤U¨¤»P¥k¤W¨¤¡CEllipse ·|¥H·í«eµeµ§Ã¸¥X¾ò¶ê½ü¹ø¡A¦P®É¥H·í«eµe¨ê¶îº¡¾ò¶ê¤º³¡°Ï°ì¡C¦pªG Ellipse ¦¨¥\µe¥X¾ò¶ê¡A¶Ç¦^«D¹sÈ¡F¦pªG¥¢±Ñ¡A¶Ç¦^¹sÈ¡C
¤U±¥k¹Ï¬O Ellipse µe¥XªºÂŦâ¾ò¶ê¡A¤]¬O³o¤@³¹ªº¨Ò¤l¡ADRAW2¡A°õ¦æªºµ²ªG¡C¤U±¥k¹Ï¤¤ªº¬õ¦â¯x§Î¬O Ellipse ²Ä¤G¡ã¤Ó°Ñ¼Æ©Ò«ü©wªº¡A¬°¾ò¶êªº¥~¤Á¯x§Î¡A¹ê»Ú¤W¨Ã¤£·|µe¥X¨Ó¡AEllipse ¤]¤£·|Åã¥Ü¥ª¤W¨¤¡B¤Î¥k¤U¨¤ªº®y¼Ð¤ÎÂI¡C
³o¤@³¹ªº¨Ò¤l¬O DRAW2¡A°õ¦æµ²ªG¦p¤W±¥ª¹Ï¡C¥D¥\¯àªí¤W¦³¥|ӿﶵ¡AÂ÷¶}¡BÀ˵ø¡Bø¹Ï¡BÀ°§U¡A¥u¦³¡uÀ˵ø¡v¡B¡uø¹Ï¡v¬O¼u¥X¿ï¶µ¡A¥t¥~¨âÓ«h¬O¤@¯ë¿ï¶µ¡C¡uÀ°§U¡v¿ï¶µ¦b¼ÐÃDÄæ¤W¾a¥k¹ï»ô¡A©Ò¥H¡uÀ°§U¡v¿ï¶µªº¡uoption¡v¬O¡uHELP¡v¡C
¦bÀ˵ø¤l¥\¯àªí¤¤¡A¦³¨âӿﶵ¡G®y¼Ð¡Bµeµ§ÃC¦â¡CÅU¦W«ä¸q¡A¿ï¾Ü®y¼Ð´N·|¦b¤u§@°ÏÅã¥Ü·Æ¹«´å¼Ð©Ò¦b¦ì¸mªº®y¼Ð¡A¦A¿ï¤@¦¸´N¤£Åã¥Ü¡CÂI¿ïµeµ§ÃC¦â¡A·|Åã¥Ü¨Ï¥ÎªÌ·í«e¿ï¾Üªºµeµ§ÃC¦â¡A¦A¿ï¤@¦¸«h¤£Åã¥Ü¡C¹w³]¬OÅã¥Ü®y¼Ð¤Îµeµ§ÃC¦â¡A¥B¥¦Ì¤§¶¡¨S¦³¤¬¥¸ªºÃö«Y¡A¦]¦¹³o¨âӿﶵ«e¦³¡u✔¡v°O¸¹¡C
¨Ï¥ÎªÌÂI¿ïø¹Ï¿ï¶µ®É¡A¥i¥H¿ï¾Üµe¾ò¶êÁÙ¬O¤âø¹Ï¡A¤]¥i¥H¿ï¾Ü¨Ï¥Î¶Â¡B¬õ¡Bºñ¡BÂÅþ¤@ºØÃC¦âµe¹Ï¡C¦pªG¿ï¾Ü¥|¦â¤¤ªº¥ô¤@¦â¡A¤£¶È¤§«áø¥Xªº¹Ï§ÎÅܬ°¸ÓºØÃC¦â¡A·Æ¹«´å¼Ð¤]·|Åܦ¨¸ÓºØ¦âµ§§Îª¬ªº´å¼Ð¡A¨£¤W±¥k¹Ï·Æ¹«´å¼Ð¤wÅܬ°Âŵ§§Îª¬ªº´å¼Ð¡CDRAW2 ¤@¶}©l®É¹w³]¬O¤âø¹Ï»P¶Â¦â¡A³o¨âӿﶵ«e¦³¡u●¡vªº°O¸¹¡A·í¨Ï¥ÎªÌ¿ï¾Ü§OºØ¿ï¶µ®É¡A¡u●¡v°O¸¹´N·|Åܦ¨¦b¸Ó¿ï¶µ¤§«e¡C
¸ê·½´yzÀɦWºÙ¬°¡uE:\HP\SOURCE\W64\DRAW\DRAW2.RC¡v¡A¤º®e¦p¤U¡G
1 2 3 4 5
6 7 8 9 10 11
12 13 14 15 16 17
18 19 20 21 22 23
24 25 26 27 28 29
30 31 32 33 34 35
36 37 38 39 40 41
42 43 |
#define IDM_QUIT 3000
#define IDM_XY 3001
#define IDM_COLOR 3002
#define IDM_ELLIPSE 3003
#define IDM_TRACE 3004
#define IDM_BLACK 3005
#define IDM_RED 3006
#define IDM_GREEN 3007
#define IDM_BLUE 3008
#define IDM_HELP 3009
#define IDCUR_BLKPEN 6000
#define IDCUR_REDPEN 6001
#define IDCUR_GRNPEN 6002
#define IDCUR_BLUPEN 6003
DRAW2 MENU
{
MENUITEM "Â÷¶}",IDM_QUIT
POPUP "À˵ø"
{
MENUITEM "®y¼Ð",IDM_XY,CHECKED
MENUITEM "µeµ§ÃC¦â",IDM_COLOR,CHECKED
}
POPUP "ø¹Ï"
{
MENUITEM "¾ò¶ê",IDM_ELLIPSE
MENUITEM "¤âø¹Ï",IDM_TRACE /* ¹w³]¤âø¹Ï */
MENUITEM SEPARATOR
MENUITEM "¶Â",IDM_BLACK /* ¹w³]¶Âµ§ */
MENUITEM "¬õ",IDM_RED
MENUITEM "ºñ",IDM_GREEN
MENUITEM "ÂÅ",IDM_BLUE
}
MENUITEM "À°§U",IDM_HELP,HELP /* HELP¨Ï¡uÀ°§U¡v¦r¼Ë¦b¥D¥\¯àªí¥kÃä */
}
DRAW2 ICON "DRAW2.ICO" /* ¹Ï¥Ü */
/* ¥H¤U´å¼ÐÀɤU¸ü¦ì§}¡Ghttps://www.cursors-4u.com/pencil/ */
IDCUR_BLKPEN CURSOR "blkpen.cur" /* ¶Âµ§§Îª¬ªº´å¼Ð */
IDCUR_REDPEN CURSOR "redpen.cur" /* ¬õµ§§Îª¬ªº´å¼Ð */
IDCUR_GRNPEN CURSOR "grnpen.cur" /* ºñµ§§Îª¬ªº´å¼Ð */
IDCUR_BLUPEN CURSOR "blupen.cur" /* Âŵ§§Îª¬ªº´å¼Ð */ |
ì©lµ{¦¡¦WºÙ¬°¡uE:\HP\SOURCE\W64\DRAW\DRAW2.ASM¡v¡A¤º®e¦p¤U¡G
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 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 66 67
68 69 70 71 72 73 74
75 76 77 78 79 80 81
82 83 84 85 86 87 88
89 90 91 92 93 94 95
96 97 98 99 100 101 102
103 104 105 106 107 108 109
110 111 112 113 114 115 116
117 118 119 120 121 122 123
124 125 126 127 128 129 130
131 132 133 134 135 136 137
138 139 140 141 142 143 144
145 146 147 148 149 150 151
152 153 154 155 156 157 158
159 160 161 162 163 164 165
166 167 168 169 170 171 172
173 174 175 176 177 178 179
180 181 182 183 184 185 186
187 188 189 190 191 192 193
194 195 196 197 198 199 200
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 |
OPTION CASEMAP:NONE
OPTION WIN64:7
INCLUDE WINDOWS.INC
INCLUDELIB GDI32.LIB
INCLUDELIB KERNEL32.LIB
INCLUDELIB USER32.LIB
IDM_QUIT EQU 3000
IDM_XY EQU 3001
IDM_COLOR EQU 3002
IDM_ELLIPSE EQU 3003
IDM_TRACE EQU 3004
IDM_BLACK EQU 3005
IDM_RED EQU 3006
IDM_GREEN EQU 3007
IDM_BLUE EQU 3008
IDM_HELP EQU 3009
IDCUR_BLKPEN EQU 6000
IDCUR_REDPEN EQU 6001
IDCUR_GRNPEN EQU 6002
IDCUR_BLUPEN EQU 6003
;*****************************************************************************************
.CONST
szMenuName LABEL BYTE
szIconName LABEL BYTE
szClassName DB "DRAW2",0
szAppName DB "¶W²³æø¹Ï",0
szText DB "DRAW2¶È¯àø»s¾ò¶ê»P¤âø¹Ï",0dh,0ah,"¡A¥B¤£¯à¦sÀɤ]¤£¯à½s¿è¡C",0
szMouseFmt DB "(%03d,%03d)",0
szColor DB "¶Â¦â¬õ¦âºñ¦âÂŦâ"
szClear DB 5 DUP ("¡@")
;*****************************************************************************************
.DATA
hInstance DQ ? ;¼Ò²Õ¥N½X
hwnd HWND ? ;µøµ¡¥N½X
hMenu HMENU ? ;¥D¥\¯àªí¥N½X
hViewSubMenu HMENU ? ;À˵ø¤l¥\¯àªí¥N½X
hDrawSubMenu HMENU ? ;ø¹Ï¤l¥\¯àªí¥N½X
pCursor DQ 0 ;þºØÃC¦âªºµeµ§¡A¤]¥Nªíþ¤@ºØ´å¼Ð¡A¹w³]¶Âµ§¤Î¶Âµ§§Îª¬´å¼Ð
hCursor HCURSOR 4 DUP(?);¥|ºØ´å¼Ðªº¥N½X¡A¨Ì§Ç¬O¶Âµ§¡B¬õµ§¡Bºñµ§¡BÂŵ§§Îª¬ªº´å¼Ð
hPen HPEN 4 DUP(?);¥|ºØÃC¦âªºµeµ§¥N½X¡A¨Ì§Ç¬O¶Âµ§¡B¬õµ§¡Bºñµ§¡BÂŵ§
draw_what DQ 1 ;nµe¤°»ò¡G0¡Ð¾ò¶ê¡B1¡Ð¤âø¹Ï(¹w³])
line_pen DQ 0 ;µe¤âø¹Ï®Éµeµ§ªºª¬ºA¡G0¡Ð´£°_µeµ§¡A1¡Ð©ñ¤Uµeµ§
ellips_pen DQ 0 ;µe¾ò¶ê¨BÆJ¡G0¡Ð²Ä¤@ÂI¥¼½T©w¡A1¡Ð²Ä¤GÂI¥¼½T©w¡A2¡Ðµe¥X¨Ó
fXy DQ 1 ;¬O§_©ó¤u§@°ÏÅã¥Ü®y¼Ð¡G0¡Ð¤£Åã¥Ü¡A1¡ÐÅã¥Ü
fColor DQ 1 ;¬O§_©ó¤u§@°ÏÅã¥Üµeµ§ÃC¦â¡G0¡Ð¤£Åã¥Ü¡A1¡ÐÅã¥Ü
line_start POINT <> ;°_ÂI
line_end POINT <> ;²×ÂI
lt_rect POINT <> ;ø»s¾ò¶ê®É¡A¾ò¶ê¥~¤Á¯x§Îªº¥ª¤W¨¤®y¼Ð
rb_rect POINT <> ;ø»s¾ò¶ê®É¡A¾ò¶ê¥~¤Á¯x§Îªº¥k¤U¨¤®y¼Ð
mouse POINT <> ;·Æ¹«´å¼Ð©Ò¦b®y¼Ð¡A·ífXy¬°¤@®ÉÅã¥Ü¦b¤u§@°Ï¥ª¤W¨¤
cyChar DD ? ;¦r¤¸°ª«×
;*****************************************************************************************
.CODE
;-----------------------------------------------------------------------------------------
WndProc PROC hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
LOCAL ps:PAINTSTRUCT,rect:RECT,buffer[64]:BYTE,tm:TEXTMETRIC
.switch uMsg
.case WM_PAINT
invoke BeginPaint,hWnd,ADDR ps
mov rax,pCursor ;§ïÅܵeµ§
lea r10,hPen[rax*8] ;R10¡×µeµ§¥N½X©Ò¦b¦ì§}
invoke SelectObject,ps.hdc,QWORD PTR [r10]
;·ífXy=1®É¡AÅã¥Ü·Æ¹«®y¼Ð
.if fXy==1
invoke wsprintf,ADDR buffer,OFFSET szMouseFmt,mouse.x,mouse.y
lea r9,buffer
.else
mov r9,OFFSET szClear
mov eax,SIZEOF szClear
.ENDIF
invoke TextOut,ps.hdc,0,0,r9,eax
;·ífColor=1®É¡AÅã¥Üµeµ§ÃC¦â
.if fColor==1
mov r10,pCursor
lea r9,szColor[r10*4]
.else
mov r9,OFFSET szClear
.endif
invoke TextOut,ps.hdc,0,cyChar,r9,4
;·ídraw_what=0®É¡Aø»s¾ò¶ê¡F·ídraw_what=1®É¡A¤âø¹Ï
.if (draw_what==0)&&(ellips_pen==2)
invoke Ellipse,ps.hdc,lt_rect.x,lt_rect.y,rb_rect.x,rb_rect.y
sub ellips_pen,2
.elseif draw_what==1
.if line_pen==1
invoke MoveToEx,ps.hdc,line_start.x,line_start.y,0
invoke LineTo,ps.hdc,line_end.x,line_end.y
mov r10d,line_end.x
mov r11d,line_end.y
xchg line_start.x,r10d
xchg line_start.y,r11d
.endif
.endif
invoke EndPaint,hWnd,ADDR ps
.case WM_MOUSEMOVE
mov r8,r9
shr r9,10h
and r8,0ffffh
mov line_end.x,r8d ;§â¹³¯ÀªºX®y¼Ð¦s©óline_end.x
mov line_end.y,r9d ;§â¹³¯ÀªºY®y¼Ð¦s©óline_end.y
mov mouse.x,r8d
mov mouse.y,r9d
invoke InvalidateRect,hWnd,0,0 ;¹ï¥»¨µo¥XWM_PAINT°T®§
.case WM_LBUTTONDOWN
mov r8,r9
shr r9,10h ;R9¡×Y®y¼Ð
and r8,0ffffh ;R8¡×X®y¼Ð
.if draw_what==0
.if ellips_pen==0
mov lt_rect.x,r8d
mov lt_rect.y,r9d
inc ellips_pen
.elseif ellips_pen==1
mov rb_rect.x,r8d
mov rb_rect.y,r9d
inc ellips_pen
invoke InvalidateRect,hWnd,0,0
.endif
.elseif draw_what==1
.if line_pen==0
mov line_start.x,r8d;§â°_ÂIªºX®y¼Ð¦s©óline_start.x
mov line_start.y,r9d;§â°_ÂIªºY®y¼Ð¦s©óline_start.y
.endif
xor line_pen,1
.endif
.case WM_SETCURSOR
mov rax,pCursor
lea r10,hCursor[rax*8]
invoke SetCursor,QWORD PTR [r10]
.case WM_COMMAND
mov line_pen,0
mov ellips_pen,0
.if r8w==IDM_QUIT
jmp quit
.elseif r8w==IDM_HELP
invoke MessageBox,hWnd,OFFSET szText,OFFSET szAppName,MB_OK or MB_ICONQUESTION
.elseif r8w==IDM_ELLIPSE
mov draw_what,0
invoke CheckMenuRadioItem,hDrawSubMenu,0,1,0,MF_BYPOSITION
.elseif r8w==IDM_TRACE
mov draw_what,1
invoke CheckMenuRadioItem,hDrawSubMenu,0,1,1,MF_BYPOSITION
.elseif r8w==IDM_XY
mov r8d,MF_UNCHECKED or MF_BYPOSITION
xor fXy,1
jz @f
mov r8d,MF_CHECKED or MF_BYPOSITION
@@: invoke CheckMenuItem,hViewSubMenu,0,r8d
.elseif r8w==IDM_COLOR
mov r8d,MF_UNCHECKED or MF_BYPOSITION
xor fColor,1
jz @f
mov r8d,MF_CHECKED or MF_BYPOSITION
@@: invoke CheckMenuItem,hViewSubMenu,1,r8d
.elseif r8w>=IDM_BLACK
movzx r10,r8w
mov r9,r8
sub r10,IDM_BLACK
mov pCursor,r10
invoke CheckMenuRadioItem,hDrawSubMenu,IDM_BLACK,IDM_BLUE,r9d,MF_BYCOMMAND
.endif
.case WM_CREATE
;«Ø¥ß¥|¦âµeµ§¨Ã±N¨ä¥N½X¨Ì§Ç¦s¤JhPen°}¦C¤¤
invoke CreatePen,PS_SOLID,1,0
mov hPen,rax
invoke CreatePen,PS_SOLID,1,0ffh
mov hPen[8],rax
invoke CreatePen,PS_SOLID,1,0ff00h
mov hPen[16],rax
invoke CreatePen,PS_SOLID,1,0ff0000h
mov hPen[24],rax
;¸ü¤J¥|¦âµeµ§§Îª¬ªº´å¼Ð¡A¨Ã±N¨ä¥N½X¦s¤JhCursor°}¦C¤¤
invoke LoadCursor,hInstance,IDCUR_BLKPEN
mov hCursor,rax
invoke LoadCursor,hInstance,IDCUR_REDPEN
mov hCursor[8],rax
invoke LoadCursor,hInstance,IDCUR_GRNPEN
mov hCursor[16],rax
invoke LoadCursor,hInstance,IDCUR_BLUPEN
mov hCursor[24],rax
;Àò±oÀ˵ø¤l¥\¯àªí¥N½X¤Îø¹Ï¤l¥\¯àªí¥N½X¡A¤À§O¦s©óhViewSubMenu¡BhDrawSubMenu
invoke GetSubMenu,hMenu,1
mov hViewSubMenu,rax
invoke GetSubMenu,hMenu,2
mov hDrawSubMenu,rax
;±Nø¹Ï¤l¥\¯àªí¤¤ªº¤âø¹Ï¿ï¶µ©M¶Â¦â¿ï¶µ«eÅã¥Ü¶êÂIªº¤Ä¿ï°O¸¹
invoke CheckMenuRadioItem,hDrawSubMenu,0,1,1,MF_BYPOSITION
invoke CheckMenuRadioItem,hDrawSubMenu,IDM_BLACK,IDM_BLUE,IDM_BLACK,MF_BYCOMMAND
;Àò±o¤@¦æ¤å¦r°ª«×¡A¨Ã¦s©ócyChar¤¤
invoke GetDC,hWnd
mov ps.hdc,rax
invoke GetTextMetrics,ps.hdc,ADDR tm
mov r11d,tm.tmHeight
add r11d,tm.tmExternalLeading
mov cyChar,r11d
invoke ReleaseDC,hWnd,ps.hdc
.case WM_DESTROY
quit: invoke PostQuitMessage,0
.default
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endsw
xor rax,rax
ret
WndProc ENDP
;-----------------------------------------------------------------------------------------
main PROC
LOCAL wc:WNDCLASSEX,msg:MSG
invoke GetModuleHandle,0
mov hInstance,rax
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
lea rdx,WndProc
mov wc.lpfnWndProc,rdx
mov wc.cbClsExtra,0
mov wc.cbWndExtra,0
mov wc.hInstance,rax
invoke LoadIcon,hInstance,OFFSET szIconName
mov wc.hIcon,rax
mov wc.hIconSm,rax
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,0
lea rdx,szClassName
mov wc.lpszClassName,rdx
invoke RegisterClassEx,ADDR wc
invoke LoadMenu,hInstance,OFFSET szMenuName ;¸ü¤J¿ï³æ
mov hMenu,rax
invoke CreateWindowEx,0,ADDR szClassName,ADDR szAppName,WS_OVERLAPPEDWINDOW,\
50,50,500,375,0,hMenu,hInstance,0
mov hwnd,rax
invoke ShowWindow,hwnd,SW_SHOWNORMAL
invoke UpdateWindow,hwnd
.while TRUE
invoke GetMessage,ADDR msg,0,0,0
.break .if rax==0
invoke TranslateMessage,ADDR msg
invoke DispatchMessage,ADDR msg
.endw
invoke ExitProcess,0
main ENDP
;*****************************************************************************************
END main |
±N¤W±¨âӯ¤å¦rÀÉÀx¦s©óºÏºÐùتº¦P¤@¤l¥Ø¿ý«á¡A¨Ì¤U±¤è¦¡²ÕĶ¤Î³sµ²¡G
Microsoft Windows [ª©¥» 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:\Users\wanker>uasm [Enter] ¡÷°õ¦æ UASM.BAT §å¦¸ÀÉ¡A³]©w²ÕĶ¤Î³sµ²Àô¹Ò¡A¬Ù¤F³\¦h¥´¦r¿é¤J C:\Users\wanker>SET INCLUDE=C:\UASM\Include C:\Users\wanker>SET LIB=C:\UASM\lib64 C:\Users\wanker>SET PATH=C:\UASM;C:\UASM\bin64;C:\Windows\system32;C:\Windows;C: \Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Fi les (x86)\UltraEdit-32 C:\Users\wanker>E: E:\>CD E:\HOMEPAGE\SOURCE\WIN64 LINK=/SUBSYSTEM:WINDOWS /DEBUG ¡÷¨ì¦¹ UASM.BAT ¤w°õ¦æ§¹²¦ E:\HomePage\SOURCE\Win64>cd DRAW [Enter] ¡÷³]©w DRAW2.ASM ©Ò¦b¤l¥Ø¿ý¬°·í«e¥Ø¿ý E:\HomePage\SOURCE\Win64\DRAW>uasm64 -win64 DRAW2.ASM [Enter] ¡÷²ÕĶ UASM v2.56, Oct 27 2022, Masm-compatible assembler. Portions Copyright (c) 1992-2002 Sybase, Inc. All Rights Reserved. Source code is available under the Sybase Open Watcom Public License. DRAW2.ASM: 252 lines, 3 passes, 771 ms, 0 warnings, 0 errors ¡÷¨S¦³¿ù»~¡A¦¨¥\²ÕĶ§¹¦¨ E:\HomePage\SOURCE\Win64\DRAW>rc draw2.rc [Enter] ¡÷½sĶ¸ê·½´yzÀÉ Microsoft (R) Windows (R) Resource Compiler Version 10.0.10011.16384 Copyright (C) Microsoft Corporation. All rights reserved. ¡÷¨S¦³°T®§¡A¥Nªí½sĶ¦¨¥\¨Ã¥Í¦¨ DRAW2.RES ¸ê·½ÀÉ E:\HomePage\SOURCE\Win64\DRAW>link DRAW2.OBJ DRAW2.RES /LARGEADDRESSAWARE:NO [Enter] ¡÷³sµ² Microsoft (R) Incremental Linker Version 14.25.28614.0 Copyright (C) Microsoft Corporation. All rights reserved. /SUBSYSTEM:WINDOWS /DEBUG ¡÷¨S¦³°T®§¡A¥NªíDRAW2.EXE ¦¨¥\»s§@¦n¤F E:\HomePage\SOURCE\Win64\DRAW>
²ÕĶ»P³sµ²ªº¹Lµ{»P«e´X³¹Ãþ¦ü¡A¤£¦h°µ±Ôz¡A¤£¦P¤§³B¶È¤@³B¡C¨º´N¬O¦b³sµ²®É¡A¥²¶·¤U¹F¡u/LARGEADDRESSAWARE:NO¡v¿ï¶µ¡A¦pªG¨S¦³³oӿﶵ¡A³sµ²¾¹·|§i¶D§Aµo¥Í¿ù»~¡A¥²¶·¥[¤W¥¦¡C¥[¤W³o¿ï¶µªºì¦]µy«á¸ÑÄÀ¡C
°õ¦æ DRAW2 «á¡A¨Ï¥ÎªÌ¥i¥H¦b¡uø¹Ï¡v¤l¥\¯àªí¤¤¡A©ó¶Â¡B¬õ¡Bºñ¡BÂÅ¥|¦â¤§¤¤¿ï¾Ü¤@ºØ¡A§ïÅܤ§«áø¥X¹Ï§ÎªºÃC¦â¡A¤Î§ïÅܷƹ«´å¼Ð¬°¸ÓºØ¦âµ§§Îª¬ªº´å¼Ð¡C¤]´N¬O»¡¡A¨Ï¥ÎªÌ¿ïÂŦâ¡A·Æ¹«´å¼ÐÅÜÂŵ§§Îª¬ªº´å¼Ð¡A¦Ó«áµe¥Xªº¾ò¶ê©Î¤âø¹Ï³£¬OÂŦâ¡C
¦b DRAW2.ASM ùØ¡A§â¥|ºØ¦âµ§§Îª¬ªº·Æ¹«´å¼Ð¤§´å¼Ð¥N½X¡A²Õ¦¨§t¦³¥|Ó¤¸¯Àªº°}¦C¡]array¡^¡A³oÓ°}¦C©w¸q¦b DRAW2.ASM ªº²Ä 41 ¦æ¡AºÙ¬° hCursor¡A¨ä²Ä¹s¡B¤@¡B¤G¡B¤TÓ¤¸¯À¤À§O¬O¶Âµ§¡B¬õµ§¡Bºñµ§¡BÂŵ§§Îª¬ªº´å¼Ð¤§´å¼Ð¥N½X¡C
¦b²Ä 40 ¦æ¡AÁÙ©w¸q¤F¤@ÓÅܼơApCursor¡A¥¦¨ä¹ê¬O«ü¼Ð¡A¥Nªí¨Ï¥ÎªÌ¿ï¾Ü hCorsor °}¦C¤¤ªº²Ä´XÓ¤¸¯À¡A¥Ñ¹s¶}©l¡C´«¥y¸Ü»¡¡A·í pCursor ¬°¹s®É¡A¥Nªí¨Ï¥ÎªÌ¿ï¾Ü²Ä¹sÓ¤¸¯À¡A¤]´N¬O¶Âµ§§Îª¬ªº´å¼Ð¡F·í pCursor ¬°¤@®É¡A¥Nªí¨Ï¥ÎªÌ¿ï¾Ü²Ä¤@Ó¤¸¯À¡A¤]´N¬O¬õµ§§Îª¬ªº´å¼Ð¡K¡K¨ä¾l¨Ì¦¹Ãþ±À¡C¦]¬° DRAW2 ¹w³]¬O¶Â¦â¡A©Ò¥H pCursor ¹w³]ȬO 0¡C¦pªG¨Ï¥ÎªÌ¦b¥\¯àªíùاïÅÜÃC¦â¡ApCursor ¤§È¤]·|§ïÅÜ¡A¦ý¥u¯à¬O 0¡ã3 ¤§¶¡ªº¾ã¼Æ¡C©³¤U²Ä 40¡ã41 ¦æ©w¸q¤F pCursor ÅܼƤΠhCursor °}¦C¡G
pCursor DQ 0 ;þºØ´å¼Ð¡A¹w³]¬O¶Âµ§ªº´å¼Ð§Îª¬ hCursor HCURSOR 4 DUP(?);¥|ºØ´å¼Ðªº¥N½X¡A¨Ì§Ç¬O¶Âµ§¡B¬õµ§¡Bºñµ§¡BÂŵ§§Îª¬ªº´å¼Ð
hCursor °}¦C¤¤ªº¥|Ó´å¼Ð¥N½X¡A³£¬O¦b³B²z WM_CREATE °T®§®É¡A©I¥s LoadCursor ¥Ñ¸ê·½¤¤¸ü¤J¨Ã±NÀò±oªº¥N½X¦s¤J¹ïÀ³ªº¤¸¯À¤¤¡A¨£²Ä 179¡ã187 ¦æ¡C¥t¥~¡AHCURSOR ¬O¸ê®ÆÃþ«¬¡A¨Æ¹ê¤W´N¬O DQ ©Î QWORD¡C
¨º»ò¡ADEAW2 ¤S¬O¦p¦ó±N¨Ï¥ÎªÌ©Ò¿ï¾ÜªºÃC¦â¡AÅܬ° pCursor ¤§È©O¡H³o¬q¹Lµ{¬O¦b¨Ï¥ÎªÌ¿ï©w¿ï¶µ®É¡A³B²z WM_COMMAND °T®§µo¥Íªº¡C
DRAW2.ASM ²Ä 136¡ã167 ¦æ¥Î¨Ó³B²z WM_COMMAND °T®§¡CDRAW2 ¨S¦³§Ö³tÁä¤Î±±¨î¶µ¡A±¡ªp³æ¯Â¡A¦pªGµøµ¡¨ç¦¡¦¬¨ì WM_COMMAND °T®§¡A¨º»ò¡A¥²¬O¨Ï¥ÎªÌÂI¿ï¥\¯àªí¤¤ªº¿ï¶µ©ÒP¡C·í¨Ï¥ÎªÌÂI¿ï¥\¯àªí®É¡ADRAW2 °²³]¤£½×¬Oø»s¾ò¶êÁÙ¬O¤âø¹Ï¡A³£«·s¶}©l¡A¦]¦¹²Ä 137¡ã138 ¦æ¡A±N line_pen¡Bellips_pen §¡³]¬° 0¡C
WM_COMMAND °T®§¤¤ wParam ªº§C¦r²Õ«O¦sµÛ¨Ï¥ÎªÌÂI¿ïªº¿ï¶µÃѧO½X¡A¦Ó wParam ¬Oµøµ¡¨ç¦¡ªº²Ä¤TӰѼơC·í Windows §@·~¨t²Î±N WM_COMMAND °T®§µo°e¨ìµøµ¡¨ç¦¡ WndProc ®É¡AwParam ¤§È´N¤w¦s©ó R8 ¼È¦s¾¹ùØ¡A´«¥y¸Ü»¡¡AR8W ùØ´N¬O¿ï¶µÃѧO½X¡C©Ò¥H±µ¤U¨Ó¥u»Ý¥Î .if/.elseif/.endif Àˬd R8W ¤§È¡A§Y¥iª¾¹D¨Ï¥ÎªÌÂI¿ïªºþ¤@ӿﶵ¡C
¨Ò¦p²Ä 139¡ã140 ¦æ¡A¬O³B²z¨Ï¥ÎªÌ«ö¤U¥D¿ï³æªºÂ÷¶}¿ï¶µ¡AR8W «K¬O IDM_QUIT¡A¨º»ò´N°h¥Xµ{¦¡¡A¸õÅD¦Ü³B²z WM_DESTROY °T®§¤§³B¡A¤]´N¬O quit: ¼Ð°O³B¡Aµ²§ôµ{¦¡¡CIDM_QUIT ¬O¥D¥\¯àªí¤¤¡AÂ÷¶}¿ï¶µªºÃѧO½X¡A¤À§O©w¸q¦b DRAW2.ASM ¤Î DRAW2.RC ¤¤ªº²Ä 9 ¦æ¤Î²Ä¤@¦æ¡A¨äȧ¡¬° 3000¡C
·í¨Ï¥ÎªÌ§ó´«ÃC¦â®É¡AR8W ¥²©w·|¤j©ó©Îµ¥©ó IDM_BLACK¡Aªí¥Ü¡C¥»¨ÓÀ³¸Ó¬O¨CºØÃC¦â¤À¶}¨Ó³B²z¡A¦ý³o¼Ë·|¼W¥[µ{¦¡½X¡C¦]¬°¤£ºÞþ¤@ºØÃC¦â¡A³B²z¤è¦¡¤j¦P¤p²§¡A©Ò¥H¤@°_³B²z¡C³B²z¹Lµ{¤À¦¨¨â¨BÆJ¡G§ïÅÜ pCursor ¨Ã³]©w·sªº·Æ¹«´å¼Ð¡AµM«á³]©w·sÃC¦âªº¤Ä¿ïª¬ºA¡C©³¤U¥ý»¡²Ä¤@¨B¡C
²Ä¤@¨B¦b DRAW2.ASM ªº²Ä 162¡ã165 ¦æ¡C³o¥|¦â¿ï¶µ¤§ÃѧO½X¨Ì§Ç¬O IDM_BLACK¡BIDM_RED¡BIDM_GREEN¡BIDM_BLUE¡A¨ä鴄 3005 ¦Ü 3008¡A¦]¦¹±N¦s©ó R8W ªº¿ï¶µÃѧO½X´î¥h IDM_BLACK ´N¬O·sªº pCursor¡C¨Ò¦p¡A¨Ï¥ÎªÌ¿ï¤Fºñ¦â¡A¨º»ò R8W ¤§È¬O IDM_GREEN¡A¤]´N¬O 3007¡A´î¥h IDM_BLACK¡]IDM_BLACK µ¥©ó 3005¡^¡A´NÅܦ¨ 2¡F¦¹¼ÆÈ´N¬O·sªº pCursor¡A¤]«ê¦n¹ïÀ³¨ì hCursor °}¦C¤¤ªº²Ä¤GÓ¤¸¯À¡Aºñµ§§Îª¬ªº´å¼Ð¡C
²Ä¤G¨B§ïÅÜÃC¦â¤Ä¿ïª¬ºA¡A¨£²Ä 166 ¦æ¡C¦]¬°¿ï¾Ü¤F¬YºØÃC¦â´N¤£¥i¯à¬O¨ä¥LºØÃC¦â¡A¨Ò¦p¨Ï¥ÎªÌ¿ï¤Fºñ¦â¡A´N¤£¥i¯à¬O¶Â¡B¬õ¡BÂŤT¦â¡A¹³³oºØ¨ã¦³¤¬¥¸¯S©Êªº¤Ä¿ïª¬ºA¡A¤@¯ë©I¥s CheckMenuRadioItem ¨Ó§¹¦¨¡A«D±`¤è«K¡C¦ý§Y¨Ï§¹¦¨³o¨â¨BÆJ¡A¤]¶È¶È¬O§â pCursor ³]¬°¨Ï¥ÎªÌ¿ï¾Ü hCursor °}¦C¤¤ªº¥¿½T¤¸¯À¦Ó¤w¡A¿Ã¹õ¤W¨Ã¥¼¯u¥¿§ïÅÜ©Ò¿ï¦âµ§§Îª¬ªº´å¼Ð¡An¹F¦¹¥Øªºn³B²z WM_SETCURSOR °T®§¡C
«e±´¿´£¹L¡A¨C·í²¾°Ê·Æ¹«®É¡A¨t²Î·|µo¥X WM_SETCURSOR °T®§¥H«Ã¸·Æ¹«´å¼Ð¡C¦pªGµøµ¡¨ç¦¡¤£³B²z WM_SETCURSOR °T®§¡A¨º»ò·|¥Ñ DefWindowProc ³B²z¡A¦Ó DefWindowProc ³B²z¤è¦¡¬O¥Hµù¥Uµøµ¡Ãþ§O®É¡AWNDCLASSEX µ²ºcÅ餤ªº hCursor Äæ¦ì¤§´å¼Ð¥N½X¨Óø»s´å¼Ð¡C
¬°¤FÅý DRAW2 ¯à¨Ì¨Ï¥ÎªÌªº¿ï¾ÜÅÜ´«´å¼Ð¡A¦]¦¹ DRAW2 ªºµøµ¡¨ç¦¡±o¦Û¦æ³B²z WM_SETCURSOR °T®§¡A¨£²Ä 131¡ã134 ¦æ¡C³o´X¦æªº¥\¯à´N¬O¨Ì¾Ú pCursor ¨ú¥X¦b hCursor °}¦C¤¤ªº¥|ºØ´å¼Ð¥N½X¤¤ªº¤@Ó¡C³o¥|¦æ«ü¥O¬O¡G
.case WM_SETCURSOR mov rax,pCursor lea r10,hCursor[8*rax] invoke SetCursor,QWORD PTR [r10]
¨ä¤¤ªº³Ì«á¨â¦æ¯A¤Î¶¡±µ©w§}¡A¶¡±µ©w§}¦³³\¦hºØ¡A¦b²Ä¤G³¹¤¶²Ð¤F¨ä¤¤ªº¨âºØ¡A¦¹³B¦A¤¶²Ð¨âºØ¡Aªþ¿ý¤G¤¶²Ð³Ì«á¨âºØ¡C
⑶¡B²Ä¤TºØªº§Î¦¡¬°¡G
[ reg*n ]
¦¹³Bªº reg ¬O 64 ¦ì¤¸ªº³q¥Î¼È¦s¾¹¡A¥i¥H¬O RAX¡BRBX¡BRCX¡BRDX¡BRSI¡BRDI¡BRSP¡BRBP¡BR8¡ãR15 ¤¤ªº¨ä¤¤¤@ºØ¡Cn ¥u¯à¬O 1¡B2¡B4¡B8 ¥|ºØ¼ÆȤ¤ªº¤@ºØ¡A¦pªG¬O 1¡A¥i¥H¬Ù²¤¡C¡ureg*n¡v¥Nªí¦ì§}¡A¡u[ reg*n ]¡v¥Nªí¦s©ó¸Ó¦ì§}¤ºªº¼ÆÈ¡C
⑷¡B²Ä¥|ºØ§Î¦¡±`¥Î©ó¦s¨ú°}¦C¤¤ªº¤¸¯À¡A¥i¥H¼g¦¨¤U±¨âºØ¼Ë¤l¡A·N¸q§¡¬Û¦P¡G
var [ reg*n ] [ reg*n¡Ïvar ]
¨ä¤¤ reg¡Bn §¡»P²Ä¤TºØ§Î¦¡ªº·N¸q¤@¼Ë¡Avar ¥NªíÅܼơA¤@¯ë¦¹ÅܼƬO°}¦C¡C§Ú̪¾¹DÅܼƨä¹ê¥Nªí¬YÓ¦ì§}¤¤ªº¼ÆÈ¡A¦ÓÅܼƦWºÙ¥Nªí¦ì§}¡A¦b¦¹³B¥i¥H¬Ý¦¨¬O°¾²¾¦ì§}¡C¤W±ªº¼gªk¡A¡uvar [ reg*n ]¡v¡A¬O°ª¶¥»y¨¥ªí¥Ü°}¦C¤¤¬YÓ¤¸¯À¼ÆȪº¼gªk¡A²Õ¦X»y¨¥±Ä¥Î³oºØ¼gªk±`Åý¤H¸á¯f¡A¤£¹L¬°¤F°t¦X°ª¶¥»y¨¥¡A³\¦h²ÕĶ¾¹¤´¯à²ÕĶ³oºØ¼gªk¡C¤U±ªº¼gªk¡A¸û¬°¨ãÅé¡A¡ureg*n¡Ïvar¡v¥Nªí¦ì§}¡A¡u[ reg*n¡Ïvar ]¡v¥Nªí¦s©ó¸Ó¦ì§}¤ºªº¼ÆÈ¡C
©³¤U´N¥H DRAW2 ¤¤¦s¨ú hCursor °}¦C¬°¨Ò¡C¨£¥k¹Ï¡A°²³] DRAW2 °õ¦æ®É¡ApCursor ÅܼƦb¦ì§} 5C5048H ³B¡AhCursor °}¦C¦b 5C5050H ³B¡C¤S°²³]¡A¨Ï¥ÎªÌ¥Ñ¥\¯àªí¤¤¿ï¨úºñ¦â¡A¨º»ò pCursor ¤§È¬° 2¡A¦b³B²z WM_SETCURSOR °T®§®ÉÔ·|°õ¦æ¥|¦æ«ü¥O¡A¦p¤U¡G
.case WM_SETCURSOR mov rax,pCursor lea r10,hCursor[8*rax] invoke SetCursor,QWORD PTR [r10]
°õ¦æ¨ì¡uLEA R10,hCursor[8*RAX]¡v®É¡ARAX ¬° 2¡A8*RAX ¬° 16¡A´«ºâ¦¨¤Q¤»¶i¦ì¬° 10H¡C¡uhCursor[10H]¡v»P¡u[10H¡ÏhCursor]¡v¦P¸q¡A¥Nªí¦ì§} 5C5060H ¤º©ÒÀx¦sªº¼ÆÈ¡A¤]´N¬Oºñµ§ªº´å¼Ð¥N½X¡C¦Ó LEA «ü¥O¬O¨ú±o LEA ¤§«á¹Bºâ¤¸ªº©Ò¦b¦ì§}¡A©Ò¥H¡uLEA R10,hCursor[8*RAX]¡v°õ¦æ§¹²¦®É¡AR10 ¤§È¬° 5C5060H¡C¤U¤@¹D«ü¥O¬O¡uinvoke SetCursor,QWORD PTR [r10]¡v¡A¨ä¤¤ªº¡uQWORD PTR [r10]¡v´N¬O R10 ©Ò«ü¦ì§}¤ºªº¼ÆÈ¡A¤]´N¬Oºñµ§ªº´å¼Ð¥N½X¡C¦]¬°³o¹D«ü¥O¨S¦³¨ä¥L¸ê®Æ¥i´£¨Ñ¦¹¼ÆȪø«×¡A©Ò¥H¥[¤W¡uQWORD PTR¡v¥H«ü©wªø«×¡C
Á¿¤F³o»ò½ÆÂø¡A¤W±³Ì«á¨â¦æ«ü¥O¥ý¨ú±o¹Bºâ¤¸¡][10H¡ÏhCursor]¡^¡A¦A¥Î LEA ¥Ñ¹Bºâ¤¸¨ú±o¨ä¦ì§}¡AµM«á¤S¥H¸Ó¦ì§}¨ú±o¼ÆÈ¡]QWORD PTR [r10]¡^¡C§A©Î³\·|·Q«ç»ò³o»ò¨±°j³Â·Ð¡A¬°¦ó¤£ª½±µ¼g¦¨¡G
.case WM_SETCURSOR mov rax,pCursor mov r10,hCursor[8*rax] invoke SetCursor,r10
¨S¿ù¡A¥¿±`¼gªk´N¬O³o¼Ë¡A¦ý¬O¤p¤ì°¸¤£ª¾¬O¦óì¦]¡A¥Î UASM64.EXE µLªk²ÕĶ¡A¦ý¦pªG§ï¥Î ML64.EXE «o¯à²ÕĶ¦¨¥\¡]¨£ªþ¿ý¤G¡^¡C¾¨ºÞ¤£ª¾¹Dì¦]¡A¦ý¬O¥i¥H§Q¥Î¤Wz¨±°j³Â·Ðªº¤è¦¡¡AÅܳq³B²z¦Ó«á¹F¨ì¥Øªº¡C¡]¦pªGn¥Î ML64.EXE ²ÕĶ¡ADRAW2.ASM ¥²¶·µy·Lקï¡A¥i¥H¦Û¦æ¸Õ¸Õ¡^
¤£ºÞ§A¥Î UASM64.EXE ²ÕĶ©Î¬O¥Î ML64.EXE ²ÕĶ¡A³Ì«á¥Î LINK.EXE ³sµ²®É¡A³£¥²¶·¨Ï¥Î¡u/LARGEADDRESSAWARE:NO¡v¿ï¶µ¡Cì¦]¬O¡u.DATA¡v°Ï¬qªº¦ì§}¬O 64 ¦ì¤¸ªº¡A¦Ó¨Ï¥Î¤Wz⑷§Î¦¡ªº¶¡±µ©w§}¤è¦¡®É¡A°¾²¾¦ì§}¬O 32 ¦ì¤¸¡A¦]¦¹¦b³sµ²®É¥²¶·¥Î¡u/LARGEADDRESSAWARE:NO¡v½Õ¾ã¡C¡u/LARGEADDRESSAWARE:NO¡v¨Ã¨S¨î¤j¤p¼g¡A§¡¥Î¤p¼g©Î¤j¤p¼g§¨Âø¡A³£¥i¥H¡C
¦b«e±¡u³B²z WM_COMMAND °T®§¡v´£¨ì¡A§ïÅÜÃC¦â®É¡A¦P®É·|§ïÅܷƹ«´å¼ÐÅܬ°¸ÓÃC¦â§Îª¬ªºµeµ§¡C¨Æ¹ê¤W¡A§ó«nªº¬On§ïÅܵeµ§¡C¦]¬°¦b¸Ë¸m¤º®e¡]device context¡^µe¥X¤£¦PÃC¦âªº¾ò¶ê©Î½u¬q¡A¥²¶·¨Ï¥Î¤£¦PÃC¦âªºµeµ§¡C¦b DRAW2 ¤¤¡Aµeµ§ªºÃC¦â¦@¦³¥|ºØ¡A¦b²Ä 170¡ã178 ¦æ¡A«Ø¥ß¤F¥|ºØµeµ§¦Ó±o¨ìªº¥|¦âµeµ§¥N½X¡A»P·Æ¹«´å¼Ð¤@¼Ë¡A¦s¤J§t¦³¥|Ó¤¸¯Àªº hPen °}¦C¤¤¡C
n¨Ï¥Îþ¤@ºØµeµ§¡A»P·Æ¹«´å¼Ð¤@¼Ë¡A¥Î¶¡±µ©w§}ªº²Ä⑷ºØ§Î¦¡¡C¦s¨ú hCursor °}¦C¥Î pCursor §@¬°«ü¼Ð¡A¨º»ò¦s¨ú hPen °}¦C©O¡H©¯¹Bªº¬O¡A¦]¬°³o¨âÓ°}¦CªºÃC¦â±Æ¦C¶¶§Ç¤@¼Ë¡A©Ò¥H¤]¯à pCursor ¨Ó¦s¨ú hPen °}¦C¡Cµe¾ò¶ê©Î¤âø¹Ï³£µo¥Í©ó³B²z WM_PAINT °T®§®É¡A¤]¬O¦¹®É¤~»Ýn¦b hPen °}¦CŪ¨úµeµ§¡C³o¬qµ{¦¡½X¨£ DRAW2.ASM ªº²Ä 61¡ã64 ¦æ¡A¤]´N¬O©³¤Uµ{¦¡½Xªº²Ä 3¡ã5 ¦æ¡C
Ellipse ø»s¾ò¶êªºì²z¨£«e±¡A¤]´N¬O¥²¶·¦b¤u§@°Ï¤º¥H·Æ¹«¥ªÁäÂI¿ï¤£¦Pªº¨âÓÂI¡A¿ï©w²Ä¤GÓÂI¤§«á¤~¯à¦b¤u§@°Ï¤¤µe¥X¾ò¶ê¡C«ü©w¨âÓÂI¬O¦b³B²z WM_LBUTTONDOWN °T®§®Éµo¥Í¡Aµe¥X¾ò¶ê¬O¦b³B²z WM_PAINT °T®§¤¤¡CDRAW2.ASM ¤¤¥H ellips_pen ªí¥Ü³o¤TÓ¨BÆJ¡A©|¥¼«ü©w²Ä¤@ÂI®É ellips_pen ¬°¹s¡A¤w«ü©w²Ä¤@ÓÂI©|¥¼«ü©w²Ä¤GÓÂI®É ellips_pen ¬°¤@¡A¤w¿ï©w¨âÓÂI¤§«á ellips_pen ¬°¤G¡A¦¹¨è´N¸Ó©I¥s InvalidateRect µe¥X¾ò¶ê¡C³o¬q¹Lµ{ªºµ{¦¡½X¦p¤U¡G
.case WM_PAINT invoke BeginPaint,hWnd,ADDR ps mov rax,pCursor ;§ïÅܵeµ§ lea r10,hPen[rax*8] ;R10¡×µeµ§¥N½X©Ò¦b¦ì§} invoke SelectObject,ps.hdc,QWORD PTR [r10] ;·ídraw_what=0®É¡Aø»s¾ò¶ê¡F·ídraw_what=1®É¡A¤âø¹Ï .if (draw_what==0)&&(ellips_pen==2) invoke Ellipse,ps.hdc,lt_rect.x,lt_rect.y,rb_rect.x,rb_rect.y sub ellips_pen,2 .elseif draw_what==1 ⁝ .case WM_LBUTTONDOWN mov r8,r9 shr r9,10h ;R9¡×Y®y¼Ð and r8,0ffffh ;R8¡×X®y¼Ð .if draw_what==0 .if ellips_pen==0 ;µe¾ò¶ê®É³B²z²Ä¤@ÓÂI mov lt_rect.x,r8d mov lt_rect.y,r9d inc ellips_pen .elseif ellips_pen==1 ;µe¾ò¶ê®É³B²z²Ä¤GÓÂI mov rb_rect.x,r8d mov rb_rect.y,r9d inc ellips_pen invoke InvalidateRect,hWnd,0,0 .endif
¥H·Æ¹«¥ªÁäÂI¿ï²Ä¤@ÓÂI®É¡ADRAW2 ±N¨ä®y¼Ð¦s©ó lt_rect ¤º¡Clt_rect ¤¤ªº lt ¥Nªí¥ª¡]left¡^¡B¤W¡]top¡^ªº·N«ä¡A¦s§¹¤§«á±N ellips_pen Åܬ°¤@¡A´Nµ²§ô¤F²Ä¤@¨BÆJ¡C²Ä¤GÓÂI®y¼Ð¦s©ó rb_rect ¤º¨Ã¨Ï ellips_pen Åܬ°¤G¡AµM«á©I¥s InvalidateRect¡A±j¢¥Í¦¨ WM_PAINT °T®§¡C¦b³B²z WM_PAINT ®É¡ADRAW2 ¥²¶·±¹ï°£¤Fµe¥X¾ò¶ê¤§¥~¡A¦³®Énµe¥X¤âø¹Ï¡B¦³®ÉnÅã¥Ü·Æ¹«´å¼Ðªº®y¼Ð¡B¦³®ÉnÅã¥Ü¿ï¾Üµeµ§ªºÃC¦âµ¥¹Lµ{¡A©Ò¥H¥Î .if/.elseif/.endif Àˬd¬Oþ¤@ºØª¬ªp¡Cµe¥X¾ò¶ê¬O¦b draw_what ¬°¹s¡A¥B ellips_pen ¬°¤G®Éµo¥Í¡A¨£ DRAW2.ASM ²Ä 83¡ã85 ¦æ¡C
DRAW2 ¥i¥HÅý¨Ï¥ÎªÌ¦Û¦æ¨M©w¬O§_©ó¤u§@°Ï¥ª¤W¨¤Åã¥Ü·Æ¹«´å¼Ð©Ò¦bªº®y¼Ð¡CDRAW2 ¥ÎÅÜ¼Æ fXy ¨Óªí¥ÜÅã¥Ü©Î¤£Åã¥Ü¡AY fXy ¬° 1¡A´NÅã¥Ü®y¼Ð¡FY¬° 0¡A¤£Åã¥Ü®y¼Ð¡C³oºØ±¡§Î«Ü¹³ CPU ªººX¼Ð¡A©Ò¥H fXy ªº f ´N¬OºX¼Ð flag ªº·N«ä¡C
DRAW2 ¹w³]·|Åã¥Ü·Æ¹«®y¼Ð¡A¨Ï¥ÎªÌ¥i¥H¥Î·Æ¹«¥ªÁäÂI¿ï¡uÀ˵ø¡v¡÷¡u®y¼Ð¡v¨Ï DRAW2 ¤£Åã¥Ü¡FY¦AÂI¿ï®y¼Ð¤@¦¸¡A¤S¯àÅã¥Ü¡FY¦AÂI¿ï¤@¦¸¡A«h¤£Åã¥Ü¡K¡K¦p¦¹¤Á´«¤£¤w¡C³oºØ±¡§Î«Ü¹³ XOR ¹Bºâ¡]¨£²Ä¤@³¹¡^¡A¤]´N¬O¦p¦¹¡A©Ò¥H¦b²Ä 151 ¦æ¡A¨Ï¥Î¡uXOR fXy,1¡v´N¯à§¹¦¨³o¼Ëªº¤Á´«¹Bºâ¡C
³o¬Oµo¥Í¦b¨Ï¥ÎªÌÂI¿ï¡u®y¼Ð¡v¿ï¶µ¡A©Ò¥H¬O¦b³B²z WM_COMMAND °T®§¤¤µo¥Íªº¨Æ¡C¦pªG¤£Åã¥Ü®y¼Ð¡A¨º»ò±µ¤U¨Ó§ïÅÜ¡u®y¼Ð¡v¿ï¶µ¬°¤£¤Ä¿ï¡A´N§¹¦¨¤F¡F¦ý¦pªGnÅã¥Ü®y¼Ð¡A¨º»ò°£¤F§ïÅÜ¡u®y¼Ð¡v¿ï¶µ¬°¤Ä¿ï¤§¥~¡AÁÙ²o¯A¨ì·Æ¹«´å¼Ð²¾°Ê®Éªº®y¼Ð¡A¤Î©ó¤u§@°ÏÅã¥Ü¸Ó®y¼Ð¡C³o¨Ç¨Æ¥ó¤À§O²o¯A¨ì WM_MOUSEMOVE¡BWM_PAINT °T®§¡C¤]´N¬O»¡¡A·í¨Ï¥ÎªÌÂI¿ï®y¼Ð¿ï¶µ¡A²o¯A¨ì WM_COMMAND¡BWM_MOUSEMOVE¡BWM_PAINT ¤T«h°T®§¡A¦¹¤T«h°T®§¤£¶Èn³B²zÂI¿ï®y¼Ð¿ï¶µªº¨Æ¥ó¡A¤]n³B²z¨ä¥L¹³µe¾ò¶ê¡BÂI¿ïÅã¥ÜÃC¦âµ¥¨Æ¥ó¡A©³¤U¶È¦C¥X»PÂI¿ï®y¼Ð¬ÛÃöªºµ{¦¡½X¡G
.DATA szMouseFmt DB "(%03d,%03d)",0 szClear DB 5 DUP ("¡@") mouse POINT <> ;·Æ¹«´å¼Ð©Ò¦b®y¼Ð¡A·ífXy¬°¤@®ÉÅã¥Ü¦b¤u§@°Ï¥ª¤W¨¤ ⁝ .CODE WndProc PROC hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM LOCAL buffer[16]:BYTE .switch uMsg .case WM_PAINT invoke BeginPaint,hWnd,ADDR ps ;·ífXy=1®É¡AÅã¥Ü·Æ¹«®y¼Ð .if fXy==1 invoke wsprintf,ADDR buffer,OFFSET szMouseFmt,mouse.x,mouse.y lea r9,buffer .else mov r9,OFFSET szClear mov eax,SIZEOF szClear .ENDIF invoke TextOut,ps.hdc,0,0,r9,eax ⁝ invoke EndPaint,hWnd,ADDR ps .case WM_MOUSEMOVE mov r8,r9 shr r9,10h ;R9D¡×Y®y¼Ð and r8,0ffffh ;R8D¡×X®y¼Ð mov mouse.x,r8d mov mouse.y,r9d invoke InvalidateRect,hWnd,0,0 ;¹ï¥»¨µo¥XWM_PAINT°T®§ .case WM_COMMAND .if r8w==IDM_XY mov r8d,MF_UNCHECKED or MF_BYPOSITION xor fXy,1 jz @f mov r8d,MF_CHECKED or MF_BYPOSITION @@: invoke CheckMenuItem,hViewSubMenu,0,r8d .elseif r8w==IDM_COLOR ⁝
¥ý¬Ý¦p¦ó³B²z WM_COMMAND °T®§¡C¦]¬° DRAW2.ASM ªº¥\¯àªí¤W¦³³\¦h¿ï¶µ¡A©Ò¥H·|¦³¤@¤j¦ê .if/.elseif/.endif ¨ÓÀˬd¿ï¶µÃѧO½X¡A¦Ó¿ï¶µÃѧO½X¬O¦s¦b©ó R8W ¤º¡A³oì²z«e±´£¹L¡C·í³B²z¨Ï¥ÎªÌ«ö¤U®y¼Ð¿ï¶µ®É¡A¤£½×·í«e¿ï¶µ¬O§_¬°¤Ä¿ïªº¡A³£¥ý°²³]¥¼¤Ä¿ï¡A¤]´N¬O¥ý±N R8D ³]¬°¡uMF_UNCHECKED or MF_BYPOSITION¡v¡AµM«á°õ¦æ¡uXOR fXy,1¡v¡A¦p¦¹¤@¨Ó´N¯à³]©w¨Ï¥ÎªÌ¿ï©w«áªº¤Ä¿ïª¬ºA¡A¦P®É¤]¯à³]©w¹Bºâµ²ªG¬O§_¬° 0¡CY¬° 0¡A¦]¬°¦b°µ XOR ¹Bºâ«e¤w¥ý°²³]¦n¤F¡A©Ò¥Hª½±µ¸õ¦Ü¡u@@:¡v¼Ð°O³B§Y¥i¡FY¬°«D¹s¡A¨º´Nn§ïÅÜ R8D ¬°¡uMF_CHECKED or MF_BYPOSITION¡v¡C¡]µù¤@¡^
n¦p¦óÀò±o·Æ¹«´å¼Ð²¾°Ê¹Lµ{¤¤¡A´X¥G¨C¤@ÂIªº®y¼Ð©O¡Hµª®×¬O³B²z WM_MOUSEMOVE °T®§¡A¦b¦¹°T®§¤¤ lParam ªº²Ä 0¡ã15 ¦ì¤¸¬O·Æ¹«´å¼Ðªº X ®y¼Ð¡A²Ä 16¡ã31 ¦ì¤¸¬O Y ®y¼Ð¡C±N³oÂI®y¼Ð¦s©ó mouse ÅܼƤ¤¡AµM«á©I¥s InvalidateRect¡A±j¢µo¥X WM_PAINT °T®§¡A¥H¦b¤u§@°Ïø»s®y¼Ð¡C
¦b WM_PAINT °T®§¤¤¡A¨Ì¾Ú fXy ¤§È¡A¦L¥X¤£¦P¦r¦ê¡C·í fXy ¬°¤@®É¡A¦L¥X®y¼Ð¡F¬°¹s®É¡A¦L¥XªÅ¥Õ¦r¦ê¡AszClear¡A°µ¬°²M°£¡Cµ{¦¡½X«ÜÈÆ[´N¦b¤W±¡AÀ³¸Ó¤£»Ýn¸ÑÄÀ¡C
DRAW2 ´N¸ÑÄÀ¨ì³o¨à¡AÁöµMÁÙ¦³¤âø¹Ï»PÅã¥ÜÃC¦â¿ï¶µ¥¼¸ÑÄÀ¡A¦ý«eªÌ¦b²Ä¤Q¤T³¹ªº¨Ò¤l DRAW1 ¤w»¡©ú¹L¡A«áªÌ¥i°Ñ·Ó®y¼Ð¿ï¶µ¡AÀ³¥iÁA¸Ñ¡C
¦b»¡©ú§¹ DRAW2 ¤§«á¡A¤£ª¾¹D¦U¦ìŪªÌ¬O§_¦³©³¤Uªº·P¨ü¡CWindows µ{¦¡³]pªº¨C¶µ¥\¯à¡A¦ü¥Gn©î¦¨³\¦h³¡¤À¡A¤À´²¦b¼ÆÓ°T®§¤¤³B²z¡C¨Ò¦pèè´£¨ìªº¡An¦b¤u§@°ÏÅã¥Ü·Æ¹«´å¼Ð²¾°Êªº®y¼Ð¡An¦b WM_COMMAND¡BWM_MOUSEMOVE¡BWM_PAINT °T®§¤¤¤À§O³]©w¤Ä¿ïª¬ºA¡BÀò±o·Æ¹«´å¼Ðªº®y¼Ð¡A¦L¥X®y¼Ð¨Ó¡C¦Ó WM_COMMAND µ¥¤T«h°T®§¡A¤]¤£¬O¥u³B²z¤u§@°ÏÅã¥Ü·Æ¹«´å¼Ðªº®y¼Ð¦Ó¤w¡AÁÙ¦³¨ä¥L¨Æ¥ón³B²z¡C¦]¬°¥H¤Wì¦]¡AWindows µ{¦¡³Ì«á§e²{ªº¬Ý¨Ó«D±`Âø¶Ã¡A³o¦ü¥G¤]¬O¨S¿ìªkªº¡C
¥ý»¡ XOR ¹Bºâªº¯S©Ê¡CXOR ¤¤¤å¬O¤¬¥¸©Î¡A¥¦¦³Ó¯S©Ê¡A¡u¬YӼƻP¦P¤@¼Æ³s°µ¨â¦¸¤¬¥¸©Î¹Bºâ¤´±o¨ìì¼Æ¡v¡A©³¤U¬O²Ê²LªºÃÒ©ú¡G
1 XOR 1 ¡× 0 0 XOR 1 ¡× 1
1 »P 1 §@¤¬¥¸³f¹Bºâ±o 0¡A¨äµ²ªG»P¦P¤@¼Æ¡A1¡A¦A§@¤@¦¸¤¬¥¸©Î¡A¤S±o¦^ì¼Æ 1¡C¦^¨ì DRAW2 ªºµ{¦¡ùØ¡AfXy Y¬° 1 ªí¥ÜnÅã¥Ü®y¼Ð¡AY¬° 0 ¥Nªí¤£Åã¥Ü®y¼Ð¡C¦Ò¼{©³¤U¨âºØ±¡§Î¡G
±q¤W±±Ôzªºµ²ªG¨Ó¬Ý¡A¦pªG¦³¹³ DRAW2 ¤¤¡AÂI¿ï®y¼Ð¿ï¶µ´N¤Á´«¬Y¶µ¯S©Ê¡A´N¥iÀ³¥Î XOR ¹Bºâ¨Ó§¹¦¨¡A¤£¶Èµ{¦¡½X¤p¦Ó¥B°õ¦æ§Ö³t¡A«D±`¤è«K¡C¥t¥~¡A³o¬qµ{¦¡¦pªG¼g¦¨¤U±ªº¼Ë¤l¡G
.case WM_COMMAND .if r8w==IDM_XY xor fXy,1 .if fXy==1 mov r8d,MF_UNCHECKED or MF_BYPOSITION .else mov r8d,MF_CHECKED or MF_BYPOSITION .endif invoke CheckMenuItem,hViewSubMenu,0,r8d
¸û¨ã¥iŪ©Ê¡A¤]¸û®e©öÁA¸Ñ¡F¦ý¬O³o¼Ë¤lªº¸Ü¡Aµ{¦¡½X´N¦³¤K¦æ¡B¦@ 55 Ӧ줸²Õ¡C¦pªG¼g¦¨©³¤Uªº¼Ë¤l¡G
.case WM_COMMAND .if r8w==IDM_XY mov r8d,MF_UNCHECKED or MF_BYPOSITION xor fXy,1 jz @f mov r8d,MF_CHECKED or MF_BYPOSITION @@: invoke CheckMenuItem,hViewSubMenu,0,r8d
´N¥u¦³¤»¦æµ{¦¡½X¡B¦@ 45 Ӧ줸²Õ¡C³o¨ä¤¤ªº§Q®`±o¥¢¡A±o¦Û¤v®³®º¤F¡C¥t¥~¡AXOR ¹Bºâ·|§ïÅܹsȺX¼Ð¡A°²¦p¹Bºâµ²ªG¬° 0¡A¨º»ò´N·|³]©w¹sȺX¼Ð¡A¦Ó¤U¤@Ó JZ «ü¥O¬OÀˬd¹sȺX¼Ð¬O§_³]©w¡A¦pªG¬O¡A´Nµo¥Í¸õÅD¡C