¦b¹q¸£¤Wªº¹Ï¤ù¤jP¤À¦¨¨âºØ¡A¦V¶q¹Ï»PÂI°}¹Ï¡C¦V¶q¹Ï¬O«ü¹³ AutoCAD ©Ò¦sªº *.DWG ÀÉ¡A©Î¬O¹³±q«eºô»Úºô¸ô¬y¦æªº Flash¡A¥¦Ìªº¹Ï¤ù¥Dn¬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¦Ó´yz¶ê©Î¾ò¶ê¥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¦]¬°¥un¦s¤U¤Ö¶qªºÃöÁä¸ê®Æ´N¥i¥H¤F¡F¦¹¥~´N¬O¡A©ñ¤jÁY¤p³£¤£·|¥¢¯u¡C
¦ý¬On¦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§@°Ï¤º¡CnÅã¥Üªº¬O stellar_blade.bmp ÀÉ¡A¤Ø¤o¬° 640¡Ñ360¡A¦û¾Ú 691254 ¦ì¤¸²Õ¡A¹Ï¤ùªº¼Ë¤l¦p¤U¡Gn»¡©úªº¬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
¥ý¤¶²Ð²Ä¤@Ó¨Ò¤l¡AVIEWBMP1 ¦bµøµ¡¤¤Åã¥Ü¦ì¤¸¹Ïªºì²z¤Î¨BÆJ¡A¦P®É¤]¤¶²Ð¸ê·½´yzÀɤ¤ªº BITMAP °Ï¶ô»P³oÓ¨Ò¤l·|¨Ï¥Î¨ìªº Win64 API¡C
§â BMP ÀÉ®×Åã¥Ü¦bµøµ¡¤º¡A¦³³\¦hºØ¤èªk¡AVIEWBMP1 ±Ä¥Î¤@ºØ²³æªº¤èªk¡C¦b²Ä¤K³¹´¿´£¹L¡AYn¦b¤u§@°Ï¤ºÅã¥Ü¤å¦r¡B¹Ï¤ùµ¥¸ê®Æ¡A¥²¶·¹ï¸Óµøµ¡¤u§@°Ïªº¸Ë¸m¤º®e¶i¦æ¾Þ§@¡C±N¦ì¤¸¹ÏÅã¥Ü©ó¤u§@°Ï¤]¬O¦p¦¹¡A¦ýµy¦³¤@ÂI¤£¤@¼Ë¡A¨BÆJ¦p¤U¡G
¤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
¤jP¤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¤¤·Ç³Æ¦nnÅã¥Ü¦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
§ÚÌ¥i¥H¦b¸ê·½´yzÀɤ¤¡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 ¯à¦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´º©MI´ºÃ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 ¥Î©ó¾P·´¸Ë¸m¤º®e¡A¥¦¥u¦³¤@ӰѼơAhdc¡A´N¬On¾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 ·|®Ú¾Ú©Ò»Ýªº¤u§@°Ïªº¯x§Î¤j¤ppºâ©Ò»Ýªºµøµ¡¤j¤p¡AµM«á¥i¥H±Npºâ«áªºµøµ¡¤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 ¯à±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¸ê·½´yzÀɪº¦ì¤¸¹Ï¦WºÙ¬Û¦P¡C¥t¥~¡AlpBitmapName ¤]¥i¥H¬O¤p©ó 65535 ªº¥¿¾ã¼Æ¡A¥Nªí¦ì¤¸¹ÏªºÃѧO½X¡A¦pªG¬O³o¼Ëªº±¡ªp¡A¨º»ò¦b¸ê·½´yzÀɤ¤¡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 ¬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«ez¬Û¦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 |
BLACKNESS | 42H | ¨Ï¥Øªº¯x§Î¶ñº¡¶Â¦â | 0 |
WHITENESS | 0FF0062H | ¨Ï¥Øªº¯x§Î¶ñº¡¥Õ¦â | 1 |
SRCCOPY | 0CC0020H | ±N¨Ó·½¯x§Îªº¸ê®Æ½Æ»s¨ì¥Øªº¯x§Î | S |
NOTSRCCOPY | 330008H | ¨Ó·½¯x§Î§@«D¹Bºâ¤§«á¶ñ¤J¥Øªº¯x§Î | not S |
MERGECOPY | 0C000CAH | ¨Ó·½¯x§Î»P¥Øªº¸Ë¸m¤º®eªºµe¨ê§@¥B¹Bºâ«á¶ñ¤J¥Øªº¯x§Î | S and B |
SRCPAINT | 0EE0086H | ¨Ó·½¯x§Î»P¥Øªº¯x§Î§@¥B¹Bºâ«á¶ñ¤J¥Øªº¯x§Î | S or D |
SRCINVERT | 660046H | ¨Ó·½¯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 ³]©w©Ò«ü©wªº³]³Æ¤º®eI´º²V¦X¼Ò¦¡¡AI´º²V¦X¼Ò¦¡¥Î©ó¤å¦r¡B¥æ¿ùµe¨ê¡]hatched brushes¡^©M«D¹ê½uªºµeµ§¡CSetBkMode ªºì«¬¬O¡G
invoke SetBkMode,\ hdc,\ ; handle to DC iBkMode ; background mode
hdc ¬On³]©w³]³Æ¤º®eªº¥N½X¡AiBkMode ¬On³]©wªº¼Ò¦¡¡CiBkMode ¬O·Qn³]©wªºI´º¼Ò¦¡¡A¦³¨âºØ¿ï¾Ü¡G①TRANSPARENT¡B②OPAQUE¡C«eªÌ¬O³z©úªº¡A·N«ä«O«ù«á±ªºI´º¹Ï®×¤£ÅÜ¡F«áªÌ¬O¥H·í«eI´º¦â¶îº¡¡C¦pªG SetBkMode °õ¦æ¦¨¥\¡A¦^¶ÇȬ°ì¥ýªºI´º¼Ò¦¡¡F¦pªG°õ¦æ¥¢±Ñ¡A¦^¶ÇȬ°¹s¡C
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
¦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
mBitsPixel | ¨CÓ¹³¯À¦³¦h¤Ö¦ì¤¸ | ÃC¦â¼Æ |
1 | 1 | 2 |
4 | 4 | 16 |
8 | 8 | 256 |
24 | 24 | 16777216 |
°²³]¬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
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¸ê·½´yzÀÉ¡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>
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ªGn¨Ï¤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 ¦¨¥\¤§«á¡Apºâ©Ò±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¦ì¤¸¹Ïªº¦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
¤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¥Dn´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§_«hI´º¬°¥Õ¦â¡A¸û¤£¬üÆ[¡C
VIEWBMP1 ¤w¸Ñ»¡§¹²¦¡A³Ñ¾l¨S»¡©úªº¡A«e±¤w¸g´£¹L¡A¤£¦AÂØz¡C
¥»³¹²Ä¤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¥un¬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 ¥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·íµMn¨Ï¥Î 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
³o¥|Ó«ü¥O«ÜÃþ¦ü¡A¥ý»¡©ú SCASB¡A¦pªG¯àÁA¸Ñ¥¦¡A¥t¥~¤TÓ´N«Ü®e©öÁA¸Ñ¤F¡C
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¥[¤@¡FY¤è¦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 ªº·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 ªº·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«á¤~¬OnÅã¥Ü¦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ªÅ¥Õ¡AY¯à§ä¨ì«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
»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 ¯à°÷¥ÑÀɮשθ귽¤¤¸ü¤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
fuLoad | ¼ÆÈ | »¡©ú |
LR_DEFAULTCOLOR | 0 | ¨t²Î¹w³]È¡A¨£ cxDesired¡BcyDesired ªº»¡©ú¡C |
LR_CREATEDIBSECTION | 2000H | ·í uType ¬° IMAGE_BITMAP ®É¡ALoadImage ¶Ç¦^ DIB ¦ì¤¸¹Ï¡A¦Ó¤£¬O DDB ¦ì¤¸¹Ï¡C³o¹ï©ó¸ü¤J DIB ¦ì¤¸¹Ï«Ü¦³À°§U¡C |
LR_DEFAULTSIZE | 40H | ¨£ cxDesired¡BcyDesired ªº»¡©ú¡C |
LR_LOADFROMFILE | 10H | ¥ÑÀɮ׸ü¤J¦ì¤¸¹Ï¡B¹Ï¥Ü¡B´å¼Ð¡AlpszName ¬°¹ïÀ³ªºÀɮצWºÙ¡C |
LR_LOADMAP3DCOLORS | 1000H | ¦pªG¸ü¤J¹Ï¤ùªºÃC¦â¶W¹L 256 ¦â¡A´N¤£n¨Ï¥Î¦¹¿ï¶µ¡C¦¹¿ï¶µ¬O¬°¤F¬ð¥X 3D µøı¡A¦Ó½Õ¾ã½Õ¦â½L¤¤ÃC¦â¡A¦p¤U¡G ²`¦Ç¦â¡ARGB(128,128,128) Åܬ° COLOR_3DSHADOW¡F ¦Ç¦â¡ARGB(192,192,192) Åܬ° COLOR_3DFACE¡F ²L¦Ç¦â¡ARGB(223,223,223) Åܬ° COLOR_3DLIGHT¡C |
LR_MONOCHROME | 1 | ¥H¶Â¡B¥Õ¤è¦¡¸ü¤J¹Ï¤ù¡C |
LR_SHARED | 8000H | ¦pªG¦h¦¸©I¥s LoadImage ¸ü¤J¬Û¦P¹Ï¤ù¸ê·½¡A¦pªG fuLoad ¦³¨Ï¥Î LR_SHARED¡A«hª½±µ¨Ï¥Îì¥ýªº¹Ï¤ù¥N½X¡C¦pªG¨S³]©w LR_SHARED¡A«h·|«·s¸ü¤J¥B¶Ç¦^¤£¦Pªº¥N½X¡C¨Ï¥Î¦¹ºX¼Ð®É¡A¨t²Î·|¦b¤£¦A»Ýn¸ê·½®É¾P·´¸ê·½¡CLR_SHARED ¤£¥i¥Î©ó¨ã¦³«D¼Ð·Ç¤j¤pªº¹Ï¤ù¡B¸ü¤J¤§«á¥i¯à·|Åܧ󪺹Ϥù¡A©Î¬O±qÀɮ׸ü¤Jªº¹Ï¤ù¡C |
¥Î LoadImage ¸ü¤Jªº¦ì¤¸¹Ï¡A¤£¦A¨Ï¥Î¤§«án©I¥s DeleteObject ¾P·´¡F¸ü¤Jªº´å¼Ð¡An©I¥s DestroyCursor ¾P·´¡F¸ü¤Jªº¹Ï¥Ü¡An©I¥s DestroyIcon ¾P·´¡C¦pªG LoadImage °õ¦æ¦¨¥\¡A¦^¶ÇȬ°¹Ï§Îª«¥óªº¥N½X¡F¦pªG°õ¦æ¥¢±Ñ¡A¦^¶ÇȬ°¹s¡C
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ªÅ¥Õ¡AY¯à§ä¨ì«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¬On¿é¤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¦³«ezªº¡u/subsystem:console¡v¿ï¶µ¡A´NµLªk¨ú±o¼Ð·Ç¿é¥X¸Ë¸m¡AµLªk±N¿ù»~°T®§Åã¥Ü©ó©R¥O´£¥Ü¦r¤¸¤¤¡C
VIEWBMP2 »P VIEWBMP1 ®t¤£¦h¡A¥Dn¤£¦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
¥»³¹ªº²Ä¤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
³o¥|Ó«ü¥O«ÜÃþ¦ü¡A¥ý¤¶²Ð STOSB¡AÁA¸Ñ¤F¤§«á¡A¨ä¥L¤TÓ´N«Ü®e©ö¤F¡C
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
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´î¸ò«ez¤@¼Ë´N¤£¦h»¡¤F¡C³o¼Ëªº«ü¥O·|¨Ï¤@¶ôªø«×¬° RCX Ӧ줸²Õªº°O¾ÐÅ餺®e¡A³£Åܱo¸ò AL ¬Û¦P¡A³q±`¥Î©ón²M°£¤@¶ô°O¾ÐÅ骺®ÉÔ¡C
¬Ý¨ì 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 ¬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
¨ä¹ê»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
¥Ñ«ez»¡©ú¥i¥H±À·Q¡A³o¨Ç¤£¦P¼ÆȪº¹³¯À»P¹s¶i¦æ OR ¹Bºâ¡Aµ²ªGÁÙ¬O¸Ó¹³¯ÀªºÃC¦â¡FY»P 0FFH §@ OR ¹Bºâ¡A©Ò±o¬° 0FFH¡A¤]´N¬O¥Õ¦â¡C©Ò¥Hn¹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 »Ý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¨ì¡Cpºâ¤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 ¬Opºâ¸ê®ÆÃþ«¬ªºªø«×¡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¬Opºâ¤»Ó³»ÂIªº X ®y¼Ð¤Î Y ®y¼Ð¡A³£¬O¥ý§â EAX ·í°µ°ò·Ç¡Apºâ§¹«á¥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