Ch 05 ¨ú±o·Æ¹«°T®§

¥»³¹±N¤¶²Ð¦p¦ó³B²z·Æ¹«ªº¿é¤J°T®§¡C


­ì²z

WM_LBUTTONDOWN / WM_LBUTTONUP¡B
WM_RBUTTONDOWN / WM_RBUTTONUP¡B
WM_MBUTTONDOWN / WM_MBUTTONUP °T®§

¤@¯ë·Æ¹«¤W¦³¨â­Ó«öÁä¡A¤À§OºÙ¬°·Æ¹«¥ªÁä¥H¤Î·Æ¹«¥kÁä¡A¤]¦³¤TÁ䪺·Æ¹«¡A¤¤¶¡ªººÙ¬°·Æ¹«¤¤Áä¡C·í·Æ¹«´å¼Ð¦b¬Y­Óµøµ¡ªº¤u§@°Ï ( client area ) ®É¡A³o¨Ç«öÁä«ö¤U·|¤À§O²£¥Í WM_LBUTTONDOWN¡BWM_RBUTTONDOWN ¥H¤Î WM_MBUTTONDOWN °T®§¡F¤Ï¤§©ñ¶}®É¡A«h¤À§O²£¥Í WM_LBUTTONUP¡BWM_RBUTTONUP ¥H¤Î WM_MBUTTONUP °T®§¡C

³o¨Ç°T®§¤¤ªº lParam Äæ¦ìùس£¦s¦³³o¨Ç¨Æ¥óµo¥Í®Éªº·Æ¹«¦ì¸m¡A¨ä¤¤¸û§Cªº 16 ¦ì¤¸¬°·í®Éªº X ®y¼Ð¡A¸û°ªªº 16 ¦ì¤¸¬°·í®Éªº Y ®y¼Ð¡A¸Ó®y¼Ð¬O§âµøµ¡¤u§@°Ï¥ª¤W¨¤ªº®y¼Ð©w¬° (0,0)¡A¦Ó X ®y¼Ð¦V¥k¼W¥[¡AY ®y¼Ð¦V¤U¼W¥[ªº¤è¦¡ªí¥Ü¡C

¦Ó wParam Äæ¦ìùØ«h¦s¦³·í®ÉÁä½Lªºª¬ºA¡C°²¦p¦b«ö¤U·Æ¹«¤Wªº«öÁä®É¡A¤]¦P®É«ö¤UÁä½L¤WªºÁä¡A¨º»ò wParam ·|¦s¦³¸Ó«öÁ䪺µêÀÀÁä½X¡C°²¦p«ö¤U·Æ¹«¥ªÁä¦A«ö·Æ¹«¥kÁä¡A¨º»ò wParam ·|¦³¦s¦³ MK_RBUTTON¡C¸Ô²Óªº¼Æ­È¦p¤Uªí¡G

¼Æ­È»¡¡@©ú
MK_CONTROLÁä½L¤Wªº Ctrl Áä³Q«ö¤U
MK_LBUTTON·Æ¹«¥ªÁä³Q«ö¤U
MK_MBUTTON·Æ¹«¤¤Áä³Q«ö¤U
MK_RBUTTON·Æ¹«¥kÁä³Q«ö¤U
MK_SHIFTÁä½L¤Wªº Shift Áä³Q«ö¤U
MK_XBUTTON1²Ä¤@­Ó·Æ¹«©µ¦ùªº«öÁä³Q«ö¤U
MK_XBUTTON2²Ä¤G­Ó·Æ¹«©µ¦ùªº«öÁä³Q«ö¤U

WM_MOUSEMOVE °T®§

¥t¥~ÁÙ¦³¤@­Ó»P·Æ¹«¦³Ãöªº°T®§¡AWM_MOUSEMOVE¡CÅU¦W«ä¸q¡A³o­Ó°T®§¬O¨t²Î³qª¾µ{¦¡¡A·Æ¹«´å¼Ð¦bµøµ¡®y¼Ðªº­þ­Ó¦ì¸m¤W¡A¦¹®y¼Ð¬O¥Hµøµ¡¤u§@°Ï ( client area ) ªº¥ª¤W¨¤¬° ( 0,0 )¡C¨t²Î·|§â·Æ¹«´å¼Ðªº¬Û¹ï©ó¤u§@°Ï¥ª¤W¨¤ªº®y¼Ð©ñ¦b WM_MOUSEMOVE ªº lParam °Ñ¼Æùضǵ¹µøµ¡¡AlParam ªº¸û°ªªº 16 ¦ì¤¸¬O y ®y¼Ð¡A¸û§Cªº 16 ¦ì¤¸¬O x ®y¼Ð¡CwParam Äæ¦ì«h¦s¦³·í®Éªº«öÁ䱡§Î¡A©M WM_LBUTTONDOWN ¤@¼Ë¡C

WM_MOUSEMOVE ¦³¤@­Ó¦a¤è»P¨ä¥L·Æ¹«°T®§¤£¦P¡A¨º´N¬O§Y¨Ïµøµ¡¤£¬O¥¿¦b§@¥Î¤¤¡A¨t²Î¤]·|µo¥X WM_MOUSEMOVE °T®§µ¹À³¥Îµ{¦¡¡C´«¥y¸Ü»¡¡A¦b Windows ¨t²Î®à­±¤Wªºµøµ¡¡A¥u­n·Æ¹«´å¼Ð±qµøµ¡¤W·Æ¹L¡A¨t²Î´N·|µo¥X WM_MOUSEMOVE °T®§µ¹¸Óµøµ¡¡C

GetCursorPos API

¦ý¬O¦pªG·Æ¹«´å¼Ð¦bµøµ¡¥~¡A­n¨ú±o·Æ¹«®y¼Ð¡A´NµLªk¥Ñ WM_MOUSEMOVE °T®§¨ú±o¤F¡A³o®É¥²¶·¥Î GetCursorPos API ¨Ó¨ú±o·Æ¹«¦ì¸m¡A¨ä­ì«¬¬O

BOOL GetCursorPos(
    LPPOINT lpPoint     // address of structure for cursor position  
   );

³o­Ó API ¶È¤@­Ó°Ñ¼Æ¡A¥¦«ü¦V¤@­Ó POINT µ²ºcÅ骺¦ì§}¡A·í©I¥s GetCursorPos API ®É¡AGetCursorPos ·|§â·Æ¹«®y¼Ð¶ñ¤J¦¹µ²ºcÅé¡C¦¹µ²ºcÅ餺®e¦p¤U¡A

POINT   STRUCT
x       DWORD   ?
y       DWORD   ?
POINT   ENDS

¬JµM¦³¤F GetCursorPos¡A§Y¨Ï·Æ¹«´å¼Ð¤£¦bµøµ¡¤º¡A¤]¥i¥H¨ú±o´å¼Ð¦ì¸m¡A¦ý­n«ç¼ËIJµo³o­Ó API ©O¡H¤@¯ëªº°µªk¬O§Q¥Î SetTimer ©w®É¹ïµøµ¡µo¥X WM_TIMER °T®§¡AµM«á³B²z¦¹°T®§®É©I¥s GetCursorPos ¥H¨ú±o·Æ¹«´å¼Ð¦ì¸m¡C


­ì©lµ{¦¡¡Jµe¥X­y¸ñ

©³¤Uªº MOUSE4.ASM µ{¦¡·|¦bµøµ¡¥ªÃäÅã¥Ü¬õ¡BÂÅ¡Bºñ¤T­ÓÃäªø¬° 70 ÂIªº¥¿¤è§Î¡A¨ä§@¥Î¬Û·í©ó½Õ¦â½L¡A·í·Æ¹«´å¼Ð²¾¨ì³o¤T­Ó¥¿¤è§Î¡A¦A³æÀ»·Æ¹«¥ªÁä¥i¥H¿ï¾Ü¬õ¡Bºñ¡BÂŤT¦â¤§¥ô¤@ºØÃC¦â¡C¦bµøµ¡¥kÃä¬O¤@¶ôªÅ¥Õªº°Ï°ì¡A¬Û·í©óµe¯È¡A·í·Æ¹«²¾¨ìµøµ¡¥kÃä¡A«ö¤U·Æ¹«¥ªÁä¥i¥HÅã¥Ü¥X·Æ¹«²¾°Êªº­y¸ñ¡A¦A«ö¤@¤U¥ªÁä´N¤£Åã¥Ü­y¸ñ¡A¦n¹³¼ÒÀÀ¹]µ§¦V¤U¸IIJ¯È¥i¥Hµe¥X½u¨Ó¡A´£°_¹]µ§´NµLªkµe¥X½u¨Ó¤@¼Ë¡C¨ä­ì©lµ{¦¡¦p¤U¡J

;¥ªÃ䦳½Õ¦â½L¡A¥i¥H¥H·Æ¹«¥ªÁä¿ï¾ÜÃC¦â¡Aµe¥X­y¸ñ
        .386
        .model  flat,stdcall
        option  casemap:none
include         windows.inc
include         user32.inc
include         gdi32.inc
include         kernel32.inc
includelib      user32.lib
includelib      gdi32.lib
includelib      kernel32.lib

red             equ     0ffh
green           equ     0ff00h
blue            equ     0ff0000h
WndProc         proto   :HWND,:UINT,:WPARAM,:LPARAM

        .DATA
ClassName       db          'SimpleWinClass',0
AppName         db          '·Æ¹«­y¸ñ',0
AskExit         db          '¬O§_°h¥X¦¹µ{¦¡¡H',0
AskExitTitle    db          '¸ß°Ý',0
PenDown         db          FALSE       ;23 TRUE¡J¤Uµ§¡AFALSE¡J´£µ§
DrawPaletteOK   db          FALSE       ;24 ¬O§_¤wµe¥X¬õºñÂŤT­Ó¥¿¤è§Î½Õ¦â½L
color           dd          red         ;25 µeµ§ÃC¦â
color_id        dd          red,green,blue
hInstance       HINSTANCE   ?
hwnd            HWND        ?
CommandLine     LPSTR       ?
wc              WNDCLASSEX  <30h,?,?,0,0,?,?,?,?,0,offset ClassName,?>
msg             MSG         <?>
click_crd       POINT       <?> ;32 ³æÀ»·Æ¹«¥ªÁä®Éªº®y¼Ð¡A¤]¬O¤p¥¿¤è§Îªº¥ª¤W¨¤®y¼Ð
lw_rt_x         dd          ?   ;33 lw_rt_x »P lw_rt_y ¬O¤p¥¿¤è§Îªº¥k¤U¨¤®y¼Ð
lw_rt_y         dd          ?   

        .CODE
start:  invoke  GetModuleHandle,NULL
        mov     hInstance,eax
        invoke  GetCommandLine
        mov     wc.style,CS_HREDRAW or CS_VREDRAW
        mov     wc.lpfnWndProc,offset WndProc
        mov     eax,hInstance
        mov     wc.hInstance,eax
        mov     wc.hbrBackground,COLOR_WINDOW+1
        invoke  LoadIcon,NULL,IDI_APPLICATION
        mov     wc.hIcon,eax
        mov     wc.hIconSm,eax
        invoke  LoadCursor,NULL,IDC_ARROW
        mov     wc.hCursor,eax
        invoke  RegisterClassEx,offset wc
        invoke  CreateWindowEx,NULL,offset ClassName,offset AppName,\ 
                WS_OVERLAPPEDWINDOW,0,10,400,250,0,0,hInstance,NULL 
        mov     hwnd,eax
        invoke  ShowWindow,hwnd,SW_SHOWDEFAULT
        invoke  UpdateWindow,hwnd

.while  TRUE
        invoke  GetMessage,offset msg,NULL,0,0
.break  .if     !eax
        invoke  TranslateMessage,offset msg
        invoke  DispatchMessage,offset msg
.endw        
        mov     eax,msg.wParam
        invoke  ExitProcess,eax
;---------------------------------------
;µe¥X¦ì©óµøµ¡¥ªÃ䪺¬õ¡Bºñ¡BÂŤT­ÓÃäªø¬° 70 ªº¥¿¤è§Î½Õ¦â½L
DrawPalette     proc    hWin:HWND       ;67 DrawPalette °Æµ{¦¡¶}©l
        local   PS:PAINTSTRUCT 
        local   hdc:HDC
        local   newPen:DWORD
        local   oldPen:DWORD
        local   newBrush:HBRUSH
        local   oldBrush:HBRUSH
        local   counter:DWORD   ;74 ¦]¬°­nµe¤T­Ó¥¿¤è§Î¡J0¡Ð¬õ¦â¡A1¡Ðºñ¦â¡K

        invoke  BeginPaint,hWin,addr PS ;76 ¨ú±o DC ¥N½X
        mov     hdc,eax                 ;77 ¦s¤J DC ¥N½X
        mov     counter,0               ;78 ¥ýµe¥X¬õ¦â¥¿¤è§Î
nxt:    mov     edx,counter
        shl     edx,2
        mov     eax,color_id[edx]       ;81 ¨ú±oÃC¦â
        invoke  CreatePen,PS_SOLID,1,eax;82 «Ø¥ß·sªº¦âµ§
        mov     newPen,eax              ;83 ¦s¤J·s¦âµ§¥N½X
        invoke  SelectObject,hdc,eax    ;84 ¿ï¾Ü·s¦âµ§
        mov     oldPen,eax              ;85 «O¦s¦ⵧ¥N½X
        mov     edx,counter
        shl     edx,2
        mov     eax,color_id[edx]       ;88 ¨ú±oÃC¦â
        invoke  CreateSolidBrush,eax    ;89 «Ø¥ß·sµ§¨ê
        mov     newBrush,eax            ;90 «O¦s·sµ§¨ê¥N½X
        invoke  SelectObject,hdc,eax    ;91 ¿ï¾Ü·sµ§¨ê
        mov     oldBrush,eax            ;92 «O¦sµ§¨ê¥N½X
        mov     eax,counter             ;93 ­pºâ¥¿¤è§Î°Ï°ì½d³ò¡A
        mov     dl,70   ;94 ¸Ó¥¿¤è§Î¥ª¤W¨¤®y¼Ð¬° (0,70*counter)
        mul     dl      ;95 ¡A¥k¤U¨¤®y¼Ð¬O (69,70*counter+69)
        mov     edx,eax
        add     dx,69
        invoke  Rectangle,hdc,0,eax,69,edx      ;98 µe¥X¥¿¤è§Î¨ÃµÛ¦â
        invoke  SelectObject,hdc,oldPen         ;99 «ì´_¦ⵧ
        invoke  DeleteObject,newPen             ;100 §R°£·s¦âµ§
        invoke  SelectObject,hdc,oldBrush       ;101 «ì´_µ§¨ê
        invoke  DeleteObject,newBrush           ;102 §R°£·sµ§¨ê
        inc     counter
        cmp     counter,3
        jne     nxt
        invoke  EndPaint,hWin,addr PS
        ret
DrawPalette     endp
;---------------------------------------
;¥Ñ WM_LBUTTONDOWN¡BWM_MOUSEMOVE µ¥°T®§ªº lParam ºâ¥X x¡By ®y¼Ð¡A
;¨Ã¦s©ó click_crd µ²ºcÅé¤Î¨Ï click_crd ¤§ x¡By ®y¼Ð¦A¥[¤W 5
get_mouse       proc    crd:LPARAM
        mov     eax,crd
        mov     edx,5
        and     eax,0ffffh
        mov     click_crd.x,eax
        add     eax,edx
        mov     lw_rt_x,eax
        mov     eax,crd
        shr     eax,10h
        mov     click_crd.y,eax
        add     eax,edx
        mov     lw_rt_y,eax
        ret
get_mouse       endp
;---------------------------------------
;·íµeµ§±µÄ²¯È®É¡A¨Ì©Ò«ü©wªºÃC¦â¤Î®y¼Ð¡Aµe¥XÃäªø 5 ÂIªº¥¿¤è§Î
draw    proc    hWin:HWND
        local   hDC:HDC
        local   PS:PAINTSTRUCT
        local   newPen:DWORD
        local   oldPen:DWORD
        local   newBrush:HBRUSH
        local   oldBrush:HBRUSH

        invoke  BeginPaint,hWin,addr PS
        mov     hDC,eax
        invoke  CreatePen,PS_SOLID,1,color
        mov     newPen,eax
        invoke  SelectObject,hDC,eax
        mov     oldPen,eax
        invoke  CreateSolidBrush,color
        mov     newBrush,eax
        invoke  SelectObject,hDC,eax
        mov     oldBrush,eax
        invoke  Rectangle,hDC,click_crd.x,click_crd.y,lw_rt_x,lw_rt_y
        invoke  SelectObject,hDC,oldPen
        invoke  DeleteObject,newPen
        invoke  SelectObject,hDC,oldBrush
        invoke  DeleteObject,newBrush
        invoke  EndPaint,hWin,addr PS
        ret
draw    endp
;---------------------------------------
WndProc proc    hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.if     uMsg==WM_LBUTTONDOWN            ;156 ³æÀ»·Æ¹«¥ªÁä®É¡A
        invoke  get_mouse,lParam        ;157 ¥ýºâ¥X³æÀ»®É·Æ¹«´å¼Ð¦ì¸m
        .if     click_crd.x>69          ;158 ­Y¸Ó®y¼Ð¤§ x ®y¼Ð¤j©ó 69 ®É
                xor     PenDown,1       ;159 ¤Á´«¦âµ§¤U¸I¯È­±©Î´£°_
        .else                           ;160 §_«h
                .if     click_crd.y<70  ;161 ·Æ¹«´å¼Ð¦b½Õ¦â½L°Ï¡A¥H y ®y¼Ð
                        mov     color,red       ;162 ¬°¨Ì¾Ú¿ï¾ÜÃC¦â¡A¨Ã¦s©ó
                .elseif click_crd.y<140         ;163 color ÅܼÆùØ
                        mov     color,green
                .else
                        mov     color,blue
                .endif
        .endif

.elseif uMsg==WM_MOUSEMOVE      ;170 ²¾°Ê·Æ¹«®É
        .if     PenDown         ;171 Àˬdµeµ§¬O§_¦V¤U¸IIJ¯È¡A°²¦p¬Oªº¸Ü´N
                invoke  get_mouse,lParam        ;172 ¨ú±o²¾°Ê®É·Æ¹«ªº¦ì¸m
                .if     click_crd.x<70  ;173 Àˬd·Æ¹«¦ì¸m¬O§_¦b½Õ¦â½L°Ï
                        mov     PenDown,FALSE   ;174 ¬Oªº¸Ü¡A¨Ïµeµ§´£°_
                .else           ;175 §_ªº¸Ü¡A³]©wµL®Ä°Ï
                        invoke  InvalidateRect,hWnd,offset click_crd,TRUE
                .endif
        .endif

.elseif uMsg==WM_PAINT          ;180 ­«Ã¸®É
        .if     DrawPaletteOK   ;181 ¥ýÀˬd¬O§_¤w¸gµe¦n¬õºñÂŽզâ½L
                invoke  draw,hWnd               ;182 ¬Oªº¸Ü¡Aµe¥X­y¸ñ
        .else
                invoke  DrawPalette,hWnd        ;184 §_ªº¸Ü¡Aµe¥X½Õ¦â½L
                mov     DrawPaletteOK,TRUE      ;185 ³]©w¤w¸gµe¦n½Õ¦â½L¤F
        .endif

.elseif uMsg==WM_CLOSE
        invoke  MessageBox,hWnd,addr AskExit,\
                addr AskExitTitle,MB_YESNO or MB_ICONQUESTION
        .if     eax==IDYES
                invoke  DestroyWindow,hWnd
        .endif

.elseif uMsg==WM_DESTROY
        invoke  PostQuitMessage,NULL

.else
        invoke  DefWindowProc,hWnd,uMsg,wParam,lParam
        ret
.endif
        xor     eax,eax
        ret
WndProc endp

end     start

¦b°õ¦æ³o­Óµ{¦¡®É¡A±zµe¥Xªº­y¸ñ¥i¯à·|Â_Â_ÄòÄòªº¡A°£«D¬O±zºCºCªº²¾°Ê·Æ¹«¡A³o¨ÇÂI¤~·|¬O³sÄòªº¡A§ïµ½ªº¤èªk¥i¥H¥Îµe½u¥N´ÀµeÂI¡C¦Ü©óµe½u¥i¥Î MoveToEx API ¨Ó¹F¦¨¡C


¸Ñ»¡

¦³Ãö³o­Óµ{¦¡ªºÅÞ¿è¡A¤p¤ì°¸¤w¼g¦b­ì©lµ{¦¡ªºµù¸Ñ¤¤¡A¬G¤£¦AÂرԡA©³¤U±N¤¶²Ð¦p¦ó§ïÅÜÃC¦â¤Îø¹ÏªºÆ[©À¡C

¨Æ¹ê¤W²Ä¤T³¹¤w¸gµy·L¤¶²Ð¹L¦p¦ó¦bµøµ¡¤WÅã¥Ü¸ê®Æ¡J­º¥ý­n³]©wµL®Ä°Ï¥Hµo¥X WM_PAINT °T®§¡A·íµ{¦¡¦¬¨ì WM_PAINT¡A¥²¶·¥H BeginPaint ¤Î EndPaint ³o¨â­Ó API ¬°°_©l¤Îµ²§ô¨Óªì©l¤Æ¸Ë¸m¤º¤å¤Îµ²§ô¸Ë¸m¤º®e ( device context )¡A¦Ó§Ú­Ì­n¦p¦óø»s¹Ï§Îªºµ{¦¡½X«h§¨¦b³o¨â­Ó API ¤§¶¡¡C©³¤U±N§ó¶i¤@¨B¤¶²Ð¦p¦ó§ïÅܳo¨Ç¹Ï§Î¤Î¤å¦rªºÃC¦â¡B¼Ë¦¡µ¥µ¥¡C

¦b¸Ë¸m¤º®eùØ¡A¦³Ãö¹Ï§Î©Î¤å¦rªº¼Ë¦¡¡A«Ü¹³¯u¹ê¥@¬Éªº¹êª«¡A¨Ò¦p­nµe¤@­Ó¬õ¦âªº¯x§Î¡A¨º»ò±z¥²¶·¥ý¦³¤@­Ó¬õ¦âªºµeµ§¡AµM«á¦A¿ï¾Ü³o­Ó¬õ¦âµ§¡A·íµe§¹«á­n§â¥¦©ñ¦^­ì³B¡C©Ò¥H¡A§Ú­Ì°õ¦æªº¤è¦¡¬O¥H CreatePen «Ø¥ßµeµ§¡A¥H SelectObject ¬°¸Ë¸m¤º®e¿ï¾Üµeµ§¡A¥H DeleteObject §R°£µeµ§¡A¦A¥Î SelectObject ÁÙ­ì­ì¦âµ§¡C

CreatePen API

­ì«¬¬°¡J

HPEN CreatePen(
    int         fnPenStyle, // pen style 
    int         nWidth,     // pen width  
    COLORREF    crColor     // pen color 
   );

crColor ¬Oµeµ§ªºÃC¦â¡AnWidth ¬O«üµeµ§ªº¼e«×¡A°²¦p nWidth ¬° 0¡A¨º»ò CreatePen ·|µø¬°¤@¡A¦Ó©¿²¤¹s­È¡AfnPenStyle ¬Oµeµ§ªº¼Ë¦¡¡A±`¥Îªº¼Ë¦¡¦p¤Uªí©Ò¥Ü¡J

¼Æ­È ¼Ë¦¡ ¼Æ­È ¼Ë¦¡
PS_SOLID¹ê½u PS_DASHµê½u¡A¥Ñ³\¦hµu½u²Õ¦¨
PS_DOTÂI½u¡A¥Ñ³\¦hÂI²Õ¦¨ªº½u PS_DASHDOTµu½u¡BÂI¥æ¤¬²Õ¦¨ªº½u
PS_DASHDOTDOT¥Ñµu½u¡B¨âÂI¥æ¤¬²Õ¦¨ªº½u PS_NULL¬Ý¤£¨£ªº½u

¤Wªíªº PS_ À³¸Ó¬O«ü pen style ªº·N«ä¡A°£¤F PS_SOLID¡BPS_NULL ¥~¡A¨ä¾lªº¼Ë¦¡³£¥u¦³¦b½u¼e¬°¤@®É¥i¥¿±`Åã¥Ü¥X½u¨Ó¡CCreatePen ©I¥s¦¨¥\·|¶Ç¦^¸Ó¦âµ§ªº¥N½X¡A³]­pªÌ¥i¥H¥Î SelectObject §â¦¹¦âµ§¥N½X¿ï¤J¸Ë¸m¤º®eùØ¡A°²¦p©I¥s¥¢±Ñ·|¶Ç¦^ NULL¡C

SelectObject API

³o­Ó API ¬O§â·s«Ø¥ßªºª«¥ó¿ï¤J«ü©wªº¸Ë¸m¤º®eùØ¡A¨ú¥Nª«¥ó¡A¨ä­ì«¬¬°¡J

HGDIOBJ SelectObject(
    HDC     hdc,    // handle of device context 
    HGDIOBJ hgdiobj // handle of object  
   );

hdc ¬O«ü©wªº¸Ë¸m¤º®e¡Ahgdiobj ¬O­n³Q¿ï¤J¸Ë¸m¤º®eªº¹Ï§Îª«¥ó¥N½X¡A¥i¥H¥Îªº¹Ï§Îª«¥ó¦³¦ì¤¸¹Ï ( Bitmap )¡Bµ§¨ê ( Brush )¡B¦r«¬ ( Font )¡Bµeµ§ ( Pen )¡B½d³ò ( Region ) µ¥¡A«Ø¥ß³o¨Ç¹Ï§Îª«¥óªº¸Ô²Ó¤èªk¡A½Ð¦Û¦æ°Ñ¦Ò Win32 Programmer's Reference¡C

¦pªG¿ï¾Üªºª«¥ó¤£¬O½d³òªº¸Ü¡A©I¥s SelectObject ¦¨¥\¡A¶Ç¦^­È¬°Âªºª«¥ó¥N½X¡Aµ{¦¡¥i¥H«O¯dªº¹Ï§Îª«¥ó¥N½X¡A¥H«KÁÙ­ì¡A¦pªG¥Î¤£¨ìªº¹Ï§Îª«¥ó¥N½X¤]¥i¥H§â¥¦§R°£¡F­Y©I¥s¥¢±Ñ¡A¶Ç¦^­È¬° NULL¡C¦pªG¿ï¾Üªºª«¥ó¬O½d³òªº¸Ü¡A©I¥s¦¨¥\®É¡A¶Ç¦^­È¬° SIMPLEREGION ( ¤@­Ó¯x§Î½d³ò )¡BCOMPLEXREGION ( ¦h­Ó¯x§Î½d³ò ) ©Î¬O NULLREGION ( ªÅ½d³ò )¡F¦pªG©I¥s¥¢±Ñ¡A«h¶Ç¦^ GDI_ERROR¡C

DeleteObject API

DeleteObject ¬O¥Î¨Ó§R°£µeµ§¡Bµ§¨ê¡B¦r«¬¡B¦ì¤¸¹Ï¡B½d³ò©Î©Î½Õ¦â½L ( Palette )¡A¥H¸`¬Ù¸ê·½¡C¨ä­ì«¬¬°

BOOL DeleteObject(
    HGDIOBJ hObject     // handle to graphic object  
   );

hObject ¬O­n§R°£ªºª«¥ó¥N½X¡CDeleteObject ¦¨¥\§R°£ª«¥ó®É¡A·|¶Ç¦^«D¹s­È¡A¥¢±Ñ®É¶Ç¦^ NULL¡C

CreateSoildBrush API

CreateSoildBrush ·|«Ø¥ß¤@­Ó·sªºµ§¨ê¡A­ì«¬¬O¡J

HBRUSH CreateSolidBrush(
    COLORREF    crColor     // brush color value  
   );

crColor ¬Oµ§¨êªºÃC¦â¡A°²¦p©I¥s¦¨¥\¡A·|¶Ç¦^µ§¨ê¥N½X¡A¥¢±Ñ«h¶Ç¦^ NULL¡Cµ§¨ê¬O¥Î¨Ó§â¤@¶ô½d³ò¶î¤W«ü©wªºÃC¦â¤Î¦UºØ¤£¦Pªº¼Ë¦¡¡ACreateSolidBrush ·|«Ø¥ß¤@­Ó¶îº¡ÃC¦âªºµ§¨ê¡A¨ä¥Lªº API ¤]¥i¥H«Ø¥ß¤£¦P¼Ë¦¡ªºµ§¨ê¡A¹³ CreatePatternBrush ·|«Ø¥ß¤@­Ó¹Ï¼Ëªºµ§¨ê¡A¸Ô²Ó±¡§Î½Ð¦Û¦æ°Ñ¦Ò Win32 Programmer's Reference¡C

Rectangle API

Rectangle ·|¦b¤u§@°Ï¤Wµe¥X¤@­Ó¯x§Î¡A¯x§ÎªºÃä½u¬O«ü©wªºµeµ§µe¥X¡A¯x§Î¤º³¡¬O¥H«ü©wªºµ§¨ê¶îº¡¡C¦pªG©I¥s¦¨¥\¡A¶Ç¦^«D¹s­È¡A¥¢±Ñ¶Ç¦^ NULL¡CRectangle ªº­ì«¬¬O¡J

BOOL Rectangle(
    HDC hdc,        // handle of device context 
    int nLeftRect,  // x-coord. of bounding rectangle's upper-left corner 
    int nTopRect,   // y-coord. of bounding rectangle's upper-left corner 
    int nRightRect, // x-coord. of bounding rectangle's lower-right corner  
    int nBottomRect // y-coord. of bounding rectangle's lower-right corner  
   );

hdc ¬O¸Ë¸m¤º®e¡AnLeftRect¡BnTopRect¡BnRightRect¡BnBottomRect ¤À§O¬O¯x§Îªº¥ª¤W¨¤ X¡BY ®y¼Ð¡B¥k¤U¨¤ X¡BY ®y¼Ð¡C

¸Ñ»¡ DrawPalette °Æµ{¦¡

³o¬q°Æµ{¦¡¬Oµe¥Xµøµ¡¥ªÃ䪺¤T¶ô¬õ¡Bºñ¡BÂÅ¥¿¤è§Î¡C·í·Æ¹«²¾¨ì¦¹³B¡A«ö¤U¥ªÁä¥i¥H¿ï¾Ü¦¹¤T¦âµe¥X­y¸ñ¡A¬G¤p¤ì°¸ºÙ¬°½Õ¦â½L¡A³o¸òø¹Ïª«¥óªº½Õ¦â½L¤£¦P¡C³o­Ó°Æµ{¦¡¥u»Ý­n¦bµ{¦¡­èÅã¥Üµøµ¡®É°õ¦æ¤@¦¸´N¥i¥H¤F¡A©Ò¥H¤p¤ì°¸¦bµ{¦¡²Ä 24 ¦æ³]©w¤@­Ó DrawPaletteOK ÅܼƬ° FALSE¡A¥u¦³·í DrawPaletteOK ¬° FALSE ®É¤~°õ¦æ DrawPalette °Æµ{¦¡ ( ²Ä 181 ¦æ )¡Aµ¥ DrawPalette °Æµ{¦¡°õ¦æ§¹²¦¡A³]©w DrawPaletteOK ¬° TRUE ( ²Ä 185 ¦æ )¡A³o¼Ë DrawPalette °Æµ{¦¡´N¥u¦³¦b­èÅã¥Üµøµ¡®É°õ¦æ¤@¦¸¡C

DrawPalette ªº¥D­n¥Øªº¬Oµe¥X¤T­Ó¤£¦PÃC¦âªº¥¿¤è§Î¡A¤p¤ì°¸¦b¯ó½Z¯È¤W¥ý­pºâ¥X³o¤T­Ó¥¿¤è§ÎÃC¦â»P®y¼ÐÃö«Y¡A¦p¤Uªí¡J

ÃC¦â¥ª¤W¨¤®y¼Ð ¥k¤U¨¤®y¼Ð
¬õ(0,0)(69,69)
ºñ(0,70)(69,139)
ÂÅ(0,140)(69,209)

¥J²ÓÆ[¹î³o¨Ç®y¼Ð«á¡A±zÀ³·í·|µo²{¨ä¥¿¤è§Îªº¥ª¤W¨¤ X ®y¼Ð§¡¬° 0¡A¥k¤U¨¤ X ®y¼Ð§¡¬° 69¡A¥ª¤W¨¤ªº Y ®y¼Ð§¡¬° 70 ªº­¿¼Æ¡A­¿²v¥Ñ¹s¶}©l¡A¦Ó¥k¤U¨¤ Y ®y¼Ð§¡¬°¥ª¤W¨¤ Y ®y¼Ð¥[ 69¡C¦³¤F³o­ÓÃö«Y¤§«á¡A¤p¤ì°¸³]¤@­Ó°Ï°ìÅܼơAcounter¡A¨Óªí¥Ü²Ä´X­Ó¥¿¤è§Î¡A¦Ó¨ä¥ª¤W¨¤®y¼Ð«Ü®e©ö´N¥i¥Î ( 0, 70*counter ) ªí¥Ü¡A¥k¤U¨¤®y¼Ð¥i¥Î ( 69, 70*counter+69 ) ªí¥Ü¡C

¦Ü©óÃC¦â¡A¤p¤ì°¸¬O§Q¥Îµ{¦¡ counter ¨Ó·í°µ«ü¼Ð¡A«ü¦Vµ{¦¡²Ä 26 ¦æªº color_id ©Ò¦C¥XªºÃC¦â­È¡A¤£¹L³o­Ó«ü¼Ð¤§­È¤£¬O 0¡B1¡B2¡A¦Ó¬O 0¡B4¡B8¡A©Ò¥Hµ{¦¡²Ä 79 ¦æ¨ì²Ä 81 ¦æ§â counter ­¼¥H 4 ¦A¦s¤J EDX¡C´«¥y¸Ü»¡ EDX ¤~¬O¯u¥¿«ü¼Ð¡A¦ý EDX ¬O®Ú¾Ú counter ¤§­È¨Ó­pºâªº¡C

¦b±µ¤U¨Óªºµ{¦¡ùØ¡A´N¬O¥Î CreatePen «Ø¥ß·s¦âµ§¡A¥Î CreateSoildBrush «Ø¥ß·sµ§¨ê¡A¦A§â¥¦­Ì¤À§O¿ï¶i¸Ë¸m¤º®e¡AµM«áµe¥X¥¿¤è§Î¡AµM«áÁÙ­ì³o¨Çø¹Ïª«¥ó¡AµM«á¤S¶i¤J³B²z¤U¤@­Ó¥¿¤è§Î´`Àô¡C


­ì©lµ{¦¡¡J¨ú±o®à­±¤Wªº·Æ¹«´å¼Ð

©³¤U³o­Óµ{¦¡¡AMOUSE2.ASM¡A¯à§ì¨ú·Æ¹«´å¼Ð¦ì¸m¡A§Y¨Ï·Æ¹«¤£¦bµøµ¡¤º¡C¥t¥~¦]¬°³o­Óµøµ¡­nÅã¥Üªº¸ê°T«Ü¤Ö¡A¬G¤p¤ì°¸§â³o­Óµøµ¡³]¬°«Ü¤p¡A¦Ó¥B­­¨î§ïÅܵøµ¡ªº¤j¤p¡A¦¹¥~¡A³o­Óµ{¦¡ªº¼ÐÃDÁÙ·|ÀHµÛ·Æ¹«®y¼Ð¦ÓÅÜ¡C­ì©lµ{¦¡¬°¡J

        .386
        .MODEL  FLAT,STDCALL
        OPTION  CASEMAP:NONE
INCLUDE         WINDOWS.INC
INCLUDE         USER32.INC
INCLUDE         GDI32.INC
INCLUDE         KERNEL32.INC
INCLUDELIB      USER32.LIB
INCLUDELIB      GDI32.LIB
INCLUDELIB      KERNEL32.LIB

TimerID         EQU     74
WndProc         PROTO   :HWND,:UINT,:WPARAM,:LPARAM
crd_2_string    PROTO   :DWORD,:DWORD,:DWORD,:DWORD

;*****************************************************************************************
.CONST
ClassName       DB          'SimpleWinClass',0
szTitleFmt      DB          '(%04d,%04d)',0
szMousePosiFmt  DB          '²{¦b·Æ¹«¦b¿Ã¹õ®y¼Ð¡J',0dh,0ah,'X=%04d¡AY=%04d',0
nMouseData      EQU         $-OFFSET szMousePosiFmt
AskExit         DB          '¬O§_°h¥X¦¹µ{¦¡¡H',0
AskExitTitle    DB          '¸ß°Ý',0
;*****************************************************************************************
.DATA
AppName         DB          12 DUP (0)
szString        DB          nMouseData DUP (0)
hInstance       HINSTANCE   ?
hwnd            HWND        ?
CommandLine     LPSTR       ?
wc              WNDCLASSEX  <30h,?,?,0,0,?,?,?,?,0,OFFSET ClassName,?>
msg             MSG         
click_crd       POINT       
;*****************************************************************************************
.CODE
start:  INVOKE  GetModuleHandle,NULL
        mov     hInstance,eax
        INVOKE  GetCommandLine
        mov     wc.style,CS_HREDRAW or CS_VREDRAW
        mov     wc.lpfnWndProc,OFFSET WndProc
        mov     eax,hInstance
        mov     wc.hInstance,eax
        mov     wc.hbrBackground,COLOR_WINDOW+1
        INVOKE  LoadIcon,NULL,IDI_APPLICATION
        mov     wc.hIcon,eax
        mov     wc.hIconSm,eax
        INVOKE  LoadCursor,NULL,IDC_ARROW
        mov     wc.hCursor,eax
        INVOKE  RegisterClassEx,OFFSET wc
        INVOKE  CreateWindowEx,0,OFFSET ClassName,OFFSET AppName,WS_SYSMENU or WS_MINIMIZEBOX\
                ,0,10,210,70,0,0,hInstance,NULL                 ;051 «Ø¥ßµLÃä®Øªºµøµ¡
        mov     hwnd,eax
        INVOKE  ShowWindow,hwnd,SW_SHOWDEFAULT
        INVOKE  UpdateWindow,hwnd

.WHILE  TRUE
        INVOKE  GetMessage,OFFSET msg,NULL,0,0
.BREAK .IF !eax
        INVOKE  TranslateMessage,OFFSET msg
        INVOKE  DispatchMessage,OFFSET msg
.ENDW        
        mov     eax,msg.wParam
        INVOKE  ExitProcess,eax
;-----------------------------------------------------------------------------------------
WndProc PROC    hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
        LOCAL   ps:PAINTSTRUCT
        LOCAL   rcClient:RECT

.IF     uMsg==WM_CREATE
        INVOKE  SetTimer,hWnd,TimerID,300,NULL

.ELSEIF uMsg==WM_TIMER
        INVOKE  GetCursorPos,OFFSET click_crd                           ;073 ¨ú±o·Æ¹«¦ì¸m
        INVOKE  wsprintf,OFFSET AppName,OFFSET szTitleFmt,click_crd.x,click_crd.y
        INVOKE  SetWindowText,hWnd,OFFSET AppName                       ;075 ³]©wµøµ¡¼ÐÃDÄæ
        INVOKE  wsprintf,OFFSET szString,OFFSET szMousePosiFmt,click_crd.x,click_crd.y
        INVOKE  InvalidateRect,hWnd,NULL,TRUE

.ELSEIF uMsg==WM_PAINT
        INVOKE  BeginPaint,hWnd,ADDR ps
        INVOKE  GetClientRect,hWnd,ADDR rcClient
        INVOKE  DrawText,ps.hdc,OFFSET szString,-1,ADDR rcClient,DT_LEFT;082 Åã¥Ü·Æ¹«¦ì¸m®y¼Ð
        INVOKE  EndPaint,hWnd,ADDR ps

.ELSEIF uMsg==WM_CLOSE
        INVOKE  MessageBox,hWnd,ADDR AskExit,ADDR AskExitTitle,MB_YESNO or MB_ICONQUESTION
    .IF eax==IDYES
        INVOKE  KillTimer,hWnd,TimerID
        INVOKE  DestroyWindow,hWnd
    .ENDIF

.ELSEIF uMsg==WM_DESTROY
        INVOKE  PostQuitMessage,NULL

.ELSE
        INVOKE  DefWindowProc,hWnd,uMsg,wParam,lParam
        ret

.ENDIF
        xor     eax,eax
        ret
WndProc ENDP
;*****************************************************************************************
END     start

­­¨î§ïÅܵøµ¡¤j¤pªº¤èªk¡JdwStyle ³]©w¤£¦Pªºµøµ¡

­è¤~´£¨ì¡A³o­Óµ{¦¡·|­­¨î¨Ï¥ÎªÌ§ïÅܵøµ¡ªº¤j¤p¡A³o¬O¦]¬°¨ä¼ÐÃDÄ檺©ñ¨ì³Ì¤j³Q³]¬°µL®Ä¡A¦Ó¨S¦³³]©wµøµ¡Ãä®Ø¡A³o¬O©Mµ{¦¡²Ä 50 ¦æ CreateWindowEx API °Ñ¼Æªº dwStyle ¦³Ãö¡A±z¥i¥H°Ñ¦Ò Win32 Programmer's Reference ¤Î²Ä¤G³¹CreateWindowEx API¡A©³¤U¬Ý¬Ý´XºØ­·®æ¡C

1.°²¦p dwStyle °Ñ¼Æ¥Î WS_OVERLAPPED¡A¨º»òµøµ¡¨S¦³Ãä®Ø¡B¹Ï¥Ü¡B¨t²Î¿ï³æ¡BÁY¨ì³Ì¤p¡B©ñ¨ì³Ì¤j¡BÃö³¬µ¥¡A©Ò¥H¤£¶ÈµLªk§ïÅܵøµ¡¤j¤p¡A³sÃö³¬¦¹µ{¦¡³£±o«ö Ctrl¡ÐAlt¡ÐDel¡C¦p¥k¹Ï©Ò¥Ü¡C ¡@ WS_OVERLAPPED ­·®æ
2.°²¦p dwStyle °Ñ¼Æ¥Î WS_SYSMENU¡A¨º»òÅã¥Üªºµøµ¡·|¦³¨t²Î¿ï³æ¤ÎÃö³¬«ö¶s¡A¦ýµLÃä®Ø¡A©Ò¥H¥i¥HÃö³¬¦ýµLªk§ïÅܵøµ¡¤j¤p¡C ¡@ WS_SYSMENU ­·®æ
3.°²¦p dwStyle ¬O WS_SYSMENU or WS_MINIMIZEBOX¡A¨º»òµøµ¡·|¦³¨t²Î¿ï³æ¡BÃö³¬§á¡BÁY¨ì³Ì¤p«ö¶s¡A¦ýµLÃä®Ø¤Î³Ì¤j¤Æ«ö¶s¡C ¡@ WS_SYSMENU or WS_MINIMIZEBOX ­·®æ
4.°²¦p dwStyle ¬O WS_SIZEBOX ªº¸Ü¡A¨º»òµøµ¡·|§Î¦¨¤@­ÓÃä®Ø¡A¦ý¨S¦³¨t²Î¿ï³æ¡B³Ì¤j¤Æ¡B³Ì¤p¤Æ¡BÃö³¬«ö¶s¡A©Ò¥H¤]¥u¯à«ö Ctrl¡ÐAlt¡ÐDel µ²§ôµ{¦¡¡C¦¹¥~ WS_SIZEBOX ©M WS_THICKFRAME ªºµ²ªG¬O¤@¼Ëªº¡C ¡@ WS_SIZEBOX ­·®æ
5.°²¦p dwStyle ¬O WS_OVERLAPPEDWINDOW ªº¸Ü¡A¨º»òµøµ¡·|¦³Ãä®Ø¡B¨t²Î¿ï³æ¡B³Ì¤j¤Æ¡B³Ì¤p¤Æ¡BÃö³¬«ö¶s¡A¦p¥k¹Ï©Ò¥Ü¡CWS_OVERLAPPEDWINDOW ©M WS_TILEDWINDOW ®ÄªG¬O¤@¼Ëªº¡C ¡@ WS_TILEDWINDOW ­·®æ

SetWindowText API

SetWindowText ¥Î¨Ó§ïÅܵøµ¡ªº¼ÐÃDÄæ¡C¨ä­ì«¬¦p¤U¡J

BOOL SetWindowText(
    HWND    hWnd,       // handle of window or control
    LPCTSTR lpString    // address of string
   );

hWnd ¬O­n§ïÅܼÐÃDÄ檺µøµ¡¥N½X¡AlpString ¬O±N§ïÅܼÐÃDªº¦r¦ê¦ì§}¡A¦¹¦r¦ê¶·¥H 0 µ²§À¡C©I¥s¦¹ API «á·|¹ï§ïÅܪºµøµ¡µo¥X WM_SETTEXT °T®§¡C

wsprintf API

wsprintf ¯à°÷§â¤@¨Ç¼Æ­È¡B¦r¦ê¥H«ü©w®æ¦¡¶ñ¤J°O¾ÐÅé½w½Ä°ÏùØ¡A¥¦ªº­ì«¬¬O¡G

int wsprintf( LPTSTR lpOut,
              LPCTSTR lpFmt,
              ...
   );

lpOut ¬O«ü¦V½w½Ä°Ï¦ì§}¡Awsprintf ±N§â«ü©w®æ¦¡ªº¼Æ­È©Î¦r¦ê¶ñ¤J¦¹½w½Ä°ÏùØ¡A³Ì¤j¥u¯à¦s¤J 1024 ­Ó¦ì¤¸²Õ¡ClpFmt ¬O«ü©w®æ¦¡¤Æ¦r¦êªº¦ì§}¡A¦¹¦r¦êªº¤º®eµy«á¦A´y­z¡ClpFmt ¤§«áªº°Ñ¼Æ¬O­nÅã¥ÜªºÅܼơA³o¨ÇÅܼƪº­Ó¼Æ¨Ã¤£¤@©w¡A³o¤j·§¬O wsprintf ªº¯S¦â¡A¦b Win32 API ùØ¡A°£¤F wsprintf »P¨äÃþ¦üªº API ¤§¥~¡A¦ü¥G¨S¦³¨ä¥L API ¹³³o¼Ë°Ñ¼Æ­Ó¼Æ¬O¤£©T©wªº¡A©ÎªÌ¤p¤ì°¸©t­®¹è»D¥H­P©ó¨S¨£¹L¡C¦pªG wsprintf °õ¦æ¦¨¥\¡A«h EAX ùئs©ñªº¬O¦³¦h¤Ö¦ì¤¸²Õ³Q¶ñ¤J½w½Ä°ÏùØ¡A¦ý¤£¥]§t³Ì«áªº NULL ¦r¤¸¡F¦pªG¥¢±Ñ¡AEAX ¤§­È¤p©ó lpFmt ©Ò«ü¦r¦êªºªø«×¡C

lpFmt ¬O®æ¦¡¤Æ¦r¦ê¦ì§}¡A®æ¦¡¤Æ¦r¦ê¬O¥Î¨Ó«ü¥Ü¼Æ¦rªº®æ¦¡¡A¨Ò¦pÅã¥Ü¦h¤Ö¦ì¼Æ¡A©Î¬O¥H¤Q¶i¦ìÁÙ¬O¤Q¤»¶i¦ìªí¥Üµ¥µ¥¡A¦¹¥~®æ¦¡¤Æ¦r¦ê¤]¥i¥H¶ñ¤J¨ä¥L¤å¦r¡F¨C­ÓÅܼƪº®æ¦¡¬O¥H¡u%¡v¬°°_ÀYªº¡A¨ä»yªk¬O¡u%[-][#][0][width]type¡v¡Atype ¬O¸ê®Æ§ÎºA¡A»P¡u%¡v°t¦X«á¡A©Ò¥Nªí·N¸q¦p¤Uªí¡G

¸ê®Æ§ÎºA·N¡@¡@¸q
%d¨Ï 32 ¦ì¤¸¼Æ­È¿é¥X¦¨¤Q¶i¦ì¦³¸¹¾ã¼Æ
%u¨Ï 32 ¦ì¤¸¼Æ­È¿é¥X¦¨¤Q¶i¦ìµL¸¹¾ã¼Æ
%s¿é¥X¦r¦ê
%x¨Ï 32 ¦ì¤¸¼Æ­È¿é¥X¦¨¤Q¤»¶i¦ìµL¸¹¼Æ¡A¥H 0¡ã9¡Ba¡ãf ªü©Ô§B¼Æ¦r¤Î­^¤å¤p¼g¦r¥À¿é¥X
%X¨Ï 32 ¦ì¤¸¼Æ­È¿é¥X¦¨¤Q¤»¶i¦ìµL¸¹¼Æ¡A¥H 0¡ã9¡BA¡ãF ªü©Ô§B¼Æ¦r¤Î­^¤å¤j¼g¦r¥À¿é¥X
%i»P¡u%d¡v¬Û¦P
%I64d¨Ï 64 ¦ì¤¸¼Æ­È¿é¥X¦¨¤Q¶i¦ì¦³¸¹¾ã¼Æ
%I64x¨Ï 64 ¦ì¤¸¼Æ­È¿é¥X¦¨¤Q¤»¶i¦ìµL¸¹¼Æ¡A¥H 0¡ã9¡Ba¡ãf ¿é¥X
%I64X¨Ï 64 ¦ì¤¸¼Æ­È¿é¥X¦¨¤Q¤»¶i¦ìµL¸¹¼Æ¡A¥H 0¡ã9¡BA¡ãF ¿é¥X

¤Wªí¤¤ªº³Ì«á¤T¶µ¥u¯à¥Î¦b Windows XP ¥H«áªº¨t²Î¡Aµy«á¦A»¡©ú¡A¨ä¾lªº§¡¥i¥Î¦b Windows 9x/Me ©Î XP ¨t²Î¡C¦b¡u%¡v»P¡u¸ê®Æ§ÎºA¡v¤§¶¡ÁÙ¥i¥H´¡¤J¡uwidth¡vªí¥Ü¿é¥Xªº¼e«×¡A¡uwidth¡v¥u¯à¬O¤@­Óªü©Ô§B¼Æ¦r¡A¦pªG¡uwidth¡v¬° 8¡Aªí¥Ü¿é¥X¤K­Ó¦r¤¸ªº¼e«×¡A¤£¨¬ªº¤K­Ó¦r¤¸ªº¥HªÅ¥Õªí¥Ü¡C¦ý¬O¦pªG¦b¡uwidth¡v¤§«e¥[¤W¡u0¡v¡A«h¿é¥Xµ²ªG¤£¨¬¼e«×ªº¥H¡u0¡v¸É¨¬¡A·íµM¡u0¡v¤]¥i¥H¤£¥[¡A¤£¥[ªº¸Ü´N¥HªÅ¥Õ¸É¨¬¡C¥[¤W¡u#¡v¡Aªí¥Ü¦b¤Q¤»¶i¦ì¼Æ¦r¥[¤W¦r­º¡u0X¡v©Î¡u0x¡v¡A¤£¬O¤Q¤»¶i¦ìªº«h¤£¼vÅT¡C¥[¤W¡u-¡v¡Aªí¥Ü¿é¥X¬°¦V¥ª¹ï»ô¡A¤£¥[ªí¥Ü¦V¥k¹ï»ô¡A³o­Ó¥u¼vÅT³]¦³¼e«×¥B¿é¥Xªº¼Æ­È¤p©ó¼e«×¡C©³¤U¬O¤@¨Ç¨Ò¤l¡G

        .586
        .MODEL  FLAT,STDCALL
        OPTION  CASEMAP:NONE

INCLUDE         WINDOWS.INC
INCLUDE         KERNEL32.INC
INCLUDE         USER32.INC
INCLUDELIB      KERNEL32.LIB
INCLUDELIB      USER32.LIB

;*********************************************************************
.CONST
kilo    DWORD   1024
mega    DWORD   1024*1024
giga    DWORD   1024*1024*1024
szFmtK  BYTE    '1%c Bytes¡×%-#8X Bytes¡×%8d¦ì¤¸²Õ',0dh,0ah,0
szFmtM  BYTE    '1%c Bytes¡×%08Xh Bytes¡×%d¦ì¤¸²Õ',0dh,0ah,0
szFmtG  BYTE    '1%c Bytes¡×%8Xh Bytes¡×%d¦ì¤¸²Õ',0dh,0ah,0
szTitle BYTE    '³æ¦ì',0
;*********************************************************************
.DATA
pBuffer         LPSTR   ?
szBuffer        BYTE    1024 DUP (0)
;*********************************************************************
.CODE
;---------------------------------------------------------------------
start:          xor     eax,eax
                mov     al,'K'
                mov     pBuffer,OFFSET szBuffer
                INVOKE  wsprintf,pBuffer,OFFSET szFmtK,eax,kilo,kilo
                add     pBuffer,eax
                xor     ecx,ecx
                mov     cl,'M'
                INVOKE  wsprintf,pBuffer,OFFSET szFmtM,ecx,mega,mega
                sub     edx,edx
                add     pBuffer,eax
                mov     dl,'G'
                INVOKE  wsprintf,pBuffer,OFFSET szFmtG,edx,giga,giga
                INVOKE  MessageBox,NULL,OFFSET szBuffer,OFFSET szTitle,\
                        MB_OK or MB_ICONINFORMATION
                INVOKE  ExitProcess,NULL
;*********************************************************************
END             start
¡@¦¹µ{¦¡°õ¦æ«áªºµe­±¬O¡G

%I64d¡B%I64x ©M %I64X ¬O¥Î¨Ó³B²z 64 ¦ì¤¸¼Æ­È¿é¥X¨ì¬Y­Ó°O¾ÐÅ餤¡A¦]¬°¦b Win32 ¨t²Î¤¤¡A¨C­Ó°Ñ¼Æ¥u¯à¬O 32 ¦ì¤¸¡A¦]¦¹±o¤À¨â¦¸±À¤J°ïÅ|¡A¥ý±À¤J¸û°ªªº 32 ¦ì¤¸¡A«á±À¤J¸û§Cªº 32 ¦ì¤¸¡A¨Ò¦p­n¿é¥X tera ( tera¡×1099511627776d¡×10000000000h )¡Aµ{¦¡¦p¤U¡G

szFmt   DB      '%I64d',0
buffer  DB      1024 DUP (0)
        mov     eax,0
        mov     edx,100h    ;EDX:EAX¡×10000000000h
        INVOKE  wsprintf,OFFSET buffer,OFFSET szFmt,eax,edx

¦b Win32 ¨t²ÎùØ¡A©I¥s¨ó©w¬O stdcall¡A¥ç§Y³Ì¥kÃ䪺°Ñ¼Æ³Ì¥ý³Q±À¤J°ïÅ|¡A³Ì¥ªÃ䪺°Ñ¼Æ³Ì«á³Q±À¤J°ïÅ|¡A©Ò¥H EDX ¤ñ EAX ¥ý±À¤J°ïÅ|¡C¦]¦¹¦b­ì©l½X¤¤¡A¦pªG©I¥s wsprintf¡A¿é¥X 64 ¦ì¤¸¼Æ­È¡A¸û§Cªº 32 ¦ì¤¸À³¼g¦b¥ªÃä¡A¸û°ªªº 32 ¦ì¤¸¼g¦b¥kÃä¡C


Á`µ²

¦¹³¹¡A¤p¤ì°¸»¡©ú¦p¦ó³B²z·Æ¹«°T®§¡A°²¦p±z±q¡y¦b Win32 Àô¹Ò¤U¼¶¼g²Õ¦X»y¨¥¡zªº²Ä¹s³¹¶}©l¤@ª½¯à°í«ù¨ì³o¤@³¹³£¯à¤U¤u¤Ò¬ã¨sªº¸Ü¡A§Ú·Q±z¥i¯à·|ı±o¡A¦b Win32 Àô¹Ò¼¶¼gµ{¦¡¤JªùªºªùÂe«Ü°ª¡A¦ý¬O°²¦p±z¯à´x´¤°T®§ÅX°Êªº¤j¤è¦V«á¡A¨ä¹ê¨Ã¤£·|¤ñ¦b DOS Àô¹Ò¤U§xÃø¡C¥H³o³¹ªº²Ä¤@­Óµ{¦¡¡AMOUSE4.ASM¡A¨Ó»¡¡A±z°²¦p·Q¦b DOS Àô¹Ò¤U¼¶¼gÃþ¦üªºµ{¦¡¡A¤j·§¬O¤£®e©öªº¡A¦ý¬O¦b Win32 Àô¹Ò°õ¦æªº MOUSE4.ASM ¥u¥Î¤F¬ù¨â¦Ê¦æ´Nµ²§ô¤F¡C

·íµM¡AMOUSE4.ASM ùØ©Òµe¥X¨Óªº­y¸ñ¬OÂ_Â_ÄòÄòªº¡A¨S¦³³s¦b¤@°_¤£¤Ó¦n¬Ý¡A±z¥i¥H¥Î MoveToEx ©M LineTo ³o¨â­Ó API ¥[¥H§ï¶i¡A½Ð°Ñ¦Ò Win32 Programmer's Reference ¦Û¦æ§ï¨}¡C

¥t¥~¡A¹ï©óµøµ¡¤º¨Ï¥Î¤£¦Pªº¦r«¬®É¡A¨ä·Qªk¤]¹³§ïÅܵeµ§ªº¤è¦¡¬Û¦P¡A


¨ì²Ä¥|³¹¡A ¦^¨ì­º­¶¡A ¨ì²Ä¤»³¹