ÁöµM¤j³¡¤Àªº¤H³£²ßºD¨Ï¥Î·Æ¹«¾Þ§@ Windows §@·~¨t²Î¤WªºÀ³¥Îµ{¦¡¡A¦ý Windows ¤]´£¨Ñ¤F¤£¨Ï¥Î·Æ¹«ªº¤è¦¡¡A·íµM³o¨Ã¤£¦n¥Î¡CWindows ´£¨Ñ¤F¤@®M¼Ð·Ç«öÁ䤶±¡A¥i¥H¥Î¨Ó¾Þ§@¥\¯àªí¡F°£¦¹¤§¥~¡AÀ³¥Îµ{¦¡¤]¥i¥H¦Û¦æ³]p¨âºØ¤èªk¾Þ§@¥\¯àªí¡A©Ò¥H¡AÁ`¦@¦³¤TºØ¤èªk¥i¥H¥ÎÁä½L¾Þ§@¥\¯àªí¡G
¡@¡@①¡B¼Ð·Ç«öÁ䤶±¡]standard keyboard interface¡^¡C
¡@¡@②¡B¥\¯àªí¦s¨úÁä©Î«K±¶Áä¡A^¤å¬O menu access keys¡A¤]ºÙ¬°§U¾ÐÁä¡]mnemonic keys¡^¡C
¡@¡@③¡BÁä½L¥[³tÁä¡A²ºÙ¥[³tÁä¡A^¤å¬O accelerators¡A¤]ºÙ¬° menu shortcut keys¡A¥i½Ķ¦¨¿ï³æ§Ö±¶Áä©Î²ºÙ§Ö±¶Áä¡C
²Ä¤@ºØ¬O Windows ´£¨Ñªº¡A«á¨âºØ¬OÀ³¥Îµ{¦¡´£¨Ñªº¡C
·íµM¡AWindows ¤]´£¨Ñ¤F¤@¨Ç¨t²Î¥[³tÁä¡A³oºØ¨t²Î¥[³tÁä§@¥Î½d³ò¨Ã¤£¬O¶È©óÀ³¥Îµ{¦¡¡A¦³¨Ç»P§@·~¨t²Î¤Î¨ä¥Lµ{¦¡¦³Ãö¡A¨Ò¦p Alt¡ÏEsc ¤Á´«¨ì¤U¤@Óµøµ¡¡BAlt¡ÏPrintScreen §â·í«e¬¡°Êªºµøµ¡¤º®e¥H¹Ï¤ù®æ¦¡½Æ»s¨ì°Å¶Kï¡BAlt¡ÏF4 Ãö³¬µøµ¡¡K¡Kµ¥¡A³o¨Ç¥[³tÁ䤣¦b¥»³¹°Q½×½d³ò¡C
¼Ð·Ç«öÁ䤶±¬O¥Ñ Windows ´£¨Ñªº¡A¨Ï¥ÎªÌ¥i¥H¥Î¥¦¨Ó¿ï¾Ü©Î°õ¦æ¥\¯àªí¤¤ªº¿ï¶µ¡A´N¦n¹³¨Ï·Æ¹«´å¼Ð¦b¥\¯àªí¤W²¾°Ê©Î¥H¥ªÁäÂIÀ»¿ï¶µ¤@¼Ë¡C®t§O¦b©ó¡AÁä½L¤¶±¤£»Ýn¯S§Oªºµ{¦¡½X¡CµL½×¨Ï¥ÎªÌ¬O³z¹LÁä½LÁÙ¬O·Æ¹«¿ï¾Ü¿ï¶µ¡AÀ³¥Îµ{¦¡³£·|±µ¦¬©R¥O°T®§¡C
«ö¡@Áä | »¡¡@©ú |
Alt Áä | ¤Á´«¶i¤J©M°h¥X¥\¯àªí¼Ò¦¡¡C |
Alt¡ÏªÅ¥ÕÁä | Åã¥Ü¨t²Î¥\¯àªí |
¦V¥kÁä | ¨Ï°ª«G«×²¾¨ì¤U¤@¼h¥\¯àªí¡F¦pªG°ª«G«×¿ï¶µ¨S¦³¤U¤@¼h¤l¥\¯àªí¡A¨º»ò´N·|²¾¨ì¥D¥\¯àªíªº¤Uӿﶵ¡F¦pªG¤w¨ì¥D¥\¯àªí³Ì¥kÃä¿ï¶µ¡A¨º»ò´N½ü¨ì¨t²Î¥\¯àªíÅܬ°°ª«G«×¡F¦pªG¤w¨ì¨t²Î¥\¯àªí¡A´N·|²¾¨ì¥D¥\¯àªí³Ì¥ªÃ䪺¿ï¶µ |
¦V¥ªÁä | »P¦V¥kÁäÃþ¦ü¡A¥u¬O¤è¦V¤£¦P©Î²¾¨ì¤W¼h¥\¯àªí |
¦V¤WÁä ¦V¤UÁä | ¨Ï°ª«G«×I´º¦b¤l¥\¯àªí¤¤¦V¤W©Î¦V¤U²¾°Ê¡F¦pªG°ª«G«×ªº¿ï¶µ¦b¥D¥\¯àªí¡A«ö¦V¤W©Î¦V¤UÁä¯àÅã¥Ü¤U¼h¤l¥\¯àªí |
Esc Áä | °h¥X¥\¯àªí¼Ò¦¡ |
Enter Áä | Åã¥Ü¤U¤@¼h¤l¥\¯àªí©Î¬O°õ¦æ¿ï¶µ¡]³o®Éµøµ¡¨ç¦¡·|¦¬¨ì WM_COMMAND ©Î WM_SYSCOMMAND¡^ |
¥\¯àªí¦s¨úÁä¡]menu access keys¡^¡A²ºÙ¦s¨úÁä¤]ºÙ¬°§U¾ÐÁä¡]mnemonic keys¡^¡C·í¨Ï¥ÎªÌ«ö¤U Alt Áä¶i¤J¥\¯àªí¼Ò¦¡®É¡A¥\¯àªíªº¿ï¶µ¤å¦r¤¤·|¦³¬YÓ^¤å¦r¥À©Îªü©Ô§B¼Æ¦rªº¤U±¥X²{©³½u¡A¥¦¹ïÀ³ªº«öÁä¡A´NºÙ¬°¦s¨úÁä¡C¶i¤J¥\¯àªí¼Ò¦¡«á¡A¨Ï¥ÎªÌ¥i¥Hª½±µ«ö¤U³oÓ¦s¨úÁä¨Ó¿ï¾Ü¸Ó¿ï¶µ¡A´N¦n¹³¥H·Æ¹«¥ªÁäÂIÀ»³oӿﶵ¤@¼Ë¡C¯S§Oªº¬O¡A³o®É¤£»Ýn¯S§Oªºµ{¦¡½X¡A´N¯à²£¥Í WM_COMMAND ©Î WM_SYSCOMMAND °T®§¡A¨ä¤¤ wParam ªº 0¡ã15 ¦ì¤¸¬O¿ï¶µÃѧO½X¡AlParam ¬O 0¡C
»s§@¦s¨úÁ䪺¤èªk«Ü²³æ¡C¥u»Ý¦b¸ê·½´yzÀɤ¤¡A§â MENUITEM ¤§«áªº¿ï¶µ¤å¦r¤¤ªº¬YÓ¦r¤¸«e¥[¤W¡u&¡v§Y¥i¡C¨Ò¦p¡G
MENUITEM "Â÷¶}(&E)",IDM_EXIT
«ö¤U Alt Áä«á¡A´N·|¬Ý¨£¿ï¶µ¤å¦r¬O¡uÂ÷¶}(E)¡v¡A¡uE¡vÁäºÙ¬°¦s¨úÁä©Î§U¾ÐÁä¡C
³Ì«á¤@¶µ¬OÁä½L¥[³tÁä¡A³q±`¥[³tÁä·|»P¥\¯àªí¤¤ªº¿ï¶µ©R¥O¬Û¦P¡A³o¥y¸Üªº·N«ä¬O¡A«ö¤U¬YÓ¥[³tÁä¡A¬Û·í©ó¥Î·Æ¹«¥ªÁäÂIÀ»¬Yӿﶵ°õ¦æ¨ä¥\¯à¡C»P§U¾ÐÁ䤣¦Pªº¬O¡AÀH®ÉÀH¦a³£¥i¥Hª½±µ«ö¥[³tÁäIJµo¡A¨Ã¤£»Ýn¶i¤J¥\¯àªí¼Ò¦¡¡C
Áä½L¥[³tÁä¡]keyboard accelerators¡^¡A©ÎºÙ¥[³tÁä¡A¬O«ü¯à°÷²£¥Í WM_COMMAND ©Î WM_SYSCOMMAND ªº«öÁä©Î²Õ¦X«öÁä¡C»P¼Ð·Ç«öÁä©Î¦s¨úÁ䤣¦Pªº¦a¤è¡A¬OÀH®ÉÀH¦a³£¥i¥Hª½±µ«ö¥[³tÁäIJµo¡Cn¨Ï¥ÎÁä½L¥[³tÁä¡A¥²¶·¥ý¦b¸ê·½´yzÀɤº«Ø¥ß¥[³tÁäªí®æ¡Aì©lµ{¦¡¤¤·f°t¾A·íªºµ{¦¡½X³B²z¥[³tÁä°T®§¡C
§Ö±¶Áä³q±`©w¸q¦b¸ê·½´yzÀɤºªº ACCELERATORS °Ï¶ô¤º¡C¥²¶·¥ýµ¹ ACCELERATORS °Ï¶ô«ü©w¦WºÙ¡AºÙ¬°¥[³tÁäªí®æ¦WºÙ¡AµM«á¦b¤@¹ï BEGIN¡þEND ¤§¶¡¤~¬O¦UºØ¥[³tÁ䪺©w¸q¡C¾ãÓ ACCELERATORS °Ï¶ô»yªk¦p¤U¡G
AccTableName ACCELERATORS [optional-statements] BEGIN event, idvalue [,type] [,options] ⁝ END
©³¤U¬O ACCELERATORS °Ï¶ôªº»¡©ú¡G
"b", 2000, ASCII "B", 2001, ASCII "+", 2002
"^A", 2003
"Y", 2004,ASCII "Z", 2005,VIRTKEY
¤U±¨Ò¤l¨ÒÁ|¤F¤»ºØ¥[³tÁä¡A±Ò°Ê¥[³tÁ䪺«öÁä¦b«á±ªºµù¸Ñ¤¤¡C¨ä¤¤¥H¤@¹ïÂù¤Þ¸¹¡]¡u"¡v¡^¬A¦íªº¬O¦r¤¸¡A¨S¦³¥ÎÂù¤Þ¸¹¬A¦íªº¬O«öÁä¡C
#define IDM_HELP 5005 ⁝ MY_ACCE ACCELERATORS { VK_PRIOR,5000,VIRTKEY,ALT,CONTROL //Alt¡ÏCtrl¡ÏPageUp "B", 5001,VIRTKEY //B "^r", 5002 //Ctrl¡Ï"r" ©Î Ctrl¡Ï"R" "G", 5003 //"G" 0x55, 5004,ASCII,ALT //Alt¡Ï"U" "h", IDM_HELP //"h" }
¥Ñ¤W±ªº»¡©ú¡A¥i¥H±oª¾¡A¦pªG type ³]¬° ASCII ªº¸Ü¡An¦Ò¼{ CapsLock ªºª¬ºA¥H¤Î¬O§_«ö¤U Shift Áä¡A¥¦Ì³£·|¼vÅT¤j¤p¼g¡A¦Ó¥B¤S¦³¨Ò¥~¡A¤ñ¸û½ÆÂø¡C¦]¦¹¡A°£«D·Q¥Î¤p¼gªº^¤å¦r¥À§@¬°¥[³tÁä¤~¨Ï¥Î ASCII Ãþ«¬¡A§_«h«Øij¦b³]¸m¥[³tÁä®É¡A¾¨¶q±Ä¥Î VIRTKEY Ãþ«¬¡A³o¼Ë´N¥uºÞ«öÁä¦Ó¤£²z¤j¤p¼g¡A¸û¬°³æ¯Â¡C¦¹¥~ÁÙ¦³Ó²z¥Ñ¡A±Ä¥Î VIRTKEY Ãþ«¬¤w¯à«ü©wÁä½L¤Wªº©Ò¦³«öÁä¤F¡C
¦b¸ê·½¤¤©w¸q¤F¥[³tÁ䤧«á¡AÁÙ¥²¶·©I¥s LoadAccelerators ±N¨ä¸ü¤J¡A¨Ã¨ú±o¥[³tÁä¥N½X¡ALoadAccelerators ªº»yªk¦p¤U¡G
invoke LoadAccelerators,\ hInstance,\ ; handle of application instance lpTableName ; address of table-name string
hInstance ¬O¼Ò²Õ¥N½X¡A¥i¥H©I¥s GetModuleHandle ±o¨ì¡ClpTableName ¬O¥[³tÁäªí®æ¦WºÙªº¦ì§}¡A¥[³tÁäªí®æ¦WºÙ¥i¥H¬O^¤å¦r¥À¡Bªü©Ô§B¼Æ¦rµ¥²Õ¦¨ªº¦r¦ê¡A¤]¥i¥H¬O 1¡ã65535 ¤§¶¡ªº¾ã¼Æ¡C¥²¶·»P¸ê·½´yzÀɤ¤ªº ACCELERATORS °Ï¶ô°t¦X¡C
¦pªG LoadAccelerators °õ¦æ¦¨¥\¡A¦^¶ÇȬO¥[³tÁäªí®æªº¥N½X¡F¦pªG°õ¦æ¥¢±Ñ¡A¦^¶ÇȬ°¹s¡C
TranslateAccelerator ·|¦b°T®§°j°é¤¤Àˬd WM_KEYDOWN ©Î WM_SYSKEYDOWN ¨â°T®§¡A¬Ý¬Ý¬O§_¦³²Å¦X¥[³tÁäªí®æ¤¤ªº¬Y¶µ¥[³tÁä¡A¦pªG¦³ªº¸Ü´N¦V¥Ø¼Ðµøµ¡µo°e WM_COMMAND ©Î WM_SYSCOMMAND °T®§¡A¨Ã§â¦^¶Çȳ]¬°¤@¡F¦pªG¨S¦³ªº¸Ü¤£°µ³B²z¡A¦^¶ÇȬ°¹s¡CTranslateAccelerator ªº»yªk¦p¤U¡G
invoke TranslateAccelerator,\ hWnd,\ ; handle of destination window hAccTable,\ ; handle of accelerator table lpMsg ; address of structure with message
hWnd ¬°¥Ø¼Ðµøµ¡¥N½X¡ATranslateAccelerator ·|§â WM_COMMAND ©Î WM_SYSCOMMAND °T®§¶Ç°eµ¹¥Ø¼Ðµøµ¡¡ChAccTable ¬O¥[³tÁäªí®æ¥N½X¡ATranslateAccelerator ·|§â¨Ï¥ÎªÌ¿é¤JªºÁä½L°T®§»P¦¹¥[³tÁäªí®æ¥N½X¤¤ªº¥[³tÁä¤ñ¹ï¡ClpMsg ¬° MSG µ²ºcÅé¦ì§}¡A°T®§°j°é¤¤ªº°T®§³£¦s©ó¦¹¡C
¥[³tÁä¨Ã¤£¬O¨Ï¥ÎªÌ¯u¥¿·Q¿é¤Jµøµ¡ªº¸ê®Æ¡A¤ñ¦p¨Ï¥ÎªÌ¦b°O¨Æ¥»¤¤¿é¤J¤å¦r¡AµM«á«ö Ctrl¡ÏC ¬O¬°¤F¡u½Æ»s¡v¡A¦Ó¨Ã¤£¬O·Q¿é¤J Ctrl¡ÏC Áä¹ïÀ³ªº¦r¤¸¡A©Ò¥H TranslateAccelerator ³B²z§¹ Ctrl¡ÏC Á䤧«á´NÀ³¸Ó¥á±ó¦¹°T®§¡C¤]´N¬O»¡²Å¦X¥[³tÁ䪺Áä½L°T®§¤£À³¸Ó¦Aµo°eµ¹µøµ¡¨ç¦¡¡A¥u¦³¤£²Å¦X¥[³tÁ䪺°T®§¡]¦^¶ÇȬ°¹s¡^¤~n©I¥s TranslateMessage »P DispatchMessage Ä~Äò³B²z¡C¦]¦¹°T®§°j°éªº¼gªk¦p¤U¡G
.while TRUE invoke GetMessage,ADDR msg,0,0,0 .break .if rax==0 invoke TranslateAccelerator,hwnd,hAcce,ADDR msg .if rax==0 invoke TranslateMessage,ADDR msg invoke DispatchMessage,ADDR msg .endif .endw
©³¤U¹ê§@¤@Ó¨Ò¤l¡AACCE¡A¬Ý³o¦W¦r´Nª¾¹D ACCE ¬O«ü accelerator ªº·N«ä¡C°õ¦æ®É¦p¤U¹Ï¡A¦b¤u§@°Ï¥¿¤¤¥¡¦³´X¦æ»¡©ú¤å¦r¡A¤º®e¬O«ö¤Uþ¨Ç¥[³tÁä¯à§ïÅܤå¦rªºÃC¦â¡C°£¦¹¤§¥~¡A¥t¦³¤TÓ¥[³tÁä¨S¦³¼g¥X¨Ó¡A¤À§O¬O«ö¤U¡uQ¡v¦r¤¸Â÷¶} ACCE.EXE¡B«ö¤U¡uh¡v¦r¤¸¼u¥X¤@µøµ¡Åã¥Ü ACCE ªº¤¤¤å¦WºÙ¡B«ö¤U¡uCtrl¡ÏV¡v¼u¥X¤@µøµ¡Åã¥Üª©¥»¡CÁ`¦@¤CÓ¥[³tÁä¡C¤U¹Ï¬O¥H·Æ¹«¥ªÁäÂIÀ»¡uÀ˵ø¡vªºµ²ªG¡CACCE »Ýn¤TÓÀɮסGACCE.ASM¡BACCE.RC¡BMENU.ico¡C©³¤U¬O ACCE.RC ªº¤º®e¡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 |
#include "RESOURCE.H"
#define IDM_QUIT 3000
#define IDM_BLACK 3001
#define IDM_RED 3002
#define IDM_GREEN 3003
#define IDM_BLUE 3004
#define IDM_HELP 3005
#define IDM_VERSION 3006
![]() MY_MENU ICON MENU.ico
MY_MENU MENU
{
MENUITEM "Â÷¶}(&Q)",IDM_QUIT
POPUP "À˵ø(&V)"
{
MENUITEM "¶Â\tCtrl-B",IDM_BLACK
MENUITEM "¬õ\tAlt-R",IDM_RED
MENUITEM "ºñ\tAlt-Shift-G",IDM_GREEN
MENUITEM "ÂÅ\tCtrl-Shift-U",IDM_BLUE
}
MENUITEM "À°§U(&h)",IDM_HELP,HELP
}
HOT_KEY ACCELERATORS
{
"Q", IDM_QUIT
"^B", IDM_BLACK,ASCII
"R", IDM_RED,VIRTKEY,ALT
"G", IDM_GREEN,VIRTKEY,ALT,SHIFT
"U", IDM_BLUE,VIRTKEY,CONTROL,SHIFT
"h", IDM_HELP,ASCII
"V", IDM_VERSION,VIRTKEY,CONTROL
} |
ACCE.RC ªº²Ä¤@¦æ¬O¡u#include "RESOURCE.H"¡v¡A³o¦æ¬O§â RESOURCE.H ¥]§tÀɧt¬A°_¨Ó¡A¦]¬°¥¦ùر«Å§i¤FµêÀÀÁä½X¡C
ACCE.RC ªº MENU °Ï¶ô¤¤¡A¦b³»¼h¥\¯àªí¤¤ªº¤Tӿﶵ¡GÂ÷¶}¡BÀ˵ø¡BÀ°§U¡A¨ä¿ï¶µ¤å¦r³£¦³¡u&^¤å¦r¥À¡v¡A³oÓ^¤å¦r¥Àªº«öÁä´N¬O§U¾ÐÁä¡C¦bÀ˵ø¤l¥\¯àªí¤¤ªº¨CÓ MENUITEM ¤¤¡A©Ò©w¸qªº¿ï¶µ¤å¦r¤¤§t¦³¡u\t¡v¡]¤]¥i¥H¨Ï¥Î¡u\T¡v¡^¡A·|Åý¦b³o¯S®íªº¨â¦r¤¸¤§«áªº¤å¦r¾a¥k¹ï»ô¡A¥Nªí³o«á±ªº¬O¥[³tÁä¡C
§U¾ÐÁä¥u»Ý¦b MENU °Ï¶ô©w¸q¦n§Y¥i¡AWindows ·|¨Ì¾Ú¿ï¶µ¤å¦r«á±ªº¿ï¶µÃѧO½X°õ¦æ¬Û¹ïÀ³ªº¥\¯à¡A¦]¦¹¦b¸ê·½´yzÀÉ»Pì©lµ{¦¡¤£»Ýn²K¥[¨ä¥Lµ{¦¡½X¡C¦ý¬O¥[³tÁä´N¤£¬O³o¼Ë¤F¡A¥²¶·¦b ACCELERATORS °Ï¶ô¤¤©w¸q¬Û¹ïÀ³ªº«öÁä¡A¦Ó¥BÁÙn¦bì©lµ{¦¡¤¤²K¥[³B²z WM_COMMAND ©Î WM_SYSCOMMAND °T®§ªºµ{¦¡½X¡A¨Ã¦b°T®§°j°é¤¤©I¥s TranslateAccelerator ¤~¦æ¡C
¤W± ACCE.RC ªº²Ä 25¡ã34 ¦æ©w¸q¤F ACCELERATORS °Ï¶ô¡C¨ä¤¤²Ä 27¡B28¡B32 ¦æªº type ¬O ASCII¡A¦Ó¨ä¥L¥[³tÁ䪺 type ¬O VIRTKEY¡C«e±´£¹L¡Atype ¬O ASCII ªº¥[³tÁ䥲¶·n¦bÁä½L¤W«ö¥X¸Ó¦r¤¸¡A¤]´N¬O»¡¡An«ö¥[³tÁäÂ÷¶} ACCE.EXE¡A¥²¶·«ö¥X¡uQ¡v¦r¤¸¡A¦pªG¦b CapsLock ¿Oº¶·Àªº±¡§Î¤U¥²¶·«ö¡uShift¡ÏQ¡v¡A©Î¬O¦b CapsLock ¿O«GµÛªº±¡§Î¤U«ö¡uQ¡vÁä¤~¯à±Ò°Ê¥[³tÁäÂ÷¶}µ{¦¡¡C±Ò°ÊÀ°§Uªº§Ö³tÁä¤]¬O¦p¦¹¡C¦ý¨Ï¤å¦rÃC¦âÅܶ¦⪺¥[³tÁä¬O¨Ò¥~¡A«e±¤w´£¹L¡C¨ä¥L¥|Ó¥[³tÁ䪺 type ¬O VIRTKEY¡A±¡ªp³æ¯Â¡A¨Ì¾Ú¨ä«á options ªº²Õ¦XÁä«ö¤U¡A´N¯à±Ò°Ê¥[³tÁä¡C
©³¤U¨Ó¬Ý¬Ý²Õ¦X»y¨¥ì©lµ{¦¡¡AACCE.ASM¡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 |
;¥Ü½d¥[³tÁä
;²ÕĶ»P³sµ²¡G
; uasm64 -win64 acce.asm
; rc acce.rc
; link acce.obj acce.res
OPTION CASEMAP:NONE
OPTION WIN64:7
INCLUDE WINDOWS.INC
INCLUDELIB GDI32.LIB
INCLUDELIB KERNEL32.LIB
INCLUDELIB USER32.LIB
IDM_QUIT EQU 3000
IDM_BLACK EQU 3001
IDM_RED EQU 3002
IDM_GREEN EQU 3003
IDM_BLUE EQU 3004
IDM_HELP EQU 3005
IDM_VERSION EQU 3006
;*****************************************************************************************
.CONST
szMenuName LABEL BYTE
szClassName LABEL BYTE
szIconName DB "MY_MENU",0
szAcce DB "HOT_KEY",0
szAppName DB "¥[³tÁä½d¨Ò",0
szHelp DB "¥[³tÁä½d¨Òµ{¦¡¡C",0
szText DB "«ö©³¤U¥[³tÁä§ïÅÜÃC¦â¡G",0dh,0ah,\
"¡@Ctrl-BÅܶ¦â",0dh,0ah,\
"¡@Alt-RÅܬõ¦â",0dh,0ah,\
"¡@Alt-Shift-GÅܺñ¦â",0dh,0ah,\
"¡@Ctrl-Shift-UÅÜÂŦâ",0
szVersion DB "ª©¥»(&V)",0
szVerText0 DB "ª©¥»½s¸¹¡G0.01ª©",0dh,0ah,"§A«öªº¬O§U¾ÐÁä",0
szVerText1 DB "ª©¥»½s¸¹¡G0.01ª©",0dh,0ah,"§A«öªº¬O¥[³tÁä",0
szVerCaption DB "ª©¥»",0
;*****************************************************************************************
.DATA
hInstance QWORD ? ;¼Ò²Õ¥N½X
hwnd HWND ? ;µøµ¡¥N½X
hMenu HMENU ? ;¥\¯àªí¥N½X
hViewSubMenu HMENU ? ;À˵ø¤l¥\¯àªí¥N½X
hSysMenu HMENU ?
hAcce HANDLE ? ;¥[³tÁäªí®æ¥N½X
color DD 0 ;Åã¥Ü©ó¤u§@°ÏszTextªºÃC¦â
;*****************************************************************************************
.CODE
;-----------------------------------------------------------------------------------------
DrawTextCentered PROC hdc:HDC,pText:LPCTSTR,pRect:QWORD
;DrawTextCentered¯à§â¦h¦æªº¦r¦êÅã¥Ü¦b©Ò«ü©wªº¯x§Î¡]¥~³¡¯x§Î¡^¤¤¥¡¡]¤ô¥¸m¤¤¥B¹]Áè¸m¤¤¡^
;¿é¤J¡Ghdc¡Ð¸Ë¸m¤º®e¥N½X
;¡@¡@¡@pText¡Ð¦r¦ê¦ì§}¡A¦¹¦r¦ê¬°ASCII©ÎBig5½s½X¥B¥H¹s¬°µ²§À¡C¦r¦ê®æ¦¡¦p¤U¡G
;¡@¡@¡@¡@¡@¡@¡@¡@¡@szText DB "²Ä¤@¦æ¤å¦r",0dh,0ah,\
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@"²Ä¤G¦æ¤å¦r",0dh,0ah,\
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@⁝
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@"³Ì«á¤@¦æ¤å¦r",0
;¡@¡@¡@pRect¡Ð¥~³¡¯x§Î¦ì§}¡A¯x§Î¥HRECTµ²ºcÅéªí¥Ü
;¿é¥X¡G¦¨¥\¦^¶ÇȬ°«D¹s¡F¥¢±Ñ¦^¶ÇȬ°¹s¡]³q±`¬O¥~³¡¯x§Î¤£¨¬¥H®e¯Ç¦r¦ê¡^
LOCAL min_rect:RECT ;¯à¥]§t¦b¦ì§}pText¤W¦r¦êªº³Ì¤p¯x§Î
mov min_rect.top,0
mov min_rect.left,0
invoke DrawText,hdc,pText,-1,ADDR min_rect,DT_CALCRECT
ASSUME rax:PTR RECT
mov rax,pRect ;EAX¡×¥~³¡¯x§Î¦ì§}
mov r10d,[rax].right
mov r11d,[rax].bottom
sub r10d,[rax].left ;R10D¡×¥~³¡¯x§Î¼e«×
sub r11d,[rax].top ;R11D¡×¥~³¡¯x§Î°ª«×
sub r10d,min_rect.right ;R10D¡×¦©°£¥]§t¦r¦ê¼e«×¤§«áªº¼e«×
jb error ;¦pªGR10D¤p©ó¯à®e¯Ç¦r¦ê³Ì¤p¯x§Îªº¼e«×¡A¸õÅD¦Üerror³B
sub r11d,min_rect.bottom ;R11D¡×¦©°£¥]§t¦r¦ê°ª«×¤§«áªº°ª«×
jb error ;¦pªGR11D¤p©ó¯à®e¯Ç¦r¦ê³Ì¤p¯x§Îªº°ª«×¡A¸õÅD¦Üerror³B
shr r10d,1 ;R10D¡×¦b¦r¦ê¥ª©Î¥k¨âÃ䪺ªÅ¥Õ¼e«×
shr r11d,1 ;R11D¡×¦b¦r¦ê¤W©Î¤U¨âÃ䪺ªÅ¥Õ°ª«×
add [rax].left,r10d
add [rax].top,r11d
sub [rax].right,r10d
sub [rax].bottom,r11d
ASSUME rax:NOTHING
invoke DrawText,hdc,pText,-1,rax,DT_LEFT or DT_TOP
jmp exit
error: xor rax,rax
exit: ret
DrawTextCentered ENDP
;-----------------------------------------------------------------------------------------
WndProc PROC hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
LOCAL ps:PAINTSTRUCT,rect:RECT
.switch uMsg
.case WM_COMMAND
.if r8w==IDM_QUIT
jmp quit
.elseif r8w==IDM_BLACK
mov color,0
.elseif r8w==IDM_RED
mov color,0ffh
.elseif r8w==IDM_GREEN
mov color,0ff00h
.elseif r8w==IDM_BLUE
mov color,0ff0000h
.elseif r8w==IDM_HELP
invoke MessageBox,hWnd,OFFSET szHelp,OFFSET szAppName,MB_OK or MB_ICONINFORMATION
jmp @f
.endif
movzx rax,r8w
invoke CheckMenuRadioItem,hViewSubMenu,IDM_BLACK,IDM_BLUE,eax,MF_BYCOMMAND
@@: invoke InvalidateRect,hWnd,0,1
.case WM_PAINT
invoke BeginPaint,hWnd,ADDR ps
invoke GetClientRect,hWnd,ADDR rect
invoke SetTextColor,ps.hdc,color
invoke DrawTextCentered,ps.hdc,OFFSET szText,ADDR rect
invoke EndPaint,hWnd,ADDR ps
.case WM_SYSCOMMAND
.if r8w==IDM_VERSION
mov rdx,OFFSET szVerText0
test r9d,10000h
jz @f ;YZR¡Aªí¥Ü«ö¤U§U¾ÐÁä¡]¦b¥\¯àªí¼Ò¦¡¤U«ö¡uV¡vÁä¡^
mov rdx,OFFSET szVerText1 ;YNZ¡Aªí¥Ü«ö¤U¥[³tÁä¡uCtrl¡ÐV¡v
@@: invoke MessageBox,hWnd,rdx,OFFSET szVerCaption,MB_OK or MB_ICONQUESTION
.else
jmp deflt
.endif
.case WM_CREATE
invoke GetSubMenu,hMenu,1
mov hViewSubMenu,rax
invoke CheckMenuRadioItem,hViewSubMenu,IDM_BLACK,IDM_BLUE,IDM_BLACK,MF_BYCOMMAND
invoke GetSystemMenu,hWnd,0
mov hSysMenu,rax
invoke AppendMenu,hSysMenu,MF_STRING,IDM_VERSION,OFFSET szVersion
.case WM_DESTROY
quit: invoke PostQuitMessage,0
.default
deflt: 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
lea rdx,WndProc
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
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
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,rax
lea r10,szClassName
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,0
mov wc.lpszClassName,r10
invoke RegisterClassEx,ADDR wc
invoke LoadMenu,hInstance,OFFSET szMenuName
mov hMenu,rax
invoke LoadAccelerators,hInstance,OFFSET szAcce ;¸ü¤J¥[³tÁäªí®æ
mov hAcce,rax
invoke CreateWindowEx,0,OFFSET szClassName,OFFSET szAppName,\
WS_CAPTION or WS_SYSMENU,100,100,400,300,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 TranslateAccelerator,hwnd,hAcce,ADDR msg ;§â½Ķ¥[³tÁä°T®§
.if rax==0
invoke TranslateMessage,ADDR msg
invoke DispatchMessage,ADDR msg
.endif
.endw
invoke ExitProcess,0
main ENDP
;*****************************************************************************************
END main |
ACCE.ASM ¤¤ªº¥[³tÁä¨Ì¾Ú»P¤§·f°tªº¿ï¶µ¦bþÓ¥\¯àªí¡A¥i¤À¦¨¤TÃþ¡G
«e¨âºØ±¡§Î¬O¤@¼Ëªº¡A¥²¶·³B²z WM_COMMAND °T®§¡F¦Ó²Ä¤TºØ¥²¶·³B²z WM_SYSCOMMAND °T®§¡C¦ý¤£½×¬Oþ¤@ºØ¡A³£¥Ñ¸ê·½´yzÀɤ¤ªº ACCELERATORS ©w¸q¡A¨Ã©I¥s LoadAccelerators ¸ü¤J¡AµM«á¦b°T®§°j°é¤¤©I¥s TranslateAccelerator¡A¨Ì¾Ú¥[³tÁä©Ò·f°tªº¿ï¶µ¬O§_¦b¨t²Î¥\¯àªí¤º¡A±N¨äÂà´«¦¨ WM_COMMAND¡]¿ï¶µ¤£¦b¨t²Î¥\¯àªí¤º¡^ ©Î WM_SYSCOMMAND¡]¿ï¶µ¦b¨t²Î¥\¯àªí¤º¡^¡C
·í¨Ï¥ÎªÌ«ö¤U¥[³tÁä¥B»P³o¥[³tÁä·f°tªº¿ï¶µ¤£¦b¨t²Î¥\¯àªí¤º¡A¨t²Î·|§â WM_COMMAND °T®§¶Çµ¹ ACCE ªºµøµ¡¨ç¦¡¡Aµøµ¡¨ç¦¡Àˬd¿ï¶µÃѧO½X°µ¬Û¹ïÀ³ªº¤u§@¡C¤£ª¾¦³¨S¦³¤H·|¦³ºÃ°Ý¡A«ç»ò«ö¤U¥[³tÁä¡Aµøµ¡¨ç¦¡«o¬O¤ñ¹ï¿ï¶µÃѧO½X³B²z°T®§¡H¨ä¹êµª®×«Ü²³æ¡A¦]¬° ACCE §â¥[³tÁäÃѧO½X³]¬°¬Û¹ïÀ³ªº¿ï¶µÃѧO½X¡A¤]´N¬O¨âªÌ¬Û¦P¡A³o¼Ë´N¤£¶·¼¶¼gÃB¥~ªºµ{¦¡½X¥h³B²z«ö¤U¥[³tÁä¨Æ¥ó©Ò²£¥Íªº°T®§¡C¬O¤£¬O«Ü¤è«K©O¡H
³oùسB²z¥[³tÁ䪺¤è¦¡¡]©Î¿ï¶µ¡^¥i¤À¬°¨âºØ¡G①Â÷¶}»PÀ°§U¿ï¶µ¡B②§ïÅÜÃC¦âªº¿ï¶µ¡C«áªÌ¤ñ¸û½ÆÂø¡A¨Ã¤£¬O¥un§ïÅÜÃC¦â´N¦n¤F¡AÁÙ¥²¶·©I¥s InvalidateRect¡A¤~¯à¬Ý¨£¤u§@°Ï¤ºªº¤å¦r§ïÅÜÃC¦â¡C°£¦¹¤§¥~¡AÁÙn©I¥s CheckMenuRadioItem¡A¤~¯à³]©w¦n²{¦b¿ï¾Ü¬Oþӿﶵ¡C
¥H¤W³o¬qµ{¦¡¦b²Ä 90¡ã107 ¦æ¡C
·í¨Ï¥ÎªÌ«ö¤U¥[³tÁä¡A¥B»P³o¥[³tÁä·f°tªº¿ï¶µ¦b¨t²Î¥\¯àªí¤º¡A¨t²Î·|§â WM_SYSCOMMAND °T®§¶Ç°eµ¹µøµ¡¨ç¦¡¡CACCE ¥u»Ý³B²z¥¦¦Û¤v©w¸q»P¥[³tÁä·f°tªº¿ï¶µ§Y¥i¡A³oºØ¿ï¶µªºÃѧO½X¥²¶·¤p©ó 0F000H¡C¦Ó¦b¨t²Î¥\¯àªí¤ºªº¨ä¥L¿ï¶µ¬O¨t²Î¤º«Øªº¡A¶·¥æ¥Ñ DefWindowProc ³B²z¡C³o¬qµ{¦¡¦b²Ä 116¡ã125 ¦æ¡C
¦b ACCE ¤¤ÁÙ®i¥Ü¤F¨Ï¥ÎªÌ«ö¥[³tÁä©Î«ö§U¾ÐÁ䤣¦Pªº³B²z¤è¦¡¡AÀË´ú lParam ªº²Ä 16 ¦ì¤¸¹sÁÙ¬O¤@¡A´N¯à¹F¨ì¥Øªº¡C¦]¬°²Ä¤C¦æ¡A³]©w¤F¡uOPTION WIN64:7¡v¡A¦]¦¹¤@¶i¤Jµøµ¡¨ç¦¡«á¡AR9 ¤§È´N¤w¸g³]¬° lParam ¤F¡F©Ò¥H²Ä 119 ¦æªº TEST «ü¥O´N¬OÀË´ú²Ä 16 ¦ì¤¸¬O¹sÁÙ¬O¤@¡C¦pªG¬O¹s¡Aªí¥Ü«ö¤Uªº¬O§U¾ÐÁä¡F¦pªG¬O¤@¡Aªí¥Ü«ö¤Uªº¬O¥[³tÁä¡C
DrawTextCentered °Æµ{¦¡¬O¥Î¨Ó§â¤@Ó¦h¦æ¦r¦êÅã¥Ü¦b¤@Ó¯x§Î½d³òªº¥¿¤¤¥¡¡A¤£¶È¤ô¥¸m¤¤¡A¤]¬O¹]Áè¸m¤¤¡C¥¦¨Ã¤£¬O Win64 API¡A¦Ó¬O¤p¤ì°¸¦Û¦æ¼¶¼gªº°Æµ{¦¡¡A¥¦ªº»yªk¬O¡G
invoke DrawTextCentered,\ hdc,\ pText,\ pRect
hdc ¬O¸Ë¸m¤º®e¡CpText ¬O¦r¦ê¦ì§}¡A³oÓ¦r¦ê¥²¶·§t¦³´«¦æ²Å¸¹¡]´«¦æ²Å¸¹´N¬O 0DH¡B0AH ²Õ¦X¡^¡CpRect ¬O RECT µ²ºcÅé¦ì§}¡A³oÓµ²ºcÅé«ü©w¤F¤@Ó¯x§Î½d³ò¡A¥iºÙ¬°¥~³¡¯x§Î¡ApText ¦ì§}¤Wªº¦r¦ê±NÅã¥Ü¦b¥~³¡¯x§Îªº¥¿¤¤¶¡¡C¦pªG DrawTextCentered °õ¦æ¦¨¥\¡A¦^¶ÇȬOø»s¤å¦rªº°ª«×¡A¦]¬°¬O¦h¦æ¤å¦r©Ò¥H¬OÁ`°ª«×¡F¦pªG°õ¦æ¥¢±Ñ¡A¦^¶ÇȬO 0¡C
¨º»ò DrawTextCentered ¬O«ç»ò§â¦h¦æ¦r¦êÅã¥Ü¦b¥~³¡¯x§Îªº¥¿¤¤¥¡©O¡H²Ä¤K³¹´¿´£¹L DrawText ¥i¥H¥Î¡uDT_SINGLELINE or DT_CENTER or DT_VCENTER¡v°Ñ¼Æ¨Ï³æ¦æ¤å¦r¤ô¥¸m¤¤¥B¹]Áè¸m¤¤¡A¦pªG¦h¦æ¤å¦r´NµL¯à¬°¤O¤F¡C¤£¹LÁÙ¬O¥i¥H§Q¥Î¡uDT_CALCRECT¡v°Ñ¼Æ¡A¥hpºâ«ê¦n¯à®e¯Ç¦h¦æ¦r¦ê©Ò»Ý³Ì¤p¯x§Îªº¼e«×»P°ª«×¡C
¹Lµ{¦p¤U¡Gº¥ý©w¸q°Ï°ìÅÜ¼Æ min_rect ¬°³Ì¤p¯x§Î¡A±N¨ä left¡Btop Äæ¦ì³]¬°¹s¨Ã¥H min_rect ªº¦ì§}¤Î DT_CALCRECT ¬°°Ñ¼Æ¡C©I¥s DrawText¡A¦¨¥\©I¥s«á¡Amin_rect ¤¤ªº right¡Bbottom ´N¬O³Ì¤p¯x§Îªº¼e«×¤Î°ª«×¡A·N§Y min_rect.right ¤Î min_rect.bottom ´N¬O³Ì¤p¯x§Îªº¼e«×¤Î°ª«×¡C¦]¨ä¦WºÙ¤Óªø¤F¡A¦b¤U¹Ï¤¤¤À§O¥H £s¡Bh ªí¥Ü¡C
DrawTextCentered ªº³Ì«á¤@ӰѼƬO¥~³¡¯x§Î¦ì§}¡A¦Ó³o¥~³¡¯x§Îªº¥|ÓÄæ¦ì left¡Btop¡Bright¡Bbottom ¤À§O¬O¤W¹Ï¤¤ªº x1¡By1¡Bx2¡By2¡C¥~³¡¯x§Îªº¼e«×»P°ª«×¡A¤À§O¬O x2¡Ðx1¡By2¡Ðy1¡A¦U¥H W¡BH ªí¥Ü¡A¦p¤W¹Ï¡C¬JµMn§â¦h¦æ¦r¦êÅã¥Ü©ó¿Ã¹õ¥¿¤¤¥¡¡A©Ò¥Hn½Õ¾ã³Ì¤p¯x§Îªº¦ì¸m¡A¨Ï³Ì¤p¯x§Î¥ªÃä¨ì¥~³¡¯x§Î¥ªÃ䪺¶ZÂ÷¡A»P³Ì¤p¯x§Î¥kÃä¨ì¥~³¡¯x§Î¥kÃ䪺¶ZÂ÷¬Ûµ¥¡A³£¬O
¡F¤W¤U¨âÃä¤]¬O¦p¦¹¡A¨äȬ°
¡A¨£¤W¹Ï¡C
¦¹³B¦³¥ó¨Æȱo¤@´£¡C¦pªG¥~³¡¯x§Î¤ñ³Ì¤p¯x§ÎÁÙ¤p¡Aªí¥ÜµLªk±N§¹¾ãªº¦r¦êÅã¥Ü¥X¨Ó¡A³o®ÉÔ DrawTextCentered ¦³¨âºØ¿ï¾Ü¡A¤@¬O°±¤îø»s¦r¦ê¶Ç¦^¿ù»~ªº¦^¶ÇÈ¡A¤G¬OºÉ¶qø»s§Y¨Ï¦³³¡¤À¦r¦êµLªkÅã¥Ü¡C¤p¤ì°¸§â DrawTextCentered ³]p¦¨²Ä¤@ºØ¡A©Ò¥H¥²¶·n§PÂ_ W ¬O§_¤j©ó©Îµ¥©ó£s¡AH ¬O§_¤j©ó©Îµ¥©ó h¡A¥un«e¨â¶µ¤ñ¸ûªºµ²ªG¦³¤@¶µ¬O§_©wªº¡A´N±o±N¹s¶Ç¦^µ¹¥Dµ{¦¡µM«á°h¥X¡C
¦pªGª½±µ¥H¨âÓ CMP «ü¥O¤ñ¸û¡A·|¼W¥[µ{¦¡½X¤]°§C®Ä²v¡Cè¤~´£¹L¡ADrawTextCentered ·|pºâ³Ì¤p¯x§Î¥ª¥k¨âÃä¤Î¤W¤U¨âÃäªÅ¥Õªº¤j¤p¡A·|¦³¨âÓ¨BÆJnpºâ W¡Ð£s¡BH¡Ðh¡Cª`·N¤F¡IÁÙ°O±o²Ä¤@³¹¤¶²Ð SUB «ü¥O®É¡A´£¨ì¦pªG¥Øªº¹Bºâ¤¸¸û¨Ó·½¹Bºâ¤¸¤p¡A¬Û´î·|µo¥Íɦì¦Ó³]©w¶i¦ìºX¼Ð¡]CF¡×1¡^¡F¦pªG¥Øªº¹Bºâ¤¸¸û¤j¡A´N¤£µo¥Íɦì¡A¨º»ò´N·|²M°£¶i¦ìºX¼Ð¡]CF¡×0¡^¡CÁÙ¦³¦b²Ä¤T³¹¤]´£¤Î¹L¡AJB «ü¥O¬O«ü·í CF¡×1 ®Éµo¥Í¸õÅD¡C¥Ñ¥H¤W¨âÂI¡A³o¬qµ{¦¡¥i¥H¼g¦¨¤U±ªº¼Ë¤l¡G¡]¤U±µ{¦¡¥¼°õ¦æ«e¡AR10D ¬° W¡AR11D ¬° H¡^
sub r10d,min_rect.right ;R10D¡×¦©°£¥]§t¦r¦ê¼e«×¤§«áªº¼e«× jb error ;¦pªGR10D¤p©ó¯à®e¯Ç¦r¦ê³Ì¤p¯x§Îªº¼e«×¡A¸õÅD¦Üerror³B sub r11d,min_rect.bottom ;R11D¡×¦©°£¥]§t¦r¦ê°ª«×¤§«áªº°ª«× jb error ;¦pªGR11D¤p©ó¯à®e¯Ç¦r¦ê³Ì¤p¯x§Îªº°ª«×¡A¸õÅD¦Üerror³B shr r10d,1 ;R10D¡×¦b¦r¦ê¥ª©Î¥k¨âÃ䪺ªÅ¥Õ¼e«× shr r11d,1 ;R11D¡×¦b¦r¦ê¤W©Î¤U¨âÃ䪺ªÅ¥Õ°ª«×
¤W±²Ä¤@¦æ SUB «ü¥O°õ¦æ®É¡A¦pªG R10D ¤p©ó min_rect.right¡]¦¹È¬°³Ì¤p¯x§Îªº¼e«×¡^¡A¨º»ò·|³]©w CF¡A¨Ï CF¡×1¡A±µµÛ¬O JB «ü¥O¡A´N·|µo¥Í¸õÅD¦Ü error: ³B¡F¤Ï¤§«h¤£¸õÅD¡C¶È»Ý¤@Ó JB «ü¥O´N¯àÀˬd¥~³¡¯x§Î¬O§_¤ñ³Ì¤p¯x§ÎÁÙ¼e¡C²Ä¤T¡B¥|¦æ¤]¬O¦p¦¹¡C¸g¹L¨âÓ SHR «ü¥O«á¡AR10D ¤§È¬°¡AR11D ¤§È¬°
¡C
±µ¤U¨Ó´N¥i¥H³]©w³Ì¤p¯x§Îªº¥ª¤W¨¤»P¥k¤U¨¤®y¼Ð¡C³oùØn¸ÑÄÀ¥k¤U¨¤®y¼Ð¡A¥»¨Ó¥k¤U¨¤ªº X ®y¼ÐÀ³¸Ó¬O x1¡Ï¡Ï£s¡A¥i¥H¸g¹L¤U±pºâ¡G
¡@¡@¦]¬° W¡×x2¡Ðx1¡A©Ò¥H x1¡×x2¡ÐW
¡@¡@x1¡Ï¡Ï£s¡×x2¡ÐW¡Ï
¡Ï£s¡×x2¡Ï
( ¡Ð2W¡ÏW¡Ð£s¡Ï2£s)¡×x2¡Ð
¥i¥H±o¨ì x1¡Ï¡Ï£s¡×x2¡Ð
¡A¦P²z y1¡Ï
¡Ïh¡×y2¡Ð
¡C¤W±¬O¥Î¼Æ¾Çªº¤èªkÃÒ©ú³Ì¤p¯x§Î¥k¤U¨¤ªº®y¼Ð¡A¥i¥HÂà´«¦¨¥t¤@ºØ¼gªk¡A¨äȤ£ÅÜ¡C¨Æ¹ê¤W¡A¤]¥i¥H³o¼Ë·Q¡A¦b³Ì¤p¯x§Î¥ª¥k¨â°¼¥~±ªºªÅ¶¡¬O¤@¼Ë¤jªº¡A³£¬O
¡F©Ò¥H³Ì¤p¯x§Î¥k¤U¨¤ªº X ®y¼Ð¬O¥~³¡¯x§Î¥k¤U¨¤ X ®y¼Ð´î¥h
¡A¦P²z³Ì¤p¯x§Î¥k¤U¨¤ªº Y ®y¼Ð¬O¥~³¡¯x§Î¥k¤U¨¤ Y ®y¼Ð´î¥h
¡C
¦]¬°¦¹¨è R10D ¤§È¬°¡AR11D ¤§È¬°
¡C°²³]´«¦¨·sªº¼gªk¡A´N·|µo²{ì¥ý¿é¤Jªº¥~³¡¯x§Î®y¼Ð¸g¹L¥[´î R10D¡BR11D ´N¬O³Ì¤p¯x§Îªº®y¼Ð¡A³o¼Ë´N´î¤Ö«Ü¦hµ{¦¡½X¡G
add [rax].left,r10d ;[rax].leftì¥ý¬O¥~³¡¯x§Î¥ª¤W¨¤ªºX®y¼Ð add [rax].top,r11d ;[rax].topì¥ý¬O¥~³¡¯x§Î¥ª¤W¨¤ªºY®y¼Ð sub [rax].right,r10d sub [rax].bottom,r11d
¥Î³o¼Ëªº¤èªk¡AÁöµM DrawTextCentered ¤@¶}©l©w¸q¤F min_rect ¬°³Ì¤p¯x§Î¡A¦ý¦¹®Én¦L¥X¦h¦æ¦r¦ê®É«o¥Îì¥ý¿é¤Jªº¥~³¡¯x§Î¡G
mov rax,pRect ;EAX¡×¥~³¡¯x§Î¦ì§}
⁝
invoke DrawText,hdc,pText,-1,rax,DT_LEFT or DT_TOP
DrawTextCnetered ªº§¹¾ãµ{¦¡¦b²Ä 50¡ã85 ¦æ¡A¤p¤ì°¸¼¶¼g³o¬qµ{¦¡¡A¥H³Ì¤Öªºµ{¦¡½X§@¬°Àu¥ý¦Ò¶q¡A³o¤]¬O¥Î²Õ¦X»y¨¥³Ì¤jªº¦n³B¤§¤@¡A¤£¹L³o¼Ëªº±¡§Î¤w¶V¨Ó¶V¤Ö¤F¡C¤£ºÞ«ç¼Ë¡A³o¤@³¹´N¨ì³o¨àµ²§ô¡C
¨Ï¥ÎªÌ«ö¤UÁä½L¤Wªº«öÁä®É¡AWindows ·|§â WM_KEYDOWN °T®§µo°eµ¹µøµ¡¨ç¦¡¡C¨ä¤¤ªº wParam ¬O¸Ó«öÁ䪺µêÀÀÁä½X¡A¦³ÃöµêÀÀÁä½X»P©³¤Uªº WM_KEYUP ¤@°_»¡©ú¡CWM_KEYDOWN °T®§ªº lParam ¬O¨ä¥L¦³Ãö¸Ó«öÁ䪺¸ê®Æ¡A»¡©ú¦p¤U¡G
¥Á°ê¤C¤Q¦~µoªíªº IBM PC ©Ò°t³ÆªºÁä½L¬O 83¡þ84 Áä¡A«á¨Óµo°âªº¹q¸£©Ò°t³ÆªºÁä½L¡A³q±`·|¦b¥kÃ䪺¼Æ¦rÁä»P^¤å¦r¥ÀÁ䤧¶¡¡A¥[¤J¤è¦VÁä¤Î¡uInsert¡v¡B¡uDelete¡vµ¥¤QÓÁä¡A³o¨Ç¦h¥X¨Óªº´N¬O©µ¦ùÁä¡]extended key¡^¡C°£¦¹¤§¥~¡AÁÙ¦³¤@¨Ç«öÁä¤]¬O©µ¦ùÁä¡C
³Ì«á¾ã²z¤@¤U¡A©µ¦ùÁ䦳¤U±´XºØ¡G
¨Ï¥ÎªÌÃP¶}Áä½L¤Wªº«öÁä®É¡AWindows ·|§â WM_KEYUP °T®§µo°eµ¹µøµ¡¨ç¦¡¡C¨ä¤¤ªº wParam ¬O¸Ó«öÁ䪺µêÀÀÁä½X¡Aµy«á»¡©ú¡CWM_KEYUP °T®§ªº lParam ¬O¨ä¥L¦³Ãö¸Ó«öÁ䪺¸ê®Æ¡A»¡©ú¦p¤U¡G
Windows §@·~¨t²Î¬°¤F¤À¿ë¨Ï¥ÎªÌ¨ì©³¦bÁä½L¤W«ö¤F¤°»òÁä¡A¦Ó§â¨CÓ«öÁä³]©w¤FµêÀÀÁä½X¡C¨CÓµêÀÀÁä½X³£¬O¤@Ó±`¼Æ¡A¥Î³o¨Ç±`¼Æ¥Î¨Ó¼ÐÃÑÁä½L¤Wªº«öÁä¡C·í¨Ï¥ÎªÌ«ö¤UÁä½L¤Wªº«öÁä®É¡AWindows ·|§â WM_KEYDOWN °T®§µo°eµ¹µøµ¡¨ç¦¡¡FÃP¶}«öÁä®É¡A«hµo°e WM_KEYUP¡C³o¨â«h°T®§¤¤ªº wParam °Ñ¼Æ´N¬O¸Ó«öÁ䪺µêÀÀÁä½X¡C¤U¹Ï¦bÁä½L¤W¦U«öÁ䪺µêÀÀÁä½X¡C¦U«öÁ䪺µêÀÀÁä½X¦b«öÁä°¼±¡A¥H¤Q¤»¶i¦ì¬õ¦â¼ÆȪí¥Ü¡C
¤ñ¸û¯S§Oªº¬OÁä½L¥kÃ䪺¼Æ¦rÁä¡A¦³¨ÇÁ䦳¨âºØµêÀÀÁä½X¡C·í NumLock ¶}±Ò®É¡]NumLock ªº LED ¿O«GµÛ¡^¡A¥kÃ䪺¼Æ¦rÁäÅܦ¨¤è¦VÁä¡A¨äµêÀÀÁä½X¦p¤W¹Ï¡F·í NumLock «öÁäÃö³¬®É¡]NumLock ªº LED ¿Oº¶·À¡^¡A¥kÃ䪺¼Æ¦rÁäÅܦ¨¤è¦VÁä¡A¨äµêÀÀÁä½X¤]´NÅܦ¨©M¥¦¥ªÃ䪺¤è¦VÁä¤@¼Ë¤F¡C¾ã²z¦p¤Uªí¡]ªí¤¤¼Æȧ¡¬°¤Q¤»¶i¦ì¡^¡G
NumLock | . | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
¶}±Ò | 6E | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 |
Ãö³¬ | 2E | 2D | 23 | 28 | 22 | 25 | 0C | 27 | 24 | 26 | 21 |
Alt Á䦳¨âÓ¡A¤À¥¬¦bªÅ¥ÕÁ䪺¥ª¥k¨â°¼¡A¨äµêÀÀÁä½X¬Û¦P¡A¶È±q WM_KEYDOWN¡BWM_KEYUP ªº wParam µLªk¤À¿ë¨Ï¥ÎªÌ¬O«ö¤U¥ªÃ䪺ÁÙ¬O¥kÃ䪺¡A¦ý¥i¥H°t¦X lParam ²Ä 24 ¦ì¤¸¬O§_©µ¦ùÁä§PÂ_¡CCtrl Áä¤]¬O¦P¼Ëªºª¬ªp¡A¦ý¬O Shift Áä´NµLªk³o¼Ë§PÂ_¤F¡A¥i¥H©I¥s GetAsyncKeyState API §PÂ_¥ªÃ䪺 Shift Áä«ö¤UÁÙ¬O¥kÃ䪺¡C