²Ä¤Q¤­³¹¡@¦ì¤¸¹Ï

¦b¹q¸£¤Wªº¹Ï¤ù¤j­P¤À¦¨¨âºØ¡A¦V¶q¹Ï»PÂI°}¹Ï¡C¦V¶q¹Ï¬O«ü¹³ AutoCAD ©Ò¦sªº *.DWG ÀÉ¡A©Î¬O¹³±q«eºô»Úºô¸ô¬y¦æªº Flash¡A¥¦­Ìªº¹Ï¤ù¥D­n¬O¥H½u¡B¶ê¡K¡Kµ¥°ò¥»´X¦ó¹Ï§Îºc¦¨¡A¨Ò¦pµe¤@±i¤HÁy¡A¥u»Ý¤@­Ó¾ò¶ê·í½ü¹ø¡B¨â­Ó¤p¶ê·í²´·ú¡B¤@­Ó¤T¨¤§Î·í»ó¤l¡B¤@­Ó¾ò¶ê·í¼L¡AµM«á¦U¶î¤W¾A·íÃC¦â¡A¦Ó´y­z¶ê©Î¾ò¶ê¥u»Ý­n¤Ö¼Æªº´X­ÓÂI©Î¥b®|§Y¥i¡A©Ò¥Hµe¥X¤@´T¦V¶q¹Ï¥²¶·¸g¹L¤@¨Ç­pºâ¡AµÛ¦â¡A·í¹Ï§Î½ÆÂø®É´N·|¤ñ¸ûºC¡C¦V¶q¹ÏªºÀuÂI¬OÀɮ׸û¤p¡A¦]¬°¥u­n¦s¤U¤Ö¶qªºÃöÁä¸ê®Æ´N¥i¥H¤F¡F¦¹¥~´N¬O¡A©ñ¤jÁY¤p³£¤£·|¥¢¯u¡C

¦ý¬O­n¦s¤@±i¤Hª«·Ó©Î­·´ºµ¥·Ó¤ù¡A´N¨S¦³¿ìªk¥Î²³æªº´X¦ó¹Ï§Îªí¥Ü¡A³o¨Ç´N¬OÂI°}¹Ï¡C¤@¯ë¥i¥H§âÂI°}¹Ï¬Ý¦¨¬O¥Ñ³\¦hÂI¥Ñ¥ª¦Ó¥k¡B¥Ñ¤W¦Ó¤U¤@­ÓÂI¤@­ÓÂI¡]¦¹³BªºÂI¡A¤@¯ëºÙ¬°¹³¯À¡A¨£²Ä¤C³¹¡^°ï¬ä¦Ó¦¨¡AÁöµM¦³¨ÇÂI°}¹Ï¤£¬O³o¼Ë±Æ¦C¡A¦ý¦¹³B¤p¤ì°¸¥u¬O´£¤@´£³o­ÓÆ[©À¦Ó¤w¡C¦Ó¨C¤@¹³¯À¥Ñ¤£¦PªºÃC¦âªí²{¥X¨Ó¡A©Ò¥H´N¥i¥HÅã¥X¤@´T¹Ï¤ù¡A¨Ò¦p°ÆÀɦW¬° BMP ªº¹Ï¤ù¡]Bitmap ªºÁY¼g¡A¤]ºÙ¬°¡u¦ì¤¸¹Ï¡v¡AÀÉ®×Åé¿n«Ü¤j¡^¡C¦ý¬O¦]¬°³o¼Ëªº¹Ï¤ùÀɮפӤj¤F¡A©Ò¥H²£¥Í¦U¦¡¦U¼ËªºÀ£ÁY¤è¦¡¡A¦Ó³y¦¨¦hºØ°ÆÀɦW¡A¦p GIF¡BJPG¡BPNG µ¥µ¥¡C

³o¤@³¹ªº¥D¨¤¬O¦ì¤¸¹Ï¡A¤]´N¬O°ÆÀɦW¬° BMP ªº¹Ï¤ùÀÉ¡A¥¦¬O¨S¦³¸g¹LÀ£ÁYªºÂI°}¹Ï¡A¤]¬O Windows ª½±µ¤ä´©ªº¡C¦b³o¤@³¹ùؤp¤ì°¸­n¤¶²Ð¤T­Ó¨Ò¤l¨Ó»¡©ú¦p¦ó±N BMP ¹Ï¤ùÀÉÅã¥Ü¦bµøµ¡ªº¤u§@°Ï¤º¡C­nÅã¥Üªº¬O stellar_blade.bmp ÀÉ¡A¤Ø¤o¬° 640¡Ñ360¡A¦û¾Ú 691254 ¦ì¤¸²Õ¡A¹Ï¤ùªº¼Ë¤l¦p¤U¡G­n»¡©úªº¬O¤W­±³o±i¹Ï¬O±N stellar_blade.bmp §ï¦s¦¨ JPG ÀÉ¥H¸`¬Ùºô­¶ªÅ¶¡¡AÀɮ׳ѤU 90692 ¦ì¤¸²Õ¡A´X¥GÅܦ¨­ì¨Óªº¤K¤À¤§¤@¡C

²Ä¤@­Ó¨Ò¤l¬O§â stellar_blade.bmp »s§@¦¨¸ê·½¡A²Ä¤G¡B²Ä¤T­Ó¨Ò¤l¦b©R¥O´£¥Ü¦r¤¸¤¤¿é¤J stellar_blade.bmp Åã¥Ü BMP ¹Ï¤ùÀÉ¡F¦pªG§ï¥Î¨ä¥L BMP ¹Ï¤ùÀÉ¡A¤]¥i¥HÅã¥Ü¸Ó BMP ¹Ï¤ùÀÉ¡C²Ä¤T­Ó¨Ò¤l«h§Q¥Î BitBlt ªº¯S©Ê¡A¦bÅã¥Ü¦ì¤¸¹Ï®É¹ïÃä®Øµy°µ­×¹¢¡C


Åã¥Ü BMP ªº­ì²z»P¨Ï¥Îªº Win64 API

¥ý¤¶²Ð²Ä¤@­Ó¨Ò¤l¡AVIEWBMP1 ¦bµøµ¡¤¤Åã¥Ü¦ì¤¸¹Ïªº­ì²z¤Î¨BÆJ¡A¦P®É¤]¤¶²Ð¸ê·½´y­zÀɤ¤ªº BITMAP °Ï¶ô»P³o­Ó¨Ò¤l·|¨Ï¥Î¨ìªº Win64 API¡C

©óµøµ¡¤¤Åã¥Ü¦ì¤¸¹Ïªº­ì²z¤Î¨BÆJ

§â BMP ÀÉ®×Åã¥Ü¦bµøµ¡¤º¡A¦³³\¦hºØ¤èªk¡AVIEWBMP1 ±Ä¥Î¤@ºØ²³æªº¤èªk¡C¦b²Ä¤K³¹´¿´£¹L¡A­Y­n¦b¤u§@°Ï¤ºÅã¥Ü¤å¦r¡B¹Ï¤ùµ¥¸ê®Æ¡A¥²¶·¹ï¸Óµøµ¡¤u§@°Ïªº¸Ë¸m¤º®e¶i¦æ¾Þ§@¡C±N¦ì¤¸¹ÏÅã¥Ü©ó¤u§@°Ï¤]¬O¦p¦¹¡A¦ýµy¦³¤@ÂI¤£¤@¼Ë¡A¨BÆJ¦p¤U¡G

  1. »s§@¸ê·½´y­zÀÉ¡A©ó BITMAP °Ï¶ô¤¤±N BMP ¹Ï¤ùÀÉ¥]§t©ó¨ä¤¤¡C
  2. ©ó­ì©lµ{¦¡¤¤¡A©I¥s LoadBitmap ±q¸ê·½¤¤¸ü¤J BMP ¹Ï®×¡C
  3. ©I¥s CreateWindowEx¡A¨t²Î·|¬°©Ò«Ø¥ßªºµøµ¡¤u§@°Ï²£¥Í¸Ë¸m¤º®e¡]device context¡A­^¤åÁY¼g¬° DC¡^¡C
  4. ©I¥s CreateCompatibleDC «Ø¥ß»Pµøµ¡¤u§@°Ï¸Ë¸m¤º®e¬Û®eªº°O¾ÐÅé¸Ë¸m¤º®e¡C
  5. ©I¥s SelectObject §â±q¸ê·½¤¤¸ü¤Jªº BMP ¹Ï®×¿ï¤J°O¾ÐÅé¸Ë¸m¤º®e¡C
  6. ©I¥s BitBlt §â°O¾ÐÅé¸Ë¸m¤º®e¤¤ªº BMP ¹Ï®×¶Ç¿é¨ì¤u§@°Ïªº¸Ë¸m¤º®e¡C¨ì¦¹µøµ¡¤¤´N·|Åã²{¥X BMP ¹Ï¤ù¤F¡C
  7. ©I¥s DeleteDC ¾P·´°O¾ÐÅé¸Ë¸m¤º®e¡C

¤W­±ªº¨BÆJ¡A¥i¥H¥Î¤U¹Ï»¡©ú¡G

¥i¯à§A·|¦³³o¼ËªººÃ°Ý¡Gª½±µ©I¥s SelectObject ±N¦ì¤¸¹Ï¿ï¤J¤u§@°Ï¸Ë¸m¤º®e¤£´N§¹¦¨¤F¶Ü¡H¬°¦ó­n³o¼Ë³Â·Ð©O¡H

¤j­P¤Wªº­ì¦]¦³¤T­Ó¡A²Ä¤@¬O¬°¤F®Ä²v¡B²Ä¤G¬OÁקKÅã¥Ü¹Lµ{¤¤ªº°{Ã{»P¤£Ã­©w¡B²Ä¤T¬O¬°¤FÆF¬¡©Ê¡C¨Ï¥Î°O¾ÐÅé¸Ë¸m¤º®e®É¡A¥i¥H¥ý¦b°O¾ÐÅé¸Ë¸m¤º®e¤¤·Ç³Æ¦n­nÅã¥Ü¦b¤u§@°Ïªº¸ê®Æ¡AµM«á¤@¦¸±N¾ã­Ó¸ê®Æ¶Ç¿é¨ìµøµ¡¤u§@°Ïªº¸Ë¸m¤º®e¡A³o¤ñª½±µ¦bµøµ¡¤u§@°Ïªº¸Ë¸m¤º®e¤¤¡A³v¤@¾Þ§@©Îø»s¹Ï¹³§ó¦³®Ä²v¡C¥t¥~¦b¤£¦P¾Þ§@©Îø»s®É¡A¥i¯à»Ýªá¶O¤@¨Ç®É¶¡³B²z¡A¦pªG CPU ¨Ó¤£¤Î³B²z«K·|³y¦¨°{Ã{¡B¤£Ã­©wªº²{¶H¡A³o¤]¬O¬°¦ó·|±Ä¥Î¦b°O¾ÐÅé¸Ë¸m¤º®e³B²z¦n¦A¶Ç¿é¦Üµøµ¡¤u§@°Ïªº¸Ë¸m¤º®e¡C

¸ê·½´y­zÀɤ¤ªº BITMAP

§Ú­Ì¥i¥H¦b¸ê·½´y­zÀɤ¤¡A¨Ï¥Î BITMAP ¨Ó©w¸q¦ì¤¸¹Ï¡A¨ä»yªk¦p¤U¡G

¦ì¤¸¹Ï¦WºÙ  BITMAP  ¦ì¤¸¹ÏÀɮצWºÙ

¦ì¤¸¹Ï¦WºÙ»P¦ì¤¸¹ÏÀɮצWºÙ³£»P«e¤@³¹ªº ICON ªº³W©w¤@¼Ë¡A½Ð°Ñ¦Ò«e¤@³¹¡C

CreateCompatibleDC API

CreateCompatibleDC ¯à¦b°O¾ÐÅ餤«Ø¥ß»P«ü©w¸Ë¸m¤º®e¬Û®eªº¸Ë¸m¤º®e¡A¨ä­ì«¬¦p¤U¡G

invoke  CreateCompatibleDC,\
        hdc             ; handle to DC

CreateCompatibleDC ¥u¦³¤@­Ó°Ñ¼Æ¡Ahdc¡A¥¦¬O²{¦³ªº¸Ë¸m¤º®e¡ACreateCompatibleDC ·|«Ø¥ß»P hdc ¬Û®eªº¸Ë¸m¤º®e¡C¦pªG hdc ¬°¹s¡A¨º»ò CreateCompatibleDC ·|«Ø¥ß»PÀ³¥Îµ{¦¡¿Ã¹õ¬Û®eªº¸Ë¸m¤º®e¡C³oºØ¸Ë¸m¤º®e¬OÀx¦s¦b°O¾ÐÅ餺¡A¬G¤]ºÙ¬°°O¾ÐÅé¸Ë¸m¤º®e¡]memory device context¡^¡A·í°O¾ÐÅé¸Ë¸m¤º®e«Ø¥ß«á¡AWindows §@·~¨t²Î·|¥H¹w³]­È³]©w°O¾ÐÅé¸Ë¸m¤º®e¡A¨Ò¦p«e´º©M­I´ºÃC¦â³]¬°¶Â¦â©M¥Õ¦â¡Bµeµ§¬°¶Â¦â¹ê½u¡Bµe¨ê¬°¥Õ¦â¡K¡Kµ¥µ¥¡C°O¾ÐÅé¸Ë¸m¤º®e¥i¥H¹³´¶³q¸Ë¸m¤º®e¤@¼Ë¨Ï¥Î¡A¨Ò¦p³]©wÄÝ©Ê¡BÀò¨ú·í«eÄÝ©Ê¡B¿ï¾Üµeµ§¡K¡Kµ¥µ¥¡A¬Æ¦Ü¤]¯à¦b¥¦¤W­±Ã¸»s¤å¦r©Î¹Ï§Î¡C

¦pªG CreateCompatibleDC °õ¦æ¦¨¥\¡A¦^¶Ç­È¬O°O¾ÐÅé¸Ë¸m¤º®eªº¥N½X¡F¦pªG°õ¦æ¥¢±Ñ¡A¦^¶Ç­È¬°¹s¡C¦pªG¤£¦A¨Ï¥Î°O¾ÐÅé¸Ë¸m¤º®e¡AÀ³©I¥s DeleteDC ±N¨ä¾P·´¡C

DeleteDC API

DeleteDC ¥Î©ó¾P·´¸Ë¸m¤º®e¡A¥¦¥u¦³¤@­Ó°Ñ¼Æ¡Ahdc¡A´N¬O­n¾P·´ªº¸Ë¸m¤º®e¥N½X¡CDeleteDC ­ì«¬¬°¡G

invoke  DeleteDC,\
        hdc             ; handle to DC

¦pªG DeleteDC °õ¦æ¦¨¥\¡A¦^¶Ç­È¬O¤@¡F¦pªG°õ¦æ¥¢±Ñ¡A¦^¶Ç­È¬°¹s¡C¦¹¥~­nª`·Nªº¬O¡A©I¥s GetDC ±o¨ìªº¸Ë¸m¤º®e¡A¤£¦A¨Ï¥Î®É¡A¥²¶·©I¥s ReleaseDC ±N¨äÄÀ©ñ¡A¤£¥i©I¥s DeleteDC ¾P·´¥¦¡C

AdjustWindowRect API

AdjustWindowRect ·|®Ú¾Ú©Ò»Ýªº¤u§@°Ïªº¯x§Î¤j¤p­pºâ©Ò»Ýªºµøµ¡¤j¤p¡AµM«á¥i¥H±N­pºâ«áªºµøµ¡¤j¤p¶Ç»¼µ¹ CreateWindowEx ¨Ó«Ø¥ßµøµ¡¡CAdjustWindowRect ªº­ì«¬¬O¡G

invoke  AdjustWindowRect,\
        lpRect,\        ; pointer to client-rectangle structure
        dwStyle,\       ; window styles
        bMenu           ; menu-present flag

³o¤T­Ó°Ñ¼Æªº·N¸q¦p¤U¡G

¦pªG AdjustWindowRect °õ¦æ¦¨¥\¡A¦^¶Ç­È¬°¤@¥B lpRect ©Ò«ü¦ì§}¤Wªº RECT µ²ºcÅé·|Åܦ¨µøµ¡¥ª¤W¨¤¤Î¥k¤U¨¤®y¼Ð¡F¦pªG AdjustWindowRect °õ¦æ¥¢±Ñ¡A¦^¶Ç­È¬°¹s¡C

LoadBitmap API

LoadBitmap ¯à±q°õ¦æÀɤ¤ªº¸ê·½¤º¸ü¤J«ü©wªº¦ì¤¸¹Ï¡A¨ä­ì«¬¦p¤U¡G

invoke  LoadBitmap,\
        hInstance,\     ; handle of application instance
        lpBitmapName    ; address of bitmap resource name

hInstance ¬O¼Ò²Õ¥N½X¡A¤@¯ë¬O©I¥s GetModuleHandle ±o¨ì¡ClpBitmapName ¬O¦ì¤¸¹Ï¸ê·½ªº¦WºÙ¡A³o­Ó¦WºÙ¬O¥H¹s¬°µ²§Àªº¦r¦ê¡A¦P®É¦¹¦WºÙ¶·»P¸ê·½´y­zÀɪº¦ì¤¸¹Ï¦WºÙ¬Û¦P¡C¥t¥~¡AlpBitmapName ¤]¥i¥H¬O¤p©ó 65535 ªº¥¿¾ã¼Æ¡A¥Nªí¦ì¤¸¹ÏªºÃѧO½X¡A¦pªG¬O³o¼Ëªº±¡ªp¡A¨º»ò¦b¸ê·½´y­zÀɤ¤¡ABITMAP «e­±ªº¦ì¤¸¹Ï¦WºÙ¤]­n¨Ï¥Î¬Û¦Pªº¼Æ­È¡A§@¬°ÃѧO½X¡C

¦pªG LoadBitmap °õ¦æ¦¨¥\¡A¦^¶Ç­È¬O¦ì¤¸¹Ï¥N½X¡F¦pªG°õ¦æ¥¢±Ñ¡A¦^¶Ç­È¬°¹s¡C¥Î LoadBitmap ¸ü¤Jªº¦ì¤¸¹Ï¡A¤£¦A¨Ï¥Î¤§«á­n©I¥s DeleteObject ¾P·´¡C

BitBlt API

BitBlt ¬O§â¬Y­Ó³]³Æ¤º®e¡]ºÙ¬°¨Ó·½¸Ë¸m¤º®e¡^¤¤ªº¤@¶ô¯x§Î°Ï°ìªº¼Æ¦ì¸ê®Æ¶Ç¿é¨ì¥t¤@­Ó³]³Æ¤º®e¡]ºÙ¬°¥Øªº¸Ë¸m¤º®e¡^¤§¤¤¡A³o¨Ç¼Æ¦ì¸ê®Æ³q±`¬O¹Ï®×¡B¤å¦rµ¥ÃC¦â²Õ¦¨ªº¸ê®Æ¡CBitBlt ªº­ì«¬¬O¡G

invoke  BitBlt,\
        hdcDest,\       ; handle to destination DC
        nXDest,\        ; x-coord of destination upper-left corner
        nYDest,\        ; y-coord of destination upper-left corner
        nWidth,\        ; width of destination rectangle
        nHeight,\       ; height of destination rectangle
        hdcSrc,\        ; handle to source DC
        nXSrc,\         ; x-coordinate of source upper-left corner
        nYSrc,\         ; y-coordinate of source upper-left corner
        dwRop           ; raster operation code

BitBlt ¨ä¹ê¬O¡ubit block transfer¡vªº·N«ä¡A¨ä°Ñ¼Æ»¡©ú¦p¤U¡G

BitBlt ·|¦b¨Ó·½¸Ë¸m¤º®e¡]¥ç§Y hdcSrc¡^¤¤¡A§â®y¼Ð¬°¡]nXSrc, nYSrc¡^·í°µ¯x§Îªº¥ª¤W¨¤®y¼Ð¡A¥B¸Ó¯x§Î¼e¬° nWidth¡B°ª¬° nHeight¡AµM«á±N¸Ó¯x§Î½d³ò¤ºªº¸ê®Æ¶Ç¿é¨ì¥Øªº¸Ë¸m¤º®e¡]¥ç§Y hdcDest¡^¤¤¡A¥ª¤W¨¤®y¼Ð¬°¡]nXDest, nYDest¡^¡B»P«e­z¬Û¦P¤j¤pªº¯x§Î¡C

¦b¶Ç¿é¹Lµ{¤¤¡ABitBlt ¤]¥i¥H¶i¦æ¤@¨Ç¹Bºâ¾Þ§@¡ABitBlt ³Ì«á¤@­Ó°Ñ¼Æ¬O dwRop¡A¬O DWORD ªøªº¥¿¾ã¼Æ¡A¥¦¨M©w¤F·í¸ê®Æ¥Ñ¨Ó·½¸Ë¸m¤º®e¶Ç¿é¨ì¥Øªº¸Ë¸m¤º®e®É¡A¶i¦æªº¾Þ§@¡CdwRop ªº¾Þ§@¹ï¶H¦³¤TºØ¡G①¨Ó·½¸Ë¸m¤º®e¤¤«ü©wªº¯x§Î½d³ò¤ºªº¸ê®Æ¡B②¥Øªº¸Ë¸m¤º®e«ü©w¯x§Î½d³ò¤º­ì¥»ªº¸ê®Æ¥H¤Î③µe¨ê¡A¦ý¨Ã¤£¬O¨C¤@ºØ¾Þ§@³£·|¥Î±o¨ì³o¤TºØ¡A¦³®É¥u¦³¤@ºØ¡A¦³®É¨âºØ©Î¤TºØ¡A¦³®É¬Æ¦Ü¤£»Ý­n¡A¨Ò¦p BLACKNESS ´N¤£»Ý­n¡C

¨ä¹ê¾Þ§@¤è¦¡¤]¥i¬Ý¦¨¬O¹Bºâ¡A¦³½Æ»s¡B©Î¡B¥B¡B¤¬¥¸©Î¡B«D¤­ºØ¡A¸g¹L³o¨Ç¾Þ§@¤§«á¡A¦A¦s¤J¥Øªº¸Ë¸m¤º®e«ü©w¯x§Î½d³ò¤º¡A¦]¦¹¦b¥Øªº¸Ë¸m¤º®e¤¤©Ò«ü©w¯x§Î½d³ò¤ºªº¹Ï®×·|µo¥ÍÅܤơC¤Uªí¬O±`¥Îªº dwRop¡A¥i¥H¬d¾\ MSDN ±o¨ì§ó¦h¸ê®Æ¡Cªí¤¤³Ì«á¤@Ä檺 S ¥Nªí¨Ó·½¸Ë¸m¤º®e¤¤«ü©wªº¯x§Î½d³ò¤ºªº¸ê®Æ¡BD ¥Nªí¥Øªº¸Ë¸m¤º®e«ü©w¯x§Î½d³ò¤ºªº¸ê®Æ¡BB ¥Nªíµe¨ê¡C¦Ó¾Þ§@«áªºµ²ªG·|¼g¤J D¡C

dwRop¼Æ­È»¡©úµ²ªG
BLACKNESS42H¨Ï¥Øªº¯x§Î¶ñº¡¶Â¦â0
WHITENESS0FF0062H¨Ï¥Øªº¯x§Î¶ñº¡¥Õ¦â1
SRCCOPY0CC0020H±N¨Ó·½¯x§Îªº¸ê®Æ½Æ»s¨ì¥Øªº¯x§ÎS
NOTSRCCOPY330008H¨Ó·½¯x§Î§@«D¹Bºâ¤§«á¶ñ¤J¥Øªº¯x§Înot S
MERGECOPY0C000CAH¨Ó·½¯x§Î»P¥Øªº¸Ë¸m¤º®eªºµe¨ê§@¥B¹Bºâ«á¶ñ¤J¥Øªº¯x§ÎS and B
SRCPAINT0EE0086H¨Ó·½¯x§Î»P¥Øªº¯x§Î§@¥B¹Bºâ«á¶ñ¤J¥Øªº¯x§ÎS or D
SRCINVERT660046H¨Ó·½¯x§Î»P¥Øªº¯x§Î§@¤¬¥¸©Î¹Bºâ«á¶ñ¤J¥Øªº¯x§ÎS xor D

¦pªG BitBlt °õ¦æ¦¨¥\¡A¦^¶Ç­È¬O¤@¡F¦pªG°õ¦æ¥¢±Ñ¡A¦^¶Ç­È¬°¹s¡CVIEWBMP3 »¡©ú§Q¥Î BitBlt ªº dwRop °Ñ¼Æªº¨Ò¤l¡C

SetBkMode API

SetBkMode ³]©w©Ò«ü©wªº³]³Æ¤º®e­I´º²V¦X¼Ò¦¡¡A­I´º²V¦X¼Ò¦¡¥Î©ó¤å¦r¡B¥æ¿ùµe¨ê¡]hatched brushes¡^©M«D¹ê½uªºµeµ§¡CSetBkMode ªº­ì«¬¬O¡G

invoke  SetBkMode,\
        hdc,\           ; handle to DC
        iBkMode         ; background mode

hdc ¬O­n³]©w³]³Æ¤º®eªº¥N½X¡AiBkMode ¬O­n³]©wªº¼Ò¦¡¡CiBkMode ¬O·Q­n³]©wªº­I´º¼Ò¦¡¡A¦³¨âºØ¿ï¾Ü¡G①TRANSPARENT¡B②OPAQUE¡C«eªÌ¬O³z©úªº¡A·N«ä«O«ù«á­±ªº­I´º¹Ï®×¤£ÅÜ¡F«áªÌ¬O¥H·í«e­I´º¦â¶îº¡¡C¦pªG SetBkMode °õ¦æ¦¨¥\¡A¦^¶Ç­È¬°­ì¥ýªº­I´º¼Ò¦¡¡F¦pªG°õ¦æ¥¢±Ñ¡A¦^¶Ç­È¬°¹s¡C

GetObject API

GetObject ¯àÀò±o«ü©wªº¹Ï§Îª«¥ó¡]graphics object¡^¸ê®Æ¡A¦¹³Bªº¹Ï§Îª«¥ó¥i¥H¬O¦ì¤¸¹Ï¡Bµeµ§¡B½Õ¦âªO¡Bµe¨ê¡B¦r§Î¡CGetObject ªº­ì«¬¬O¡G

invoke  GetObject,\
        hgdiobj,\       ; handle to graphics object
        cbBuffer,\      ; size of buffer for object information
        lpvObject       ; buffer for object information

³o¤T­Ó°Ñ¼Æªº·N¸q¦p¤U¡G

GetObject ¯à°÷Àò±o³\¦hºØ¹Ï§Îª«¥óªº¸ê®Æ¡A¤£¦PºØªº¹Ï§Îª«¥ó¦³¤£¦Pªº¸ê®Æ¡A³o¨Ç¸ê®Æ·|³Q¦s©ñ©ó lpvObject ©Ò«üªº¦ì§}¡A¦¹¦ì§}¹ê»Ú¤W¬O¤£¦Pªºµ²ºcÅé¡C¨Ò¦p°²³]­nÀò±o¦ì¤¸¹Ïªº¸ê®Æ¡A¨º»ò hgdiobj ¬°¦ì¤¸¹Ï¥N½X¡AlpvObject ¬° BITMAP µ²ºcÅé¡F°²³]­nÀò±oµeµ§ªº¸ê®Æ¡A¨º»ò hgdiobj ¬°µeµ§¥N½X¡AlpvObject ¬° LOGPEN µ²ºcÅé¡K¡K¡C

¦pªG¤£½T©w²Ä¤G¡B²Ä¤T­Ó°Ñ¼Æ¡A¤]¥i¥H¨Ï lpvObject ¬°¹s¡A©I¥s GetObject ¤§«á¡A¦^¶Ç­È´N¬O lpvObject ©Ò«üªº¦ì§}»Ý­nªº°O¾ÐÅé¤j¤p¡CµM«á¥i¥H¦A©I¥s GetObject¡A²Ä¤G¦¸©I¥s®É¡A²Ä¤G­Ó°Ñ¼Æ´N¬O²Ä¤@¦¸©I¥sªº¦^¶Ç­È¡A¨Ã¥B¦b²Ä¤T­Ó°Ñ¼Æ«ü©wªº¦ì§}·Ç³Æ¨¬°÷¤jªº°O¾ÐÅéªÅ¶¡¡]¤]´N¬O¦^¶Ç­È¤j¤p¡^¡A´N¯àÀò±o hgdiobj ª«¥óªº¸ê®Æ¤F¡C

¦pªG GetObject °õ¦æ¥¢±Ñ¡A¦^¶Ç­È¬°¹s¡C¦pªG lpvObject ¤£¬°¹s¦Ó¥B GetObject °õ¦æ¦¨¥\¡A¨º»ò lpvObject ·|¶ñ¤W¥¿½Tªº¸ê®Æ¥B¦^¶Ç­È¬O©Ò¶ñ¸ê®Æ¦³¦h¤Ö¦ì¤¸²Õ¡F¦pªG lpvObject ¬°¹s¦Ó¥B GetObject °õ¦æ¦¨¥\¡A¨º»ò¦^¶Ç­È¬O©Ò¶ñ¸ê®Æ»Ý­n¦h¤Ö¦ì¤¸²Õ¦s©ñ¡C

BITMAP µ²ºcÅé

¦pªG©I¥s GetObject ®É²Ä¤@­Ó°Ñ¼Æ¬O¦ì¤¸¹Ï¥N½X¡A¨º»ò±o¨ìªº¦ì¤¸¹Ï¸ê®Æ·|¦s¦b BITMAP µ²ºcÅ餤¡A©³¤U¬O BITMAP µ²ºcÅ骺Äæ¦ì¡G

BITMAP          STRUCT
  bmType        LONG    ?   ;¦ì¤¸¹ÏÃþ«¬¡A¥²¶·¬O0
  bmWidth       LONG    ?   ;¦ì¤¸¹Ï¼e«×¡A¥²¶·¬O¥¿¼Æ
  bmHeight      LONG    ?   ;¦ì¤¸¹Ï°ª«×¡A¥²¶·¬O¥¿¼Æ
  bmWidthBytes  LONG    ?   ;¨C¤@¦C¥e¥Î¦h¤Ö­Ó¦ì¤¸²Õ
  mPlanes       WORD    ?   ;ÃC¦â­±­Ó¼Æ
  mBitsPixel    WORD    ?   ;¨C­Ó¹³¯À»Ý­n¦h¤Ö¦ì¤¸
                DWORD   ?   ;ªÅªºÂù¦r²Õ
  mBits         LPVOID  ?   ;¦ì¤¸¹Ï¸ê®Æªº«ü¼Ð
BITMAP          ENDS

­º¥ý­n»¡©úªº¬O¡A¦pªG§A¨Ï¥Î WinInc ¥]§tÀÉ¡A¨º»ò BITMAP ¬O©w¸q¦b wingdi.inc Àɮפº¡A¦ý³o­Ó©w¸q¬O¿ùªº¡A¤Ö¤F¤W­±¥Hµµ¬õ¦â¼Ð¥Üªº¨º¤@¦æ¡A³o¤@¦æªº¥Øªº¬OÅý¥H«áªºÄæ¦ì³£¹ï»ô 32 ¦ì¤¸Ãä¬É¡C¤]´N¬O»¡¨Ï¥H«áªºÄæ¦ì°_©l¦ì§}ªº­Ó¦ì¼Æ¤£¬O 0 ´N¬O 8¡C¦pªG¨Ï¥Îªº¬O MASM64 SDK¡A¨º»ò BITMAP ¬O©w¸q¦b win64.inc Àɮפº¡A³o­Ó©w¸q¬O¥¿½Tªº¡C

©³¤U»¡©ú BITMAP µ²ºcÅ餤¦UÄæ¦ìªº·N¸q¡G

°²³]¬Y­Ó BMP ¹Ï¤ù¬O¯u±m¹Ï¤ù¡A¦Ó²Ä¹s¦C²Ä¹s¦æªº¹³¯À¬O¶Â¦â¡A²Ä¹s¦C²Ä¤@¦æªº¹³¯À¬O¥Õ¦â¡A¨º»ò mBits ©Ò«ü¦ì§}ªº°O¾ÐÅ餺´N¬O¤T­Ó¦ì¤¸²Õªº¹s¡A±µ¤U¨Óªº¤T­Ó¦ì¤¸²Õ³£¬O 0FFh¡C³o´N¬O©Ò¿×ªº¹³¯À¸ê®Æ¡A³o¨Ç¹³¯À¸ê®Æºc¦¨¤@´T¹Ï¤ù¡C¦pªG¬Y­Ó¦ì¤¸¹Ï¬O 256 ¦â¡A²Ä¹s¦C²Ä¹s¦æ¬O¶Â¦â¡A¦P¦C²Ä¤@¦æ¬O¥Õ¦â¡A¨º»ò mBits ©Ò«ü¦ì§}ªº°O¾ÐÅé¬O¤@­Ó¦ì¤¸²Õªº¹s¡A±µµÛ¬O¤@­Ó¦ì¤¸²Õªº 0FFh¡C¦]¬°¤£¦PÃC¦â¡A¸ê®ÆÃþ«¬¤£¦P¡A©Ò¥H mBits ªº¸ê®ÆÃþ«¬¬O VOID¡C


¨Ò¤l¡GVIEWBMP1

VIEWBMP1 ·|¥Ñ¸ê·½¤¤¸ü¤J stellar_blade ¦ì¤¸¹Ï¡A¦Ó«áÅã¥Ü©óµøµ¡¤u§@°Ï¤º¡CVIEWBMP1 ·|¨Ï¥Î¥|­ÓÀɮסGVIEWBMP1.ASM¡BVIEWBMP1.RC¡Beye.ico¡Bstellar_blade.bmp¡A¥i¥H¦b³oùؤU¸ü¡C©³¤U¬O¸ê·½´y­zÀÉ¡AVIEWBMP1.RC ªº¤º®e¡G

1
2
VIEWICO ICON    eye.ico
stellar_blade   BITMAP  stellar_blade.bmp

©³¤U¬O­ì©lµ{¦¡ VIEWBMP1.ASM ªº¤º®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
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
;±NBMP¹ÏÀÉ»s§@¦¨BITMAP¸ê·½¡AµM«á¥HLoadBitmap¸ü¤JÅã¥Ü©ó¿Ã¹õ¤W
OPTION CASEMAP:NONE
OPTION WIN64:7

INCLUDE         WINDOWS.INC
INCLUDELIB      GDI32.LIB
INCLUDELIB      KERNEL32.LIB
INCLUDELIB      USER32.LIB
;*****************************************************************************************
.CONST
szClassName     DB      "VIEWBMP1",0
szIconName      DB      "VIEWICO",0
szAppName       DB      "EVE - ¼C¬Pªº¤k¥D¨¤",0
szBmpName       DB      "EVE",0
;*****************************************************************************************
.DATA
hInstance       DQ      ?       ;¼Ò²Õ¥N½X
hwnd            HWND    ?       ;µøµ¡¥N½X
hBitmap         HBITMAP ?       ;¦ì¤¸¹Ï¥N½X
bitmap          BITMAP  <>      ;¦ì¤¸¹Ïªº¸ê®Æ
rcClient        RECT    <0,0,?> ;¤u§@°Ï¯x§Î½d³ò
;*****************************************************************************************
.CODE
;-----------------------------------------------------------------------------------------
WndProc PROC    hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
        LOCAL   ps:PAINTSTRUCT,hdcMem:HDC
.switch uMsg
  .case WM_PAINT
        invoke  BeginPaint,hWnd,ADDR ps
        invoke  CreateCompatibleDC,ps.hdc
        mov     hdcMem,rax
    ;§âstellar_blade.bmp¹Ï®×ø»s©ó°O¾ÐÅé¸Ë¸m¤º®e¤¤
        invoke  SelectObject,hdcMem,hBitmap
    ;§âszAppName¦r¦êø»s©ó°O¾ÐÅé¸Ë¸m¤º®e¤¤
        invoke  SetBkMode,hdcMem,TRANSPARENT
        invoke  DrawText,hdcMem,OFFSET szAppName,-1,OFFSET rcClient,\
                DT_SINGLELINE or DT_CENTER or DT_VCENTER
    ;§âstellar_blade.bmp»PszAppName¦r¦êªº¤º®e¶Ç¿é¦Üµøµ¡¤u§@°Ï¸Ë¸m¤º®e
        invoke  BitBlt,ps.hdc,0,0,bitmap.bmWidth,bitmap.bmHeight,hdcMem,0,0,SRCCOPY
        invoke  DeleteDC,hdcMem
        invoke  EndPaint,hWnd,ADDR ps

  .case WM_DESTROY
        invoke  DeleteObject,hBitmap
        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,rect:RECT
        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
        invoke  LoadCursor,NULL,IDC_ARROW
        mov     wc.hCursor,rax
        mov     wc.hbrBackground,COLOR_WINDOW+1
        mov     wc.lpszMenuName,0
        lea     rdx,szClassName
        mov     wc.lpszClassName,rdx
        invoke  RegisterClassEx,ADDR wc
    ;¸ü¤J¦ì¤¸¹Ï¡A¥HÀò±o¦ì¤¸¹Ïªº¼e«×»P°ª«×
        invoke  LoadBitmap,hInstance,OFFSET szBmpName
        mov     hBitmap,rax
        invoke  GetObject,hBitmap,SIZEOF BITMAP,OFFSET bitmap
        mov     r10d,bitmap.bmWidth     ;R10D¡×¦ì¤¸¹Ï¼e«×
        mov     r11d,bitmap.bmHeight    ;R11D¡×¦ì¤¸¹Ï°ª«×
        mov     rcClient.right,r10d
        mov     rcClient.bottom,r11d
    ;­pºâ¯à®e¯Ç¾ã±i¦ì¤¸¹Ïªºµøµ¡»Ý­n³Ì¤p¼e«×»P°ª«×
        mov     rect.left,0
        mov     rect.top,0
        mov     rect.right,r10d
        mov     rect.bottom,r11d
        invoke  AdjustWindowRect,ADDR rect,WS_CAPTION or WS_SYSMENU,0
        mov     r10d,rect.right
        mov     r11d,rect.bottom
        sub     r10d,rect.left          ;R10D¡×­pºâ§¹¦¨«áªºµøµ¡¼e«×
        sub     r11d,rect.top           ;R11D¡×­pºâ§¹¦¨«áªºµøµ¡°ª«×
    ;«Ø¥ß¤u§@°Ï«ê¦n¯à®e¯Ç¾ã±i¦ì¤¸¹Ïªºµøµ¡
        invoke  CreateWindowEx,0,ADDR szClassName,ADDR szAppName,WS_CAPTION or\
                WS_SYSMENU,50,50,r10d,r11d,0,0,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

²ÕĶ¤è¦¡¦p¤U¡G

Microsoft Windows [ª©¥» 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\wanker>uasm [Enter]  ¡÷°õ¦æ UASM.BAT §å¦¸ÀÉ¡A¬Ù¤F³\¦h¥´¦r¿é¤J¡A¨£²Ä 11 ³¹ UASM.BAT

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

E:\HomePage\SOURCE\Win64>cd VIEWBMP [Enter] ¡÷¤Á´«¦Ü VIEWBMP ¤l¥Ø¿ý

E:\HomePage\SOURCE\Win64\VIEWBMP>uasm64 -win64 viewbmp1.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.

VIEWBMP1.ASM: 110 lines, 3 passes, 138 ms, 0 warnings, 0 errors

E:\HomePage\SOURCE\Win64\VIEWBMP>rc viewbmp1.rc [Enter]
Microsoft (R) Windows (R) Resource Compiler Version 10.0.10011.16384
Copyright (C) Microsoft Corporation.  All rights reserved.


E:\HomePage\SOURCE\Win64\VIEWBMP>link viewbmp1.obj viewbmp1.res [Enter]
Microsoft (R) Incremental Linker Version 14.25.28614.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/SUBSYSTEM:WINDOWS /DEBUG

E:\HomePage\SOURCE\Win64\VIEWBMP>

½Õ¾ãµøµ¡¤j¤p¡A¨Ï±o¤u§@°Ï¤j¤p«êµ¥©ó¦ì¤¸¹Ï¤j¤p

VIEWBMP1.ASM ¤¤²Ä 97 ¦æ©I¥s CreateWindowEx ®É¡A²Ä¤C¡B¤K­Ó°Ñ¼Æ¡AnWidth¡BnHeight¡A«üªº¬Oµøµ¡¤j¤p¡A¦ý¬Oµøµ¡¥|©P¦³Ãä®Ø¡A¤W­±¦³¼ÐÃDÄæ¡A¦³®ÉÁÙ¦³¥\¯àªí¡A¤¤¶¡¤~¬O¤u§@°Ï¡A©Ò¥H¤u§@°Ïªº¤j¤p¤ñµøµ¡¤p¡C¦pªG­n¨Ï¤u§@°Ï«ê¦n¯à®e¯Ç¾ã±i¦ì¤¸¹Ï¡A¥i¥H©I¥s AdjustWindowRect ¨Ó½Õ¾ãµøµ¡¤j¤p¡C

¤£¹L AdjustWindowRect ªº²Ä¤@­Ó°Ñ¼Æ¬O¤u§@°Ïªº¤j¤p¡A¬O¸ê®ÆÃþ«¬¬° RECT µ²ºcÅé¡A¨ä¦WºÙ¬° rect ªº°Ï°ìÅܼơ]©w¸q¦b²Ä 57 ¦æ¡^¡A¨Ã«D¥H¼e«×©M°ª«×ªí¥Ü¡C©Ò¥H±o¨ì¦ì¤¸¹Ïªº¤j¤p¤§«á¡A§â rect ªº¥|­ÓÄæ¦ì left¡Btop¡Bright¡Bbottom ¤À§O¶ñ¤J¾A·íªº¼Æ­È¡Aleft¡Btop ³]¬°¹s¡Aright ³]¬°¦ì¤¸¹Ïªº¼e¡Abottom ¬°¦ì¤¸¹Ïªº°ª¡]¨£²Ä 86¡ã90 ¦æ¡^¡C

©I¥s AdjustWindowRect ¦¨¥\¤§«á¡A­pºâ©Ò±oªºµøµ¡¤j¤p¦s©ó rect ÅܼƤ§¤¤¡A©Ò¥Hµøµ¡ªº¼e«×µ¥©ó rect.right¡Ðrect.left¡A°ª«×µ¥©ó rect.bottom¡Ðrect.top¡A¦b VIEWBMP1.ASM ¤¤¬Û´î¤§«áªº®t­È¤À§O¦s©ó R10D¡BR11D ¼È¦s¾¹ùØ­±¡CµM«á¥H¥¦­Ì¬°°Ñ¼Æ©I¥s CreateWindowEx¡A¨£²Ä 91¡ã98 ¦æ¡C

Àò±o¦ì¤¸¹Ïªº¤j¤p

Àò±o¦ì¤¸¹Ïªº¦U¶µ¸ê®Æ¡A¤@¯ë¬O©I¥s GetObject¡A¶Ç¤Jªº°Ñ¼Æ¬O¦ì¤¸¹Ï¥N½X¤Î¸ê®ÆÃþ«¬¬° BITMAP ªºµ²ºcÅé¡C¦pªG GetObject ¦¨¥\°õ¦æ«á¡ABITMAP µ²ºcÅ餺·|¶ñ¤J¸Ó¦ì¤¸¹Ïªº¦U¶µ¸ê®Æ¡C¦Ü©ó¦p¦ó¯à¥Ñ BMP ¹Ï¤ùÀɱo¨ì¦ì¤¸¹Ï¥N½X¡H¦³¨âºØ¤èªk¡G①¥ý±N BMP ¹Ï¤ùÀÉ»s§@¦¨¸ê·½¡A±µµÛ¥Î LoadBitmap ¸ü¤J¡C②ª½±µ©I¥s LoadImage ¸ü¤J BMP ¹Ï¤ùÀÉ¡CVIEWBMP1 ¨Ï¥Îªº¬O«e¤@ºØ¤èªk¡A¨£²Ä 77¡ã80 ¦æ¡C²Ä¤G¡B¤T­Ó¨Ò¤l¨Ï¥Î²Ä¤GºØ¤èªk¡C

Åã¥Ü BMP ¹Ï¤ù

¤W­±¨â¥ó¤u§@¡]Àò±o¦ì¤¸¹Ïªº¤j¤p¡B½Õ¾ãµøµ¡¤j¤p¡^¥»À³¸Ó©ñ¦b WM_CREATE °T®§¤¤³B²z¡A¦ý³o®É­Ôµøµ¡¤w¸g«Ø¥ß¡AÁöµM¥i¥H©I¥s Win64 API §ïÅܵøµ¡¤j¤p¡A¦ý¦ó¥²³o»ò³Â·Ð¡H¦b©I¥s CreateWindowEx ®É¡A´N«ü©w¯àÅã¥Ü¾ã±i¹Ï¤ùªºµøµ¡¼e«×»P°ª«×¤£´N¦n¤F¶Ü¡H¦]¦¹³o¨â¥ó¨Æ±¡¤~©ñ¦b main ùسB²z¡C

²@µLºÃ°Ý¡AÅã¥Ü BMP ¹Ï¤ù¥²¶·¦b³B²z WM_PAINT ®Éµo¥Í¡C¨£²Ä 30¡ã40 ¦æ¡A³o¨Ç¨BÆJ¦b¥»³¹¤@¶}©l®É¡A´N¤w¸g»¡¹L¤F¡A¥D­n´N¬O¨Ì§Ç©I¥s CreateCompatibleDC¡÷SelectObject¡÷BitBlt¡÷DeleteDC¡C¦ý¬°¤FÃÒ©ú°O¾ÐÅé¸Ë¸m¤º®e¤]¯àø»s¤å¦r¡A©Ò¥H²Ä 36 ¦æ¡A©I¥s DrawText §â szAppName ¦r¦êø»s©ó°O¾ÐÅé¸Ë¸m¤º®e¡AµM«á©I¥s BitBlt ®É¡A¤]¯à±N³o­Ó¦r¦ê¶Ç¿é¦Üµøµ¡¤u§@°Ï¤º¦ÓÅã²{¥X¨Ó¡C

²Ä 35 ¦æ©I¥s SetBkMode ªº­ì¦]¬OÅý¦r¦êªº­I´ºÅܱo³z©ú¡A§_«h­I´º¬°¥Õ¦â¡A¸û¤£¬üÆ[¡C

VIEWBMP1 ¤w¸Ñ»¡§¹²¦¡A³Ñ¾l¨S»¡©úªº¡A«e­±¤w¸g´£¹L¡A¤£¦AÂØ­z¡C


¨Ò¤l¡GVIEWBMP2

¥»³¹²Ä¤G­Ó¨Ò¤l¡AVIEWBMP2 ¥i¥H¦b©R¥O´£¥Ü¦r¤¸¤¤¡A¿é¤J¤U­±«ü¥O¡G

viewbmp2 filename

¨Ï¥ÎªÌ¦b©R¥O´£¥Ü¤§«á¡A¿é¤J VIEWBMP2 ¤§«á¬O¤@­Ó©Î¦h­ÓªÅ¥Õ¡AµM«á¬O filename¡A³o filename ´N¬O BMP ¹Ï¤ùÀɪºÀɮצWºÙ¡A¥i¥H¥]§tºÏºÐ¾÷¦W¡B¸ô®|¦W¡CµM«á¦A«ö¤U¡uENTER¡vÁä¡A´N¯à¥X²{¤@­Óµøµ¡¡A¨ä¤u§@°Ï´N¬O¸Ó BMP ¹Ï¤ùÀɪº¹Ï¤ù¡C¨Ò¦p©³¤Uªº¨Ò¤l¡A¥i¥HÅã¥Ü stellar_blade.bmp ¹Ï¤ùÀÉ¡G ±q¤W­±¥i¥H±oª¾¡AVIEWBMP2 ¥²¶·­n¨ú±o¡u©R¥O¦C¦r¦ê¡v¡A©Ò¿×©R¥O¦C¦r¦ê«üªº¬O¦b©R¥O´£¥Ü¦r¤¸¤º¨Ï¥ÎªÌ¿é¤Jªº©Ò¦³¦r¤¸¡A¦ýµ²§À¤£§t carriage return ¦r¤¸¡]carriage return ¬O«ö¤U¡uENTER¡vÁä¥Í¦¨ªº¦r¤¸¡^¡A¦Ó¥H¹s¨ú¥N¡C¨Ò¦p¤W¹Ïªº¨Ò¤l¡A¥H¬õ¦â®Ø®Ø¦íªº¬O¿é¤Jªº«ü¥O¡A©R¥O¦C¦r¦ê«K¬O¡u"viewbmp2 stellar_blade.bmp",0¡v¡A´«¥y¸Ü»¡¡A¨Ï¥ÎªÌ«ç¼Ë¿é¤J¡A©R¥O¦C¦r¦ê´Nªø±o«ç»ò¼Ë¡A´N¥u¬Oµ²§À¬O¹s¡C¦Óµ{¦¡¦WºÙ¤§«á¡A©ÎªÌ»¡«ü¥O¤§«áªº¡ustellar_blade.bmp¡v¡A¤@¯ëºÙ¬°°Ñ¼Æ©Î¿ï¶µ¡C¨º»ò­n¦p¦ó¨ú±o©R¥O¦C¦r¦ê©O¡H¥i¥H©I¥s GetCommandLine §¹¦¨¡C

·íµM¡AVIEWBMP2 ¤£­­©w¥u¯àÆ[¬Ý stellar_blade.bmp ¹Ï¤ùÀÉ¡A¥u­n¬O¦ì¤¸¹Ï¡A³£¯àÆ[¬Ý¡C¨Ò¦p©³¤Uªº¨Ò¤l¬OÆ[¬Ý D: ºÏºÐ¾÷ªº¹Ï¤ùÀÉ¡A¡uD:\PICTURE\97f1logu00.bmp¡v¡G

E:\HomePage\SOURCE\Win64\VIEWBMP>viewbmp2 d:\PICTURE\97f1logu00.bmp

GetCommandLine API

GetCommandLine ¥i¥HÀò±o©R¥O´£¥Ü¦C¤Wªº¦r¦ê¡C¥¦¨S¦³°Ñ¼Æ¡A©Ò¥H©I¥s¤è¦¡¥i¥Hª½±µ¨Ï¥Î x86 «ü¥O¡ACALL¡A²¦³º¤£½×¬O UASM ªº INVOKE °²«ü¥OÁÙ¬O MASM64 SDK ªº invoke ¥¨¶°¡A³£¬O¬°¤F±N°Ñ¼Æ¦s¤J¼È¦s¾¹©Î°ïÅ|ªº¡A¬JµM GetCommandLine ¨S¦³°Ñ¼Æ¡A´N¥i¥Hª½±µ¨Ï¥Î CALL «ü¥O¡A·íµM­n¨Ï¥Î invoke ¤]¤£¬O¤£¦æ¡C©³¤U¬O GetCommandLine ªº­ì«¬¡G

call    GetCommandLine

GetCommandLine ªº¦^¶Ç­È¬O©R¥O¦C¦r¦êªº¦ì§}¡C

°£¤F±o¨ì©R¥O¦C¦r¦ê¤§¥~¡AVIEWBMP2 ÁÙ­n¯à¤ÀªR©R¥O¦C¦r¤¸¡A¥HµÑ¨ú¥X BMP ¹Ï¤ùÀɦWºÙ¡C¤p¤ì°¸©t­®¹è»D¡A¤£ª¾¹D¬O§_¦³ Win64 API ¥i¥H§¹¦¨³o¥ó¨Æ±¡¡A¦ý¬O¥i¥H¥Î x86 CPU «ü¥O§¹¦¨¡C¦b³o¤§«e¡AÁÙ±o¥ýÀò±o¦r¦êªø«×¡A³o¥i¥H©I¥s lstrlen¡C

x86 «ü¥O¡GSCASB¡BSCASW¡BSCASD¡BSCASQ

³o¥|­Ó«ü¥O«ÜÃþ¦ü¡A¥ý»¡©ú SCASB¡A¦pªG¯àÁA¸Ñ¥¦¡A¥t¥~¤T­Ó´N«Ü®e©öÁA¸Ñ¤F¡C

SCASB «ü¥O

SCASB ¬O scan string byte ªº·N«ä¡A½¦¨¤¤¤å´N¬O¥H¦ì¤¸²Õ¤è¦¡±½´y¦r¦ê¡A§ó¶i¤@¨B¨Ó»¡´N¬O¦b¬Y­Ó¦r¦ê¤¤±½´y¡A¬Ý¬Ý¬O§_¦³«ü©wªº¦ì¤¸²Õ¡C»yªk¦p¤U¡G

SCASB

«ü©wªº¦ì¤¸²Õ¥²¶·¬O©ñ¦b AL ¼È¦s¾¹ùØ¡A³Q±½´y¦r¦êªº¦ì§}©ñ¦b RDI¡A¨C±½´y¤@¦¸·|Åý RDI «ü¦V¤U¤@­Ó¦ì§}¡C¦pªG¹³¤W¦¡¨º¼Ë¡A¶È¶È¬O SCASB «ü¥O¡A¨º´N¥u±½´y¤@¦¸¡A¨ä¹ê´N¬O§â AL ©M RDI ©Ò«ü¦ì§}ªº°O¾ÐÅ餺®e¤ñ¸û¡A¨Ã¨Ï RDI «ü¦V¤U¤@­Ó¦ì§}¡C¤ñ¸ûµ²ªG¦pªG¬Û¦P¡A¹s­ÈºX¼Ð³]¬°¤@¡A§_«h¬°¹s¡C

©Ò¿×ªº¤U¤@­Ó¦ì§}¬O¨Ì¾Ú¤è¦VºX¼Ð¨M©wªº¡A¦pªG¤è¦VºX¼Ð¬° UP¡A¨º»ò RDI ¼W¥[¤@¡F­Y¤è¦VºX¼Ð¬° DN¡ARDI ´î¤Ö¤@¡C¦p¦ó³]¸m¤è¦VºX¼Ð¬° UP ©Î DN¡A½Ð°Ñ¦Ò²Ä¤T³¹x86 «ü¥O¡GCLD »P STD ¤@¸`¡C

¤£¹L¡ASCASB ³q±`·|·f°t REPNE ©Î REPE ¨Ï¥Î¡CREPNE ¬O repeat while not equal ªº·N«ä¡A·N§Y¤£¬Ûµ¥®É­«½Æ¡FREPE ¬O repeat while equal ªº·N«ä¡A·N§Y¬Ûµ¥®É­«½Æ¡C°²¦p¼g¦¨¡uREPNE SCASB¡v©Î¡uREPE SCASB¡v¡A³o¼Ë´N¯à­«½Æ±½´y¡CRDI ¬°­n±½´yªº¦r¦ê¦ì§}¡ARCX ¬°­«½Æ¦¸¼Æ¡A¨C±½´y¤@¦¸¡ARCX ·|´î¤@¡ARDI ·|®Ú¾Ú¤è¦VºX¼Ð¦Û°Ê«ü¦V¤U¤@­Ó¦ì§}¡C»yªk¦p¤U¡G

REPNE   SCASB
REPE    SCASB

REPNE SCASB ªº¥Îªk

REPNE SCASB ªº·N«ä¬O¦pªG¤£¦P´N­«½Æ±½´y¡F¤Ï¹L¨Ó»¡¡A¦pªG¬Û¦P´N°±¤î±½´y¡C§ó¶i¤@¨B¨Ó»¡¬O«ü¡A·í AL ¤§¤º®e»P RDI ©Ò«ü¦ì§}¤Wªº¤º®e¤£¬Ûµ¥¡A´N­«½Æ¦A±½´y¤@¦¸¡A·íµM RDI ·|«ü¦V¤U¤@¦ì§}¦P®É RCX ´î¤@¡C³oºØ¹Lµ{·|¤@ª½­«½Æ¡Aª½¨ì§ä¨ì»P AL ¬Û¦Pªº¦ì¤¸²Õ©Î¬O RCX ´î¦Ü¹s¤~°±¤î¡C¦pªG§ä¨ì¬Û¦Pªº¦ì¤¸²Õ¦Ó°±¤î¡A¨º»ò·|¨Ï¹s­ÈºX¼ÐÅܬ° ZR¡A¦P®É RDI ·|«ü¦V§ä¨ì¬Û¦P¦ì¤¸²Õªº¤U¤@¦ì§}¡C¦pªG¬O RCX ´î¦Ü¹s³£¨S§äµÛ¬Û¦Pªº¡A¨º»ò·|¨Ï¹s­ÈºX¼ÐÅܬ° NZ¡C

©Ò¥Hµ²½×´N¬O¡AREPNE SCASB ±`¥Î©ó¦b¤@¦r¦ê¤¤·j´M¬Y­Ó¦r¤¸¡A¦pªG§äµÛ¤F¡A¹s­ÈºX¼Ð³]¬° ZR¡A¦ý RDI ¨Ã«D«ü¦V©Ò§ä¨ì¦r¤¸ªº¦ì§}¡A¦Ó¬O¤U¤@¦ì§}¡C¦pªG§ä¤£µÛ¡A¹s­ÈºX¼Ð³]¬° NZ¡A¥B RCX ¬°¹s¡C

REPE SCASB ªº¥Îªk

REPE SCASB ªº·N«ä¬O¦pªG¬Û¦P´N­«½Æ±½´y¡F¤Ï¹L¨Ó»¡¡A¦pªG¤£¦P´N°±¤î±½´y¡C§ó¶i¤@¨B¨Ó»¡¬O«ü¡A·í AL ¤§¤º®e»P RDI ©Ò«ü¦ì§}¤Wªº¤º®e¬Ûµ¥¡A´N­«½Æ¦A±½´y¤@¦¸¡A·íµM RDI ·|«ü¦V¤U¤@¦ì§}¦P®É RCX ´î¤@¡C³oºØ¹Lµ{·|¤@ª½­«½Æ¡Aª½¨ì§ä¨ì»P AL ¤£¦Pªº¦ì¤¸²Õ©Î¬O RCX ´î¦Ü¹s¤~°±¤î¡C¦pªG§ä¨ì¤£¦Pªº¦ì¤¸²Õ¦Ó°±¤î¡A¨º»ò·|¨Ï¹s­ÈºX¼ÐÅܬ° NZ¡A¦P®É RDI ·|«ü¦V§ä¨ì¤£¦P¦ì¤¸²Õªº¤U¤@¦ì§}¡C¦pªG¬O RCX ´î¦Ü¹s³£¨S§äµÛ¤£¦Pªº¡A¨º»ò·|¨Ï¹s­ÈºX¼ÐÅܬ° ZR¡C

©Ò¥Hµ²½×´N¬O¡AREPE SCASB ±`¥Î©ó¦b¤@¦r¦ê¡]¦¹¦r¦êªº«e­±¼Æ­Ó¦r¤¸³£¬O¬Û¦Pªº¡^¤¤·j´M­º¦¸¥X²{¤£¦Pªº¦r¤¸¡A¦pªG§äµÛ¤F¤£¦P¦r¤¸¡A¹s­ÈºX¼Ð³]¬° NZ¡ARDI «ü¦V­º­Ó¤£¦P¦r¤¸ªº¤U¤@¦ì§}¡C¦pªG³£¨S§äµÛ¤£¦P¦r¤¸¡A¹s­ÈºX¼Ð³]¬° ZR¡A¥B RCX ¬°¹s¡C

³Ì«á­n»¡ªº¬O¡AREPE »P REPZ ¬O¤@¼Ëªº¡AREPNE »P REPNZ ¬O¤@¼Ëªº¡C¦b²Õ¦X»y¨¥ùØ¡A¤ñ¸û¨â¼Æ¬Û¦P¬O±Ä¥Î´îªk¡A¥u¬O¤£±Nµ²ªG¼g¤J¼È¦s¾¹¤º¡A¶È§ïÅܹs­ÈºX¼Ð¡C¦]¦¹¦pªG¨â¼Æ¬Û¦P¡A¬Û´î¤§«á¬°¹s¡A¹s­ÈºX¼Ð·|³]¬° ZR¡A©Ò¥H¬Û¦P¸ò¹s­È¬O¤@¼Ëªº¡C

¦b VIEWBMP2.EXE ¤¤¡AÀò±o©R¥O¦C¦r¦ê¦ì§}¤§«á¡A¤ÀªR¥¦´Nª¾¹D¡A©R¥O¦C¦r¦ê«e­±´X­Ó¦r¤¸¬O VIEWBMP2¡A¦Ó«á¬OªÅ¥Õ¡A¦³¥i¯à¬O¤@­ÓªÅ¥Õ©Î¦h­ÓªÅ¥Õ¡AµM«á¤~¬O­nÅã¥Ü¦bµøµ¡¤ºªº BMP ¹Ï¤ùÀɪºÀɦW¡C©Ò¥H¤p¤ì°¸ªº·Qªk¬O¨Ï EDI «ü¦V©R¥O¦C¦r¦ê¦ì§}¡AµM«á¥Î REPNE SCASB ·j´MªÅ¥Õ¦r¤¸¡C§ä¨ìªÅ¥Õ¦r¤¸¤§«á¡A¬°¤F©È¨Ï¥ÎªÌ¿é¤J¦h­ÓªÅ¥Õ¦r¤¸¡A´N¨Ï¥Î REPE SCASB ·j´M­º­Ó¤£¬OªÅ¥Õ¦r¤¸¡Cµ{¦¡½X¦p¤U¡G

;get_1st°Æµ{¦¡¥Î¨Ó·j´M©R¥O¦C¦r¦ê¤¤²Ä¤@­Ó°Ñ¼Æªº¦ì§}
;¿é¤J¡GpszCmdLine¡Ð©R¥O¦C¦r¦êªº¦ì§}
;¿é¥X¡GRAX¡Ð­Y§ä¨ì²Ä¤@­Ó°Ñ¼Æ¡ARAX¡×²Ä¤@­Ó°Ñ¼Æ¦ì§}
;¡@¡@¡@   ¡@­Y¨S§ä°Ñ¼Æ¡ARAX¡×0
get_1st PROC    USES rdi pszCmdLine:QWORD
        invoke  lstrlen,pszCmdLine
        mov     rdi,pszCmdLine
        mov     rcx,rax ;RCX¡×©R¥O¦C¦r¦êªø«×
        cld
        mov     al," "  ;AL¡×ªÅ¥Õ¦r¤¸
        repne   scasb   ;¦bEDI©Ò«üªº¦ì§}¤¤·j´MªÅ¥Õ¦r¤¸
        jnz     n_find  ;­Y¨S§ä¨ì¡A¸õÅD¦Ün_find:³B
        repe    scasb   ;­Y§ä¨ìªÅ¥Õ¡AÄ~Äò·j´M«DªÅ¥Õ¡A­Y¯à§ä¨ì«DªÅ¥Õ³o´N¬O²Ä¤@­Ó°Ñ¼Æ
        jz      n_find
        dec     rdi
        mov     rax,rdi ;­Y§ä¨ì²Ä¤@­Ó°Ñ¼Æ¡ARAX¡×²Ä¤@­Ó°Ñ¼Æ¦ì§}
        jmp     exit
n_find: xor     rax,rax ;¨S§ä¨ì°Ñ¼Æ
exit:   ret
get_1st ENDP

¨ä¥Lªº x86 ±½´y«ü¥O¡GSCASW¡BSCASD¡BSCASQ

»P SCASB «ü¥OÃþ¦üªº x86 «ü¥OÁÙ¦³ SCASW¡BSCASD¡BSCASQ¡A¥¦­Ì»P SCASB ªº®t§O¥u¦b©ó¤@¦¸±½´yªº¸ê®Æªø«×¡ASCASB ¤@¦¸±½´y¤@­Ó¦ì¤¸²Õ¡A©Ò¥H RDI ¨C¦¸¼W´î¤@¡CSCASW ¤@¦¸±½´y¤@­Ó¦r²Õ¡A©Ò¥H RDI ¨C¦¸¼W´î¤G¡FSCASD ¤@¦¸±½´y¤@­ÓÂù¦r²Õ¡A©Ò¥H RDI ¨C¦¸¼W´î¥|¡FSCASQ ¤@¦¸±½´y¤@­Ó¥|¦r²Õ¡A©Ò¥H RDI ¨C¦¸¼W´î¤K¡C¥¦­Ì¤]¥i¥H»P REPE¡BREPNE ·f°t¡A­«½Æ¦¸¼Æ§¡¦s©ñ©ó RCX¡C

LoadImage API

LoadImage ¯à°÷¥ÑÀɮשθ귽¤¤¸ü¤J¹Ï¥Ü¡B´å¼Ð¡B°ÊºA´å¼Ð¡B¦ì¤¸¹Ïµ¥¤£¦P§Î¦¡ªº¹Ï¤ùÀÉ¡C¨ä­ì«¬¬°¡G

invoke  LoadImage,\
        hinst,\         ; handle of the instance that contains the image
        lpszName,\      ; name or identifier of image
        uType,\         ; type of image
        cxDesired,\     ; desired width
        cyDesired,\     ; desired height
        fuLoad          ; load flags

¤U­±¬O¦U°Ñ¼Æªº»¡©ú¡G

¥Î LoadImage ¸ü¤Jªº¦ì¤¸¹Ï¡A¤£¦A¨Ï¥Î¤§«á­n©I¥s DeleteObject ¾P·´¡F¸ü¤Jªº´å¼Ð¡A­n©I¥s DestroyCursor ¾P·´¡F¸ü¤Jªº¹Ï¥Ü¡A­n©I¥s DestroyIcon ¾P·´¡C¦pªG LoadImage °õ¦æ¦¨¥\¡A¦^¶Ç­È¬°¹Ï§Îª«¥óªº¥N½X¡F¦pªG°õ¦æ¥¢±Ñ¡A¦^¶Ç­È¬°¹s¡C

VIEWBMP2 ªº¸ê·½´y­zÀÉ»P­ì©lµ{¦¡

VIEWBMP2 »Ý­n VIEWBMP2.ASM¡BVIEWBMP2.RC¡Beye.ico ¤T­ÓÀɮסA§¹¾ãªº¤º®e¥i¥H¦b³oùؤU¸ü¡C©³¤U¬O VIEWBMP2.ASM ªº³¡¤À¤º®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
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
⁝ 
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
;©ó©R¥O´£¥Ü¦r¤¸¤¤¿é¤J¡uVIEWBMP2 filename¡v¡A¨ä¤¤ªºfilename¬OBMT¹Ï¤ùÀÉ¡A´N¯àÅã¥Ü©ó¿Ã¹õ¤W
OPTION CASEMAP:NONE
OPTION WIN64:7

INCLUDE         WINDOWS.INC
INCLUDELIB      GDI32.LIB
INCLUDELIB      KERNEL32.LIB
INCLUDELIB      USER32.LIB
;*****************************************************************************************
.CONST
szClassName     DB      "VIEWBMP2",0
szIconName      DB      "VIEWICO",0
szAppName       DB      "VIEW BMP2",0
sNotFindBmp     DB      "¿ù»~ªºBMP¹ÏÀÉ¡A©ÎµLªk¶}±ÒBMP¹ÏÀÉ"
;*****************************************************************************************
.DATA
hInstance       DQ      ?       ;¼Ò²Õ¥N½X
hwnd            HWND    ?       ;µøµ¡¥N½X
hBitmap         HBITMAP ?       ;¦ì¤¸¹Ï¥N½X
bitmap          BITMAP  <>      ;¦ì¤¸¹Ïªº¸ê®Æ
rcClient        RECT    <0,0,?> ;¤u§@°Ï¯x§Î½d³ò
pszFileName     LPSTR   ?       ;©R¥O¦C¤¤¨Ï¥ÎªÌ¿é¤JªºBMPÀɦW¦ì§}
;*****************************************************************************************
.CODE
;-----------------------------------------------------------------------------------------
;get_1st°Æµ{¦¡¥Î¨Ó·j´M©R¥O¦C¦r¦ê¤¤²Ä¤@­Ó°Ñ¼Æªº¦ì§}
;¿é¤J¡GpszCmdLine¡Ð©R¥O¦C¦r¦êªº¦ì§}
;¿é¥X¡GRAX¡Ð­Y§ä¨ì²Ä¤@­Ó°Ñ¼Æ¡ARAX¡×²Ä¤@­Ó°Ñ¼Æ¦ì§}
;¡@¡@¡@   ¡@­Y¨S§ä°Ñ¼Æ¡ARAX¡×0
get_1st PROC    USES rdi pszCmdLine:QWORD
        invoke  lstrlen,pszCmdLine
        mov     rdi,pszCmdLine
        mov     rcx,rax ;RCX¡×©R¥O¦C¦r¦êªø
        cld
        mov     al," "  ;AL¡×ªÅ¥Õ¦r¤¸
        repne   scasb   ;¦bEDI©Ò«üªº¦ì§}¤¤·j´MªÅ¥Õ¦r¤¸
        jnz     n_find  ;­Y¨S§ä¨ì¡A¸õÅD¦Ün_find:³B
        repe    scasb   ;­Y§ä¨ìªÅ¥Õ¡AÄ~Äò·j´M«DªÅ¥Õ¡A­Y¯à§ä¨ì«DªÅ¥Õ³o´N¬O²Ä¤@­Ó°Ñ¼Æ
        jz      n_find
        dec     rdi
        mov     rax,rdi ;­Y§ä¨ì²Ä¤@­Ó°Ñ¼Æ¡ARAX¡×²Ä¤@­Ó°Ñ¼Æ¦ì§}
        jmp     exit
n_find: xor     rax,rax ;¨S§ä¨ì°Ñ¼Æ
exit:   ret
get_1st ENDP
;-----------------------------------------------------------------------------------------
WndProc PROC    hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
        LOCAL   ps:PAINTSTRUCT,hdcMem:HDC
.switch uMsg
  .case WM_PAINT
        invoke  BeginPaint,hWnd,ADDR ps
        invoke  CreateCompatibleDC,ps.hdc
        mov     hdcMem,rax
    ;§â¨Ï¥ÎªÌ¿é¤JªºBMP¹Ï¤ùÀÉø»s©ó°O¾ÐÅé¸Ë¸m¤º®e¤¤
        invoke  SelectObject,hdcMem,hBitmap
    ;§âBMP¹Ï¤ùÀɦWºÙø»s©ó°O¾ÐÅé¸Ë¸m¤º®e¤¤
        invoke  SetBkMode,hdcMem,TRANSPARENT
        invoke  DrawText,hdcMem,pszFileName,-1,OFFSET rcClient,\
                DT_SINGLELINE or DT_CENTER or DT_VCENTER
    ;§âBMP¹Ï¤ùÀÉ»PBMP¹Ï¤ùÀɦWºÙ¶Ç¿é¦Üµøµ¡¤u§@°Ï¸Ë¸m¤º®e
        invoke  BitBlt,ps.hdc,0,0,bitmap.bmWidth,bitmap.bmHeight,hdcMem,0,0,SRCCOPY
        invoke  DeleteDC,hdcMem
        invoke  EndPaint,hWnd,ADDR ps

  .case WM_DESTROY
        invoke  DeleteObject,hBitmap
        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,rect:RECT,cbOutput:QWORD
          ⁝
        mov     wc.lpszClassName,rdx
        invoke  RegisterClassEx,ADDR wc
    ;Àò±o©R¥O¦C¦r¦ê¡A¨Ã±q¤¤Àò¨ú°Ñ¼Æ¡A¦¹°Ñ¼ÆÀ³¸Ó¬O BMP ¹Ï¤ùÀɪº¦WºÙ
        call    GetCommandLine
        invoke  get_1st,rax     ;Àò±o²Ä¤@­Ó°Ñ¼Æªº¦ì§}
        or      rax,rax         ;­YRAX¡×0¡AÀò±o°Ñ¼Æ¥¢±Ñ
        jz      fail
        mov     pszFileName,rax ;­YRAX¤£¬°¹s¡ARAX¡×²Ä¤@­Ó°Ñ¼Æ¦ì§}
    ;¸ü¤J¦ì¤¸¹Ï¡A¥HÀò±o¦ì¤¸¹Ïªº¼e«×»P°ª«×
        invoke  LoadImage,0,rax,IMAGE_BITMAP,0,0,LR_LOADFROMFILE
        or      rax,rax
        jz      fail
        mov     hBitmap,rax
        invoke  GetObject,hBitmap,SIZEOF BITMAP,OFFSET bitmap
        mov     r10d,bitmap.bmWidth     ;R10D¡×¦ì¤¸¹Ï¼e«×
        mov     r11d,bitmap.bmHeight    ;R11D¡×¦ì¤¸¹Ï°ª«×
        mov     rcClient.right,r10d
        mov     rcClient.bottom,r11d
    ;­pºâ¯à®e¯Ç¾ã±i¦ì¤¸¹Ïªºµøµ¡»Ý­n³Ì¤p¼e«×»P°ª«×
        mov     rect.left,0
        mov     rect.top,0
        mov     rect.right,r10d
        mov     rect.bottom,r11d
        invoke  AdjustWindowRect,ADDR rect,WS_CAPTION or WS_SYSMENU,0
        mov     r10d,rect.right
        mov     r11d,rect.bottom
        sub     r10d,rect.left          ;R10D¡×­pºâ§¹¦¨«áªºµøµ¡¼e«×
        sub     r11d,rect.top           ;R11D¡×­pºâ§¹¦¨«áªºµøµ¡°ª«×
    ;«Ø¥ß¤u§@°Ï«ê¦n¯à®e¯Ç¾ã±i¦ì¤¸¹Ïªºµøµ¡
        invoke  CreateWindowEx,0,ADDR szClassName,ADDR szAppName,WS_CAPTION or\
                WS_SYSMENU,50,50,r10d,r11d,0,0,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
exit:   invoke  ExitProcess,0
    ;¦pªG¨Ï¥ÎªÌ¨S¿é¤J°Ñ¼Æ©Î¸ü¤JBMP¹Ï¤ùÀÉ¿ù»~¡A©ó©R¥O´£¥Ü¦r¤¸¦L¥X¿ù»~°T®§¡AµM«á°h¥Xµ{¦¡
fail:   invoke  GetStdHandle,STD_OUTPUT_HANDLE
        invoke  WriteConsole,rax,OFFSET sNotFindBmp,SIZEOF sNotFindBmp,ADDR cbOutput,0
        jmp     exit
main    ENDP
;*****************************************************************************************
END     main

²ÕĶ¡B³sµ² VIEWBMP2 ªº¤èªk»P«e­±¤£¤Ó¤@¼Ë¡A¶i¤J©R¥O´£¥Ü¦r¤¸¤§«á¡A¹Lµ{¦p¤U¡A¶À¦â¦r¬O­n¿é¤Jªº«ü¥O¡G

Microsoft Windows [ª©¥» 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\wanker>set include=c:\uasm\include [Enter]

C:\Users\wanker>set lib=c:\uasm\lib64 [Enter]

C:\Users\wanker>e: [Enter]

E:\>cd e:\HomePage\SOURCE\Win64\VIEWBMP [Enter]

e:\HomePage\SOURCE\Win64\VIEWBMP>set path=c:\uasm;c:\uasm\bin64;%path% [Enter]

e:\HomePage\SOURCE\Win64\VIEWBMP>uasm64 -win64 viewbmp2.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.

VIEWBMP2.ASM: 144 lines, 3 passes, 161 ms, 0 warnings, 0 errors

e:\HomePage\SOURCE\Win64\VIEWBMP>rc viewbmp2.rc [Enter]
Microsoft (R) Windows (R) Resource Compiler Version 10.0.10011.16384
Copyright (C) Microsoft Corporation.  All rights reserved.


e:\HomePage\SOURCE\Win64\VIEWBMP>link /subsystem:console viewbmp2.obj viewbmp2.res [Enter] ¡÷³sµ²
Microsoft (R) Incremental Linker Version 14.25.28614.0
Copyright (C) Microsoft Corporation.  All rights reserved.


e:\HomePage\SOURCE\Win64\VIEWBMP>

ª`·N¨ì¤W­±³Ì«á¤@­Ó¨BÆJ¡A³sµ²¡C¥²¶·¨Ï¥Î LINK.EXE ªº¡u/subsystem:console¡v¿ï¶µ¡]¤j¤p¼g¤£©ë¡^¡A³o¬O¦]¬°¦pªG¨Ï¥ÎªÌ¨S¿é¤J°Ñ¼Æ©ÎªÌ¸ü¤JBMP¹Ï¤ùÀÉ¿ù»~¡AVIEWBMP2 ·|¦b©R¥O´£¥Ü¦r¤¸¤¤Åã¥Ü¿ù»~°T®§¡C°²¦p¨S¦³«e­zªº¡u/subsystem:console¡v¿ï¶µ¡A´NµLªk¨ú±o¼Ð·Ç¿é¥X¸Ë¸m¡AµLªk±N¿ù»~°T®§Åã¥Ü©ó©R¥O´£¥Ü¦r¤¸¤¤¡C

¸Ñ»¡ VIEWBMP2

VIEWBMP2 »P VIEWBMP1 ®t¤£¦h¡A¥D­n¤£¦Pªº¦a¤è¦³¡G

①¡G²Ä 99¡ã104 ¦æ¡A©I¥s GetCommandLine ¨ú±o©R¥O¦C¦r¦ê¡A¨Ã©I¥s get_1st ¥Ñ¨ä¤¤Â^¨ú¥X BMP ¹Ï¤ùÀɦWºÙ¡AµM«á±N¨ä¦ì§}¦s¤J pszFileName ÅܼÆùØ¡C¦Ò¼{¨ì¨Ï¥ÎªÌ¦³¥i¯à¿é¤J¿ù»~¡A©Ò¥H©I¥s get_1st §¹¤§«á¥²¶·Àˬd¬O§_¦³µo¥Í¿ù»~¡C

②¡G²Ä 105¡ã108 ¦æ¡A©I¥s LoadImage ¦Ó¤£¬O©I¥s LoadBitmap¡A¦]¬°¥u¦³«eªÌ¯àŪ¨ú BMP ¹Ï¤ùÀÉ¡A¦Ó«áªÌ¥u¯à¸ü¤J¸ê·½¤¤ªº¦ì¤¸¹Ï¡C·íµM¡AVIEWBMP2 ©I¥s LoadImage ®É¿é¤Jªº BMP ÀɦW¬O¨Ï¥ÎªÌ¿é¤Jªº¡A¬°¥H¨¾¿é¤J¿ù»~¦Ó·í±¼¡A©Ò¥H¤]­nÀˬd LoadImage ¬O§_¯uªº¯à¥¿±`¸ü¤J¡A¦pªG¦³¿ù»~¡A´N±o³B²z¡C

③¡G²Ä 138¡ã141 ¦æ¡A¤£½×¬O get_1st ÁÙ¬O LoadImage ²£¥Íªº¿ù»~¡A³£·|¨Ó¨ì¦¹³B³B²z¡C³B²z¤è¦¡«Ü²³æ¡A´N¥u¬O¦L¥X¿ù»~°T®§¡A¨Ã²×¤î VIEWBMP2¡C

④¡G²Ä 58¡ã59 ¦æ¡A¤£¦A¦L¥X¡uEVE - ¼C¬Pªº¤k¥D¨¤¡v¡A¦Ó¬O¦L¥X BMP ¹Ï¤ùÀɪºÀɦW¡C

¨ä¥Lªº¦a¤è³£»P VIEWBMP1 ¬Û¦P¡A´N¤£¦h»¡¤F¡C±µ¤U¨Ó¬Ý¥»³¹³Ì«á¤@­Ó¨Ò¤l¡C


¨Ò¤l¡GVIEWBMP3

¥»³¹ªº²Ä¤T­Ó¨Ò¤l¬O VIEWBMP3¡A¥¦¸ò VIEWBMP2 Ãþ¦ü¡A®t§O¦b©ó§Q¥Î BitBlt ªº dwRop ¥H¤Î Polygon ªº¯S©Ê°µ¥X¬Û®Ø®ÄªG¡C¨Ò¦p¨Ï¥ÎªÌ¦b©R¥O´£¥Ü¦r¤¸¤¤¿é¤J¡uviewbmp3 stellar_blade.bmp¡v¡Aµ²ªG¥X²{¤U­±µøµ¡¡G

¥i¥H¬Ý¨£­ì¨Ó stellar_blade.bmp ªºÃä½t¤w¸g³Q¥Õ¦âªº®Ø®Ø¨ú¥N¡A³o´N¬O¤p¤ì°¸©Ò¿×ªº¬Û®Ø®ÄªG¡C¨ÌºD¨Ò¥ý¤¶²Ð VIEWBMP3 ·|¥Î¨ìªº x86 «ü¥O»P Win64 API¡C

x86 «ü¥O¡GSTOSB¡BSTOSW¡BSTOSD¡BSTOSQ

³o¥|­Ó«ü¥O«ÜÃþ¦ü¡A¥ý¤¶²Ð STOSB¡AÁA¸Ñ¤F¤§«á¡A¨ä¥L¤T­Ó´N«Ü®e©ö¤F¡C

STOSB «ü¥O

STOSB ªº¥Îªk¬O¡G

STOSB

STOSB ¬O store string byte¡A½¦¨¤¤¤å¬O§â¸ê®Æ¦s¤J°O¾ÐÅ餺¡F§ó¥J²Ó¦a»¡¡A¬O§â AL ¤ºªº¸ê®Æ¦s¤J RDI ©Ò«üªº°O¾ÐÅ餺¡A¦P®É¨Ì¾Ú¤è¦VºX¼Ð¨Ï RDI ¼W©Î´î¤@¡C¦pªG¤è¦VºX¼Ð¤w³]©w¡A¤]´N¬O¤è¦VºX¼Ð¤§­È¬°¤@¡A¨º»ò RDI ´î¤@¡F¦pªG¤è¦VºX¼Ð¤w²M°£¡A¤]´N¬O¤è¦VºX¼Ð¤§­È¬°¹s¡A¨º»ò RDI ¼W¤@¡Cªþ±a¤@´£¡ARCX ¤§­È¤£·|§ïÅÜ¡C

REP STOSB ªº¥Îªk

STOSB ¥i¥H·f°t REP «ü¥O¨Ï STOSB ­«½Æ°õ¦æ¦h¦¸¡A­«½Æ¦¸¼Æ©ñ¦b RCX¡A¦p¤U­±ªºµ{¦¡¡G

REP     STOSB

³o®É CPU ·|¥ýÀˬd RCX ¬O§_¬°¹s¡A¦pªG¬°¹s¡A¨º»ò CPU ¤°»ò³£¨S°µª½±µ¸õ¦Ü¤U¤@¹D«ü¥O¡F¦pªG¤£¬°¹s¡A¨C°õ¦æ¤@¦¸¡ARCX ´N·|´î¤@¨Ã¨Ì¾Ú¤è¦VºX¼Ð¨Ï RDI ¼W´î¤@ª½¦Ü RCX Åܬ°¹s¬°¤î¡A¦Ü©ó RDI ¬O¼WÁÙ¬O´î¸ò«e­z¤@¼Ë´N¤£¦h»¡¤F¡C³o¼Ëªº«ü¥O·|¨Ï¤@¶ôªø«×¬° RCX ­Ó¦ì¤¸²Õªº°O¾ÐÅ餺®e¡A³£Åܱo¸ò AL ¬Û¦P¡A³q±`¥Î©ó­n²M°£¤@¶ô°O¾ÐÅ骺®É­Ô¡C

STOSW¡BSTOSD¡BSTOSQ «ü¥O

¬Ý¨ì STOSW¡BSTOSD¡BSTOSQ ªº³Ì«á¤@­Ó¦r¥À¡A´NÀ³¸Ó¥i¥H²q±o¥X¨Ó¡A³o¤T­Ó«ü¥O¨Ì¦¸¬O§â AX¡BEAX¡BRAX ¤§­È¡A¦s¤J RDI ©Ò«üªº¦ì§}¡AµM«á®Ú¾Ú¤è¦VºX¼Ð¨Ï RDI ¼W©Î´î¤G¡B¥|¡B¤K¡C¦P¼Ë³o¤T­Ó«ü¥O¡A¤]¯à·f°t REP «ü¥O¨Ï¥Î¡A¨Ï¤§­«½ÆÅý²Ö¥[¾¹¦s¤J°O¾ÐÅ餤¡A­«½Æ¦¸¼Æ¦s©ó RCX ¤¤¡A³o®É­Ô CPU ·|¥ýÀˬd RCX ¬O§_¬°¹s¡A¸ò REP STOSB ¤@¼Ë¡A´N¤£¦AÂØ­z¡C

Polygon API

Polygon ¬O¥Î©óø»s¦hÃä§Î¡A¥H·í«eµeµ§µe¥XÃä½u¡A¥H·í«eµe¨ê¶ñº¡¤º³¡¡CPolygon ªº­ì«¬¬O¡G

invoke  Polygon,\
        hdc,\           ; handle to DC
        lpPoints,\      ; polygon vertices
        nCount          ; count of polygon vertices

Polygon ªº¦U°Ñ¼Æ»¡©ú¦p¤U¡G

Polygon ·|¨Ì¾Ú lpPoints ©Ò«üªº¦ì§}§ä¨ì¥Ñ¦hÃä§Î³»ÂI©Ò²Õ¦¨ªº°}¦C¡AµM«á¥Ñ°}¦C¤¤ªº²Ä¹s­Ó¤¸¯À¶}©l¡A¥H·í«eµeµ§µeµe¥X¨ì²Ä¤@­Ó¤¸¯Àªº½u¬q¡A¦Aµe¥X¨ì²Ä¤G­Ó¤¸¯Àªº½u¬q¡K¡Kª½¦Ü³Ì«á¤@­Ó¤¸¯À¬°¤î¡APolygon ÁÙ¯à¦Û°Ê§â³Ì«á¤@­Ó¤¸¯À»P²Ä¹s­Ó¤¸¯À³s°_¨Ó¡A¨Ï¨ä¦¨«Ê³¬¦hÃä§Î¡A³Ì«á¦A¥H·í«eµe¨ê±N¨ä¤º³¡¶ñº¡¡C

Polygon ¨Ã¤£·|¨Ï¥Î·í«e¹³¯À¡A¤]¤£·|§ïÅÜ·í«e¹³¯À¡C¦pªG°}¦C¤¤ªº¤¸¯À¤ñ nCount ¦h¡A¨º»ò¦h¥X¨Óªº·|³Q©¿²¤±¼¡C¦pªG Polygon °õ¦æ¦¨¥\¡A¦^¶Ç­È¬°¤@¡F¦pªG°õ¦æ¥¢±Ñ¡A¦^¶Ç­È¬°¹s¡C

©³¤Uªº¨Ò¤l¬O¥H¨â­Ó¹³¯À¼eªº¶À¦âµeµ§¡A¤Î¬õ¦âµe¨êµe¥X¨Óªº¡Aµ{¦¡½X¦p¤U¡A¦ý¨ä¤¤µeµ§»Pµe¨êªºµ{¦¡½X¨S¦C¥X¨Ó¡A©Ò±oµ²ªG¦p¤U­±¥ª¹Ï¡C¹Ï¤¤ªº®y¼Ð¹ê»Ú¤W¤£·|¼Ð¥Ü¥X¨Ó¡A³oùØ¥u¬O¬°¤FÀ°ÅªªÌÁA¸Ñ¤~³o¼Ë°µ¡C

array   POINT   <50,0>,<0,87>,<50,174>,<150,174>,<200,87>,<150,0>
invoke  Polygon,hdc,OFFSET array,6

¦pªG¤£¤p¤ß§â²Ä¤@­Ó¤¸¯À»P²Ä¤G­Ó¤¸¯À¤¬´«¤F¡Aµ{¦¡½X¦p¤U¡Aµ²ªGÅܦ¨¤W­±¥k¹Ï¡C

array   POINT   <50,0>,<50,174>,<0,87>,<150,174>,<200,87>,<150,0>
invoke  Polygon,hdc,OFFSET array,6

¬Û®Ø®ÄªG

¨ä¹ê»s§@¬Û®Ø®ÄªG¨Ã¤£Ãø¡AÃöÁä¬O§Q¥ÎÅÞ¿è¹Bºâ¤§¤@ªº¡u©Î¹Bºâ¡v¡A´N¬O OR ¹Bºâ¡COR ¹Bºâ¦³¨â­Ó¯S©Ê¡G①¥ô¦ó¼Æ­È»P¹s¶i¦æ OR ¹Bºâ¡Aµ²ªGÁÙ¬O­ì¼Æ­È¡F②¥ô¦ó¼Æ­È»Pµ¥¦ì¤¸¼Æªº 1 ªº¶i¦æ OR ¹Bºâ¡Aµ²ªG¬°µ¥¦ì¤¸¼Æªº 1¡C①«Ü®e©ö²z¸Ñ¡A¨Ò¦p 36H¡]36H µ¥©ó¤Q¶i¦ìªº 54¡^ »P 0 ¶i¦æ OR ¹Bºâ¡A36H ´«¦¨¤G¶i¦ì¬O 0011 0110¡A¨£¤U­±¹Ï¥ª¡AµM«á¨C¤@¦ì¤¸¹ï¬Û¦P¦ì¸mªº¦ì¤¸§@ OR ¹Bºâ¡A±o¨ìªºÁÙ¬O 0011 0110¡A¤]´N¬O 36H¡C ②36H ´«ºâ¦¨¤G¶i¦ì¥u»Ý¤@­Ó¦ì¤¸²Õªí¥Ü¡A¤]´N¬O»Ý­n¤K­Ó¦ì¤¸ªí¥Ü¡C©Ò¿×µ¥¦ì¤¸¼Æªº¤@¡A·N«ä¬O»¡ 36H »P³o¤K­Ó¦ì¤¸³£¬O¤@ªº¤G¶i¦ì¼Æ§@ OR ¹Bºâ¡C¦¹¤G¶i¦ì¼Æ´«ºâ¦¨¤Q¶i¦ì´N¬O 255¡A¤Q¤»¶i¦ì¬O 0FFH¡A¨£¤W¹Ï¥kÃä¡C36H ©M 0FFH ¶i¦æ OR ¹Bºâ¡Aµ²ªG¬O 0FFH¡C

ÁA¸Ñ¤F OR ³o¨â­Ó¯S©Ê¤§«á¡AÁÙ±oª¾¹D BMP ¹Ï¤ùÀɤ¤ªºÃC¦â¬O¥H¥úªº¤T­ì¦â¡A¤]´N¬O¬õ¡Bºñ¡BÂŪí¥Ü¡C°²¦p¬Y­Ó BMP ¹Ï¤ùÀɬO¯u±mªº¦ì¤¸¹Ï¡A¨º»ò¤@­Ó¹³¯À»Ý­n¤T­Ó¦ì¤¸²Õªí¥Ü¡A³o¤T­Ó¦ì¤¸²Õ¦ì§}¥Ñ§C¦Ó°ª¤À§O¥Nªí¬õ¡Bºñ¡BÂÅ¡C°²³]¬Y­Ó¹³¯À¬O¶Â¦â¡A¨º»ò¦¹¹³¯À¤W¿Ã¥ú¹õ¨Ã¤£µo¥X¥ô¦ó¥ú½u¡A¦]¦¹³o¤T­Ó¦ì¤¸²Õ§¡¬° 0¡F°²³]¬Y­Ó¹³¯À¬O¥Õ¦â¡A¥Nªí¿Ã¥ú¹õ¤W¸Ó¹³¯Àµo¥Xµ¥¶qªº¬õ¡Bºñ¡BÂŤT¦â¥ú¡A³o¤T­Ó¦ì¤¸²Õ³£¬O 0FFH¡C¦Ó¤@´T¯u±mªº¦ì¤¸¹Ï¡A´N¬O¥Ñ¦UºØÃC¦âªº³\¦h¹³¯Àºc¦¨¡C

¥Ñ«e­z»¡©ú¥i¥H±À·Q¡A³o¨Ç¤£¦P¼Æ­Èªº¹³¯À»P¹s¶i¦æ OR ¹Bºâ¡Aµ²ªGÁÙ¬O¸Ó¹³¯ÀªºÃC¦â¡F­Y»P 0FFH §@ OR ¹Bºâ¡A©Ò±o¬° 0FFH¡A¤]´N¬O¥Õ¦â¡C©Ò¥H­n¹F¨ì¤KÃä§Î¬Û®Øªº®ÄªG¡A´N¦bµøµ¡¤u§@°Ïªº¸Ë¸m¤º®e©I¥s Polygon ´N¯àµe¥X¤KÃä§Î¡A¦Ó¥B¤º³¡¬°¶Â¦â¡A¥~³¡¬O¥Õ¦â¡C¤º³¡¥Î¶Â¦â¡A¥i¥H¥ý«Ø¥ß¶Â¦âµe¨ê¡A¦A¥H SelectObject ¿ï¾Ü¦¹µe¨ê¡C¦Ó¤KÃä§Î¥~³¡¬°¥Õ¦â¡A³o§ó®e©ö¡A¦]¬°·íµøµ¡«Ø¥ß®É¡A¹w³]­Èªº¤u§@°Ï¸Ë¸m¤º®e´N¬O¥Õ¦â¡A©Ò¥H¤°»ò³£¤£¥²°µ¡A¤KÃä§Î¥~³¡´N¬O¥Õ¦âªº¡C

VIEWBMP3.ASM ¤º®e¨Ã¸Ñ»¡

VIEWBMP3 »Ý­n¤T­ÓÀɮסGVIEWBMP3.ASM¡BVIEWBMP3.RC¡Beye.ico¡A¥i¥H¨ì³oùؤU¸ü¡A³oùضȦC¥X VIEWBMP3.ASM ¤¤­«­nªº³¡¤À¡C

VIEWBMP3.ASM ªº²Ä 11 ¦æ¡A«Å§i¤F wdt ¬°¬Û®ØÃä®Øªº¼e«×¡A¦pªG¥H«á­n­×§ï¬Û®ØÃä®Ø¼e«×¡A´N¥u»Ý­n­×§ï¦¹­È§Y¥i¡C²Ä 25 ¦æ©w¸q¤F aryPt °}¦C¡A¤º¦³¤K­Ó¸ê®ÆÃþ«¬¬° POINT ªº¤¸¯À¡A¥Nªí¤F¤KÃä§Îªº¤K­Ó³»ÂI¡C¦Ó¨ä¤¤ªº²Ä¹s¡B²Ä¤@­Ó¤¸¯À¥u»P¬Û®ØÃä®Ø¼e«×¦³Ãö¡A¦]¦¹¥i¥Hª½±µ¼g¥X¨Ó¡F¦ý¨ä¥L¤»­Ó¤¸¯À¡A»P BMP ¹Ï¤ùªº¼e«×¡B°ª«×¦³Ãö¡A¥²¶·¥Ñ­pºâ±o¨ì¡C­pºâ¤u§@¥Ñ°Æµ{¦¡ set_pt ­t³d¡C

¤U¹Ï¬O²Ä 102 ¦æ°õ¦æ¡uinvoke Polygon,ps.hdc,OFFSET aryPt,8¡vªºµ²ªG¡A¦ý³o¹Ï®×¨Ã¤£Åã¥Ü¦b¤u§@°Ï¤W¡A³o¬O¦]¬°±µ¤U¨Óªº´X¦æ«ü¥O·|©I¥s BitBlt ±N¤u§@°Ïªº¸Ë¸m¤º®eÂмg¡C²{¦b¨Ó¬Ý¬Ý set_pt ¦p¦ó­pºâ¥X Polygon ©Ò»Ýªº³»ÂI®y¼Ð¡C²Ä 31¡ã34 ¦æ¡A³]©w R10D¡BR11D ¬° BMP ¹Ï¤ùªº¼e«×»P°ª«×¡A¤]³]©w¤F RDI ¬°²Ä¤G­Ó³»ÂI®y¼Ðªº¦ì§}¡C²Ä 34 ¦æªº TYPE ¬O­pºâ¸ê®ÆÃþ«¬ªºªø«×¡A¨£²Ä¤T³¹¡A©Ò¥H TYPE POINT ªºµ²ªG¬O 8¡C«e­±´£¹L¡A²Ä¹s¡B²Ä¤@­Ó¤¸¯À¤w¸g¦b²Ä 25 ¦æ©w¸q¹L¤F¡A©Ò¥H±q²Ä¤G­Ó¤¸¯À¶}©l¡A³o´N¬O¡u2*(TYPE POINT)¡vªº¨Ó¥Ñ¡C

±µ¤U¨Óªº²Ä 35¡ã71 ¦æ´N¬O­pºâ¤»­Ó³»ÂIªº X ®y¼Ð¤Î Y ®y¼Ð¡A³£¬O¥ý§â EAX ·í°µ°ò·Ç¡A­pºâ§¹«á¥H STOSD «ü¥O±N EAX ¦s¤J aryPt °}¦C¾A·íªº¦ì§}¡C³oùاQ¥Î STOSD ªº¯S©Ê¡A¨C¦¸¦s¤J«á EDI ·|¦Û°Ê¥[¥|¦Ó«ü¦V¤U¤@­Ó¦ì§}¡C

1
2
⁝ 
10
11
12
⁝ 
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
⁝ 
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
⁝ 
192
193
;©ó©R¥O´£¥Ü¦r¤¸¤¤¿é¤J¡uVIEWBMP2 filename¡v¡A¨ä¤¤ªºfilename¬OBMT¹Ï¤ùÀÉ¡A´N¯àÅã¥Ü©ó¿Ã¹õ¤W¡A
;¥B¨ã¦³¬Û®Ø®ÄªG
          ⁝

wdt             EQU     20      ;¬Û®Ø¼e«×¬°20¹³¯À
;*****************************************************************************************
⁝ 
hBrush          HBRUSH  ?       ;¶Â¦âµe¨ê¥N½X
aryPt           POINT   <wdt,2*wdt>,<2*wdt,wdt>,4 DUP(<?>),<2*wdt,?>,<wdt,?>
;*****************************************************************************************
.CODE
;-----------------------------------------------------------------------------------------
;³]©w¤KÃä§Î¬Û®Øªº³»ÂI®y¼Ð¡A²Ä¹s­Ó¥H¤Î²Ä¤@­Ó¤¸¯À¤w¸gª½±µ©w¸q¦n¤F¡A¬G±q²Ä¤G­Ó¤¸¯À¶}©l
set_pt  PROC    USES rdi
        lea     rdi,aryPt
        mov     r10d,bitmap.bmWidth
        mov     r11d,bitmap.bmHeight
        add     rdi,2*(TYPE POINT)
    ;aryPt°}¦Cªº²Ä¤G­Ó¤¸¯À
        mov     eax,r10d
        sub     eax,2*wdt
        stosd
        mov     eax,wdt
        stosd
    ;aryPt°}¦Cªº²Ä¤T­Ó¤¸¯À
        mov     eax,r10d
        sub     eax,wdt
        stosd
        mov     eax,2*wdt
        stosd
    ;aryPt°}¦Cªº²Ä¥|­Ó¤¸¯À
        mov     eax,r10d
        sub     eax,wdt
        stosd
        mov     eax,r11d
        sub     eax,2*wdt
        stosd
    ;aryPt°}¦Cªº²Ä¤­­Ó¤¸¯À
        mov     eax,r10d
        sub     eax,2*wdt
        stosd
        mov     eax,r11d
        sub     eax,wdt
        stosd
    ;aryPt°}¦Cªº²Ä¤»­Ó¤¸¯À
        add     rdi,4
        mov     eax,r11d
        sub     eax,wdt
        stosd
    ;aryPt°}¦Cªº²Ä¤C­Ó¤¸¯À
        add     rdi,4
        mov     eax,r11d
        sub     eax,2*wdt
        stosd
        ret
set_pt  ENDP
;-----------------------------------------------------------------------------------------
          ⁝
WndProc PROC    hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
        LOCAL   ps:PAINTSTRUCT,hdcMem:HDC
.switch uMsg
  .case WM_PAINT
        invoke  BeginPaint,hWnd,ADDR ps
    ;¦b¤u§@°Ï¸Ë¸m¤º®e¤Wµe¥X¤º³¡¬O¶Â¦â¤KÃä§Î¡B¥~³¡¬O¥Õ¦âªºÃä®Ø
        invoke  SelectObject,ps.hdc,hBrush
        invoke  Polygon,ps.hdc,OFFSET aryPt,8
        invoke  CreateCompatibleDC,ps.hdc
        mov     hdcMem,rax
    ;§â¨Ï¥ÎªÌ¿é¤JªºBMP¹Ï¤ùÀÉø»s©ó°O¾ÐÅé¸Ë¸m¤º®e¤¤
        invoke  SelectObject,hdcMem,hBitmap
    ;¨Ï¤u§@°Ï¸Ë¸m¤º®e»P°O¾ÐÅé¸Ë¸m¤º®e¶i¦æOR¹Bºâ«á¡A¼g¤J¦Ü¤u§@°Ï¸Ë¸m¤º®e
        invoke  BitBlt,ps.hdc,0,0,bitmap.bmWidth,bitmap.bmHeight,hdcMem,0,0,SRCPAINT
        invoke  DeleteDC,hdcMem
        invoke  EndPaint,hWnd,ADDR ps

  .case WM_CREATE
        invoke  CreateSolidBrush,0      ;³Ð«Ø¥ß¶Â¦âµe¨ê
        mov     hBrush,rax
        call    set_pt

          ⁝
;*****************************************************************************************
END     main

¤W­±²Ä 101¡ã102 ¦æ°õ¦æ§¹«á¡A¦b¤u§@°Ïªº¸Ë¸m¤º®eùتº¹Ï®×¡A´N¹³¤W¹Ï¤@¼Ë¡A¤@­Ó¤º³¡¬°¶Â¦âªº¤KÃä§Î¡A¤KÃä§Î¥~»Pµøµ¡Ãä®Ø¤§¶¡¬°¥Õ¦â¡C±µ¤U¨Óªº²Ä 103¡ã106 ¦æ¡A¸ò VIEWBMP2 ªº¹Lµ{¤@¼Ë¡A«Ø¥ß°O¾ÐÅé¸Ë¸m¤º®e¡B¿ï¤J BMP ¹Ï¤ùÀÉ¡C²Ä 107¡ã108 ¦æµy·L¤£¤Ó¤@¼Ëªº¬O¡A©I¥s BitBlt ®É¡A³Ì«á¤@­Ó°Ñ¼Æ¬O SRCPAINT¡A¬d¾\«eªí±oª¾¬O S or D¡A¦¹³Bªº¡u©Î¹Bºâ¡vÅý¤KÃä§Î¤º³¡¬O BMP ¹Ï¤ùÀɪº¹Ï®×¡A¥~³¡¬O¥Õ¦â¡C