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


¥\¯àªí²¤¶

«e¤@³¹½Í¨ì¤F¸ê·½´y­zÀÉ¡A¤¶²Ð¤F¨âºØ¸ê·½¡G¹Ï¥Ü»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

  1. ¥D¥\¯àªí¡]main menu¡^¡G¤]½Ķ¦¨¥D¿ï³æ¡B¥Dµæ³æ©Î³»¼h¥\¯àªí¡]top-level menu¡^¡A¦ì©ó¼ÐÃDÄæ¤U¤è¡A¦p¤U­±¥k¹Ïµµ®Ø½u®Ø¦íªº³¡¤À¡C
  2. ¨t²Î¥\¯àªí¡]system menu¡^¡G¤]ºÙ¬°¨t²Î¿ï³æ¡B¨t²Îµæ³æ©Î¬Oµøµ¡¥\¯àªí¡]window menu¡^©Î±±¨î¥\¯àªí¡]control menu¡^¡C·í¨Ï¥ÎªÌ§â·Æ¹«´å¼Ð²¾¨ìµøµ¡¼ÐÃDÄ楪Ã䪺¹Ï¥Ü¤W¡A¦A«ö¤U·Æ¹«¥ªÁä¥X²{ªº¥\¯àªí¡A¦p¤U­±¥ª¹Ïªº¬õ¦â®Ø½u®Ø¦íªº¥\¯àªí¡C
  3. §Ö±¶¥\¯àªí¡]shortcut menu¡^¡G¤]¥s§Ö±¶¿ï³æ©Î¬ð²{¦¡¥\¯àªí¡]popup menu¡A¤]½Ķ¦¨¬ð²{¦¡¿ï³æ¡^¡C·í¨Ï¥ÎªÌ§â·Æ¹«²¾¨ì¤u§@°Ï¥ô¤@³B¡A¦A«ö¤U·Æ¹«¥kÁä¥X²{ªº¥\¯àªí¡C

¤@¯ë¦Ó¨¥¡A·íµøµ¡«Ø¥ß¦¨¥\¨ÃÅã¥Ü©ó¿Ã¹õ¤W¡A¥D¥\¯àªí´N·|¥X²{¡A¬O³Ì®e©ö¬°¨Ï¥ÎªÌµo²{¡A©Ò¥H¥»³¹ªº­«ÂI¦b©ó¥D¥\¯àªí¡A¤U¤@³¹¦A¤¶²Ð§Ö±¶¥\¯àªí»P¨t²Î¥\¯àªí¡C

¥D¥\¯àªí¡B¤l¥\¯àªí»P¿ï¶µ

¦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

  1. ¦WºÙ¡G¦WºÙ¬OÅã¥Ü¦b¥\¯àªí¤Wªº¦r¦ê¡C¦³®É¤]¥i¥H¥Î¦ì¤¸¹ÏÅã¥Ü¡C
  2. ¿ï¶µÃѧO½X¡]ID¡^©Î¥\¯àªí¥N½X¡]menu handle¡^¡G¤À¤T³¡¤À°Q½×¡G
    1. ¿ï¶µ¡G¨ã¦³¿ï¶µÃѧO½X¡A¦ý¨S¦³¿ï¶µ¥N½X¡C·í¨Ï¥ÎªÌ¿ï©w¬Y­Ó¿ï¶µ«á¡A¨t²Î·|µo¥X§t¦³¸Ó¿ï¶µÃѧO½Xªº WM_COMMAND °T®§µ¹µøµ¡¨ç¦¡¡C
    2. ¼u¥X¿ï¶µ¡G¨S¦³¿ï¶µÃѧO½X¡A¦ý¥X²{ªº¤l¥\¯àªí¨ã¦³¥\¯àªí¥N½X¡A¥D¥\¯àªí¤]¦³¥\¯àªí¥N½X¡C
    3. ¤À¹j½u¶È¥Î©óªí¥Üµøı¤W¤ÀÃþ®ÄªG¤§¥Î¡A¬J¨S¦³ÃѧO½X¤]¨S¦³¥N½X¡A§ó¤£·|µo¥X WM_COMMAND °T®§¡C¦ý¤À¹j½u¥e¥Î¤@­Ó¦ì¸m¡C
  3. ª¬ºA¡G¿ï¶µ¥i¥H¦³¤U­±¤T²Õª¬ºA¡G
    1. ±Ò¥Î¡B¸T¥Î¡BµL®Äªº¡G¸T¥Î¡]inactive¡^»PµL®Ä¡]grayed¡^ªº¿ï¶µ³£¥H¦Ç¦â¦r¦êªí¥Ü¡A·í¨Ï¥ÎªÌ§â·Æ¹«´å¼ÐÂI¿ï®É³£¤£·|µo¥X WM_COMMAND °T®§¡A®t§O¦b©ó¸T¥Îªº¿ï¶µ¤£¯à³Q¿ï¾Ü¡C±Ò¥Î¡]active¡^ªº¿ï¶µ¦r¦ê¥H¥¿±`Åã¥Ü¡A¥i¥H³Q¿ï¾Ü¡A¨Ã¥Bµo¥X WM_COMMAND¡C
    2. ¤Ä¿ïªº¡B¥¼¤Ä¿ïªº¡G¤Ä¿ï¡]checked¡^ªº¿ï¶µ«e·|¦³¤@­Ó¡u✔¡v©Î¡u●¡vªº°O¸¹¡A¥Nªí¨Ï¥ÎªÌ¤w¿ï¾Ü¤F³o­Ó¿ï¶µ¡C¹³¤W¹ÏÀ˵ø¼u¥X¿ï¶µ¤Þ¥Xªº¤l¥\¯àªí¡A¤u¨ã½c¡B¦â¶ôµ¥¿ï¶µ§¡¬°¤Ä¿ïªº¡Aªí¥Ü¤pµe®a·|Åã¥Ü¤u¨ã½c¡B¦â¶ô¡C¡u✔¡v©Î¡u●¡vªº®t§O¦b©ó«eªÌ¬O¤£¤¬¥¸ªº¡A¥i¤Ä¿ï¦h­Ó¡F«áªÌ¬O¤¬¥¸ªº¡A¥u¯à¤Ä¿ï¤@­Ó¡C
    3. ³Q¿ï¾Üªº¡B¤£³Q¿ï¾Üªº¡G·í·Æ¹«´å¼Ð²¾¨ì¬Y­Ó¿ï¶µ¤W®É¡A¸Ó¿ï¶µ­I´º·|¥H°ª«G«×¥ú´ÎÅã¥Ü¡A¤å¦r«h¥H¤Ï¥ÕÅã¥Ü¡A«h¦¹¿ï¶µºÙ¬°³Q¿ï¾Ü¡]selected¡^ªº¿ï¶µ¡F¤Ï¤§«h¬O¤£³Q¿ï¾Üªº¿ï¶µ¡C¦p¥k¹ÏªºÁY©ñ¤ÎÅã¥ÜÁY¹Ï¡C
  4. ¦ì¸m¡G¨C¤@­Ó¿ï¶µ¡B¼u¥X¿ï¶µ¡B¤À¹j½u³£¦û¦³¤@­Ó¦ì¸m¡A³o¨Ç¦ì¸m¬Ò¥Ñ¹s¶}©l¡C¹ï¥D¥\¯àªí¦Ó¨¥¡A³Ì¥ªÃ䪺¦ì¸m¬°¹s¡A¨C¦V¥k¤@¶µ´N¼W¥[¤@¡F¹ï¤l¥\¯àªí¦Ó¨¥¡A³Ì¤WÃ䪺¦ì¸m¬°¹s¡A¨C¦V¤U¤@¶µ´N¼W¥[¤@¡C¦p¥k¹Ï¡A¬õ¦â¦r¬O¥D¥\¯àªí¦U¼u¥X¿ï¶µªº¦ì¸m¡AÂŦâ¦r¬OÀ˵ø¤l¥\¯àªí¤¤¦U¿ï¶µªº¦ì¸m¡C

¥\¯àªí°T®§

WM_COMMAND °T®§

¦³Ãö¥\¯àªíªº°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

 wParamlParam
wParam °ª¦r²ÕwParam §C¦r²Õ
¨Ï¥ÎªÌ«ö¤U¥\¯àªí0¿ï¶µÃѧO½X0
¨Ï¥ÎªÌ«ö¤U¥[³tÁä1¥[³tÁäÃѧO½X0
¨Ï¥ÎªÌ«ö¤U±±¨î¶µ³qª¾½X±±¨î¶µÃѧO½X±±¨î¶µ¥N½X

°²¦p¦³¤@­Óµ{¦¡¡A¦³¥\¯àªí¡B¤l±±¨î¶µ¡B¥[³tÁä¡A­n°Ï¤À¨Ï¥ÎªÌ¨ì©³¬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

WM_INITMENUPOPUP °T®§

·í Windows §Y±NÅã¥Ü¤l¥\¯àªí®É¡A·|²£¥Í WM_INITMENUPOPUP °T®§¡A¦¹°T®§¤@¯ë±¡§Î·|¥æµ¹ DefWindowProc ³B²z¡C¦ý¬O¦pªG­n¦b¤l¥\¯àªí¤¤±Ò¥Î©Î¸T¥Î¬Y¨Ç¿ï¶µ¡A¨º´N­n³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


MENU °Ï¶ô

«Ø¥ß¥\¯àªíªº¤èªk¡A³Ì±`¥Îªº¬O¦b¸ê·½´y­zÀɤ¤«Ø¥ß MENU °Ï¶ô¡AMENU ¤£¹³ ICON ©Î CURSOR »Ý­n¥Î¨ìÃB¥~ªºÀɮסA¥¦¥i¥Hª½±µ¦b¸ê·½´y­zÀɤ¤ª½±µ¥H¤å¦r´y­z¡CMENU °Ï¶ôªº®æ¦¡¦p¤U¡J

MenuID  MENU
{
    ⁝
}

MenuID ¬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¸ê·½´y­zÀɤ¤ªº MenuID ¬O¥¿¾ã¼Æ¡A¨º»ò­ì©lµ{¦¡¤¤¸ü¤J¥\¯àªí®É¤]­n¥H¬Û¦Pªº¥¿¾ã¼Æ¬°°Ñ¼Æ©I¥s LoadMenu¡F¤Ï¤§¥çµM¡C

¤@¹ï¤j¬A¸¹¡A{ »P } ¤§¶¡¬O¥\¯àªíªº¤º®e¡A{ »P } ¤]¥i¥H¥Î¡uBEGIN¡v©M¡uEND¡v¥N´À¡C¦b³o¤@¹ï¤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Áä¡CID ¬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ºØ¡A­Y¶W¹L¤@ºØ®É¥H¡u,¡v¹j¶}¡C

  1. CHECKED¡G·|¦b¿ï¶µ¦r¦ê¤§«e¦³­Ó¡u✔¡v°O¸¹¡A¥Nªí¦¹¿ï¶µ¨ã¦³¡u¤Ä¿ïªº¡vÄÝ©Ê¡C
  2. GRAYED¡G¦¹¿ï¶µ¨ã¦³¡uµL®Äªº¡vÄÝ©Ê¡C
  3. HELP¡G¥u¯à¥Î©ó¥D¥\¯àªíªº¼u¥X¿ï¶µ©Î¿ï¶µ¤W¡A¨ã¦¹Äݩʪ̥H¤Î¨ä«áªÌ¡A³£·|Åã¥Ü¦b¥D¥\¯àªíªº¥k°¼¡C
  4. INACTIVE¡G¦¹¿ï¶µ¨ã¦³¡u¸T¥Îªº¡vÄÝ©Ê¡C
  5. MENUBARBREAK¡G¦b¤l¥\¯àªí¤¤ªº¿ï¶µ¨ã¦³ MENUBARBREAK ®É¡A·|¨Ï¤l¥\¯àªí¦h¤@¦æ¡A¥B¥Ñ¦¹¿ï¶µ¶}©lÅã¥Ü©ó¦hªº¤@¦æ¡A¥B¦³¤@¹]Áè½u¤À¹j©ó¨â¦æ¤§¶¡¡C¦pªG¬O¦b¥D¥\¯àªíªº¿ï¶µ¨ã¦³ MENUBARBREAK¡A¨º»ò·|¨Ï¥D¥\¯àªí¦h¤@¦C¡A±q³o­Ó¿ï¶µ¶}©l³£Åã¥Ü©ó¤U¤@¦C¡A¥BµL¤ô¥­½u¤À¹j¦¹¤G¦C¡C
  6. MENUBREAK¡G»P MENUBARBREAK ´X¥G¤@¼Ë¡A¦ý¦æ»P¦æ¤§¶¡¨S¦³¤À¹j½u¡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

·í¨Ï¥ÎªÌÂ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¦b POP ¤§«áªº text »P option »P«e­z MENUITEM ¤§«áªº¬Û¦P¡C

¨Ò¤l

©³¤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µ{¦¡¤¤¸ü¤J¥\¯àªí

¸ü¤J¥\¯àªíªº¤TºØ¤èªk

¦b¸ê·½´y­zÀɤ¤©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¸ê·½´y­zÀɤ¤¥\¯àªí¦WºÙ©Î¥\¯àªíÃѧO½X§Y¥i¡C¨Ò¦p©³¤Uªº¨Ò¤l¡A¸ê·½´y­zÀɤ¤©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¸ê·½´y­zÀÉ©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¸ê·½´y­zÀɤ¤ªº¥\¯àªí¥N½X¡AµM«á±N¦¹¥\¯àªí¥N½X°µ¬° CreateWindowEx ªº²Ä¤Q­Ó°Ñ¼Æ¡C¨Ò¦p©³¤Uªº¨Ò¤l¡A°²³]¸ê·½´y­zÀɤ¤©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

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¸ê·½´y­zÀɤ¤ªº¿ï¶µ¦WºÙ©Î¥\¯àªíÃѧO½X¤@¼Ë¡C¦pªG©I¥s¦¨¥\¡A¨º»ò LoadMenu ªº¦^¶Ç­È¬O¥\¯àªí¥N½X¡F¦pªG¥¢±Ñ¡A¶Ç¦^ 0¡C

SetMenu API

SetMenu API ¬°µøµ¡«ü©w¬Y­Ó¥\¯àªí¡A¨ä»yªk¦p¤U¡G

invoke  SetMenu,\
        hWnd,\          ; handle of window
        hMenu           ; handle of menu

hWnd ¬Oµøµ¡¥N½X¡A­Y¦¨¥\°õ¦æ SetMenu «á¦¹µøµ¡·|Åã¥Ü¥\¯àªí¡A¦Ó hMenu §Y¬°Åã¥Üªº¥\¯àªí¤§¥N½X¡CSetMenu ªº¦^¶Ç­È¬°¹s¡Aªí¥Ü©I¥s¥¢±Ñ¡F­Y¬°«D¹s¡Aªí¥Ü©I¥s¦¨¥\¡C

¦pªG¸Óµøµ¡¥»¨­¤w¦³¥\¯àªí¡A¨º»ò°Ñ¼Æ hMenu ©Ò«ü©w¥\¯àªí·|¨ú¥N­ì¦³ªº¥\¯àªí¡A¦ý­ì¦³ªº¥\¯àªí¨Ã¨S¦³¾P·´¡C¥²¶·©I¥s DestroyMenu ¤~¯à¨Ï¥\¯àªí¾P·´¡C

GetSubMenu API

©I¥s LoadMenu ®É¡A¥Ñ¸ê·½¸ü¤Jªº¥\¯àªí¥]§t¤F¥D¥\¯àªí»P¤l¥\¯àªí¡A¦ý LoadMenu ¥u¯à¶Ç¦^¥D¥\¯àªí¥N½X¡C¦pªG­nÀò±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ªG­nÀò±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 API

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 ¬O­n§ïÅܤĿ窱ºA¿ï¶µ©Ò¦bªº¥\¯àªí¥N½X¡CuIDCheckItem ¬O­n§ïÅܤĿ窱ºA¿ï¶µ¤§¿ï¶µÃѧO½X©Î¬O¿ï¶µ¦ì¸m¡A¨ì©³¬O¿ï¶µÃѧO½X¡AÁÙ¬O¿ï¶µ¦ì¸m¡A¥Ñ²Ä¤T­Ó°Ñ¼Æ¨M©w¡C

²Ä¤T­Ó°Ñ¼Æ¡AuCheck ¥i¥H¬O MF_BYCOMMAND ©Î MF_BYPOSITION ¨ä¤¤¤§¤@¡A»P MF_CHECKED ©Î MF_UNCHECKED ¨ä¤¤¤§¤@·f°tªº²Õ¦X¡C»¡©ú¦p¤U¡G

CheckMenuRadioItem API

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 ¬O­n§ïÅܤĿ窱º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 API

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¨Ó¡A­nµe¥X¨Óªº¾ò¶ê´N¬O¸Ó¯x§Îªº¤º¤Á¾ò¶ê¡A©Ò¥Hø»s¥X¨Óªº¾ò¶êªø¶b¡Bµu¶b¤]·|»P¤ô¥­½u©M¹]Áè½u¥­¦æ¡C¥Ñ¤W­±´N¯àª¾¹D¡A­n¸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


½d¨Ò¡GDRAW2

³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

¸ê·½´y­zÀɦ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Ķ¸ê·½´y­zÀÉ
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

©w¸q´å¼Ð¥N½X°}¦C»P¨ä«ü¼Ð

°õ¦æ 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

³B²z WM_COMMAND °T®§

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¥¿§ïÅÜ©Ò¿ï¦âµ§§Îª¬ªº´å¼Ð¡A­n¹F¦¹¥Øªº­n³B²z WM_SETCURSOR °T®§¡C

³B²z WM_SETCURSOR

«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¤¶²Ð¨âºØ¡C

¶¡±µ©w§}¡G¼È¦s¾¹­¼¥H¤Gªº¾­¤è»P¼È¦s¾¹­¼¥H¤Gªº¾­¤è¥[°¾²¾¦ì§}

⑶¡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¯à²ÕĶ¦¨¥\¡C¾¨ºÞ¤£ª¾¹D­ì¦]¡A¦ý¬O¥i¥H§Q¥Î¤W­z¨±°j³Â·Ðªº¤è¦¡¡AÅܳq³B²z¦Ó«á¹F¨ì¥Øªº¡C¡]¦pªG­n¥Î 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¦Ó¨Ï¥Î¤W­z⑷§Î¦¡ªº¶¡±µ©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

¿ï¾Üµeµ§

¦b«e­±¡u³B²z WM_COMMAND °T®§¡v´£¨ì¡A§ïÅÜÃC¦â®É¡A¦P®É·|§ïÅܷƹ«´å¼ÐÅܬ°¸ÓÃC¦â§Îª¬ªºµeµ§¡C¨Æ¹ê¤W¡A§ó­«­nªº¬O­n§ïÅܵ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

µe¾ò¶ê

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

Åã¥Ü®y¼Ð

DRAW2 ¥i¥HÅý¨Ï¥ÎªÌ¦Û¦æ¨M©w¬O§_©ó¤u§@°Ï¥ª¤W¨¤Åã¥Ü·Æ¹«´å¼Ð©Ò¦bªº®y¼Ð¡CDRAW2 ¥ÎÅÜ¼Æ fXy ¨Óªí¥ÜÅã¥Ü©Î¤£Åã¥Ü¡A­Y fXy ¬° 1¡A´NÅã¥Ü®y¼Ð¡F­Y¬° 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 ¤£Åã¥Ü¡F­Y¦AÂI¿ï®y¼Ð¤@¦¸¡A¤S¯àÅã¥Ü¡F­Y¦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ªG­nÅã¥Ü®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¡C­Y¬° 0¡A¦]¬°¦b°µ XOR ¹Bºâ«e¤w¥ý°²³]¦n¤F¡A©Ò¥Hª½±µ¸õ¦Ü¡u@@:¡v¼Ð°O³B§Y¥i¡F­Y¬°«D¹s¡A¨º´N­n§ïÅÜ 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


«á°O

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¦ü¥G­n©î¦¨³\¦h³¡¤À¡A¤À´²¦b¼Æ­Ó°T®§¤¤³B²z¡C¨Ò¦p­è­è´£¨ìªº¡A­n¦b¤u§@°ÏÅã¥Ü·Æ¹«´å¼Ð²¾°Êªº®y¼Ð¡A­n¦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¼Ð¡A­Y¬° 0 ¥Nªí¤£Åã¥Ü®y¼Ð¡C¦Ò¼{©³¤U¨âºØ±¡§Î¡G

  1. ­Y²{¦b fXy ¬° 1¡A­nÅã¥Ü®y¼Ð¡A¦Ó¦¹®É¨Ï¥ÎªÌ¥H·Æ¹«¥ªÁäÂI¿ï¥\¯àªí¤¤ªº®y¼Ð¿ï¶µ¡A´N¤£Åã¥Ü®y¼Ð¡AfXy À³³]¬° 0¡F¦¹µ²ªG©M fXy »P 1 ¶i¦æ¤¬¥¸©Î¹Bºâªºµ²ªG¤@¼Ë¡A³£¬° 0¡C
  2. ­Y²{¦b fXy ¬° 0¡A¤£Åã¥Ü®y¼Ð¡A¦Ó¦¹®É¨Ï¥ÎªÌ¥H·Æ¹«¥ªÁäÂI¿ï¥\¯àªí¤¤ªº®y¼Ð¿ï¶µ¡A´N­nÅã¥Ü®y¼Ð¡AfXy À³³]¬° 1¡F¦¹µ²ªG©M fXy »P 1 ¶i¦æ¤¬¥¸©Î¹Bºâªºµ²ªG¤@¼Ë¡A³£¬° 1¡C

±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