Ch 08 ¹ï¸Ü²°(1)

±`±`¦³³\¦h²³æªºµ{¦¡¡A¨Ï¥ÎªÌ¥u­n¿é¤J¤å¦r©Î¼Æ¦r¡A¦Óµ{¦¡¯à®Ú¾Ú¨Ï¥ÎªÌ¿é¤Jªº¸ê®Æ¡A­pºâµ²ªG¡A³oºØµ{¦¡¬O¤@ºØ¡y¹ï¸Ü²°¡z¡C³o¤@³¹¡A¤p¤ì°¸±NÂǥѼ¶¼g§PÂ_¦è¤¸¬Y¦~¬O§_¬°¶|¦~ ( ¦ó¿×¶|¦~¡H½Ð°Ñ¦Òµù¤@ ) ¨Ó¤¶²Ð¦p¦ó¼¶¼g¹ï¸Ü²°¡C¦¹¹ï¸Ü²°µ{¦¡¦W¬° LEAPYEAR.EXE¡A°õ¦æ«áµe­±¦p¤U¡G

LEAPYEAR.EXE °õ¦æ±¡§Î
¨Ï¥ÎªÌ¥i¥H¦bµøµ¡¤º¿é¤J¦è¤¸¦~¼Æ¡A«ö¤U¬d¸ß«á¡Aµ{¦¡·|­pºâ¸Ó¦~¬O§_¬°¶|¦~¡C«ö¤UÂ÷¶}«áµ{¦¡·|¼u¥X¤@­Óµøµ¡°Ý¬O§_¯uªºÂ÷¶}¡C³o­Óµ{¦¡¤]¥]§t¤F¿ï³æ¡C


¹ï¸Ü²°¨ä¹ê´N¬O¥]§t³\¦h¤lµøµ¡ªºµøµ¡

¨ä¹ê¹ï¸Ü²°¨ä¹ê´N¬O¥]§t³\¦h¤lµøµ¡ªºµøµ¡¡A¦Ó³o¨Ç¤lµøµ¡¡A¤]ºÙ¤§¬°¡y±±¨î¤¸¥ó ( controls )¡z( ©Î²ºÙ¡y±±¥ó¡z )¡C¥H¤W­± LEAPYEAR.EXE ©ÒÅã¥Üªºµøµ¡¦Ó¨¥¡A³o­Óµøµ¡¥]§t¤F¥|­Ó¤lµøµ¡¡A¤À§O¬O

½s¸¹¤l¡@µø¡@µ¡ µøµ¡Ãþ§O
1 ¡y¿é¤J¦è¤¸¦~¼Æ¡G¡z¦r¦êstatic
2 ½s¿è®Øedit
3 ¡y¬d¸ß¡z«ö¶sbutton
4 ¡yÂ÷¶}¡z«ö¶sbutton

©Ò¥H¤p¤ì°¸¥u­n¦b LEAPYEAR.EXE ©Ò«Ø¥ßªºµøµ¡¤¤ ( ¦¹µøµ¡ºÙ¬°¡y¤÷µøµ¡¡z )¡A³sÄò©I¥s¥|¦¸ CreatWindowEx API «Ø¥ß¥|­Ó¤lµøµ¡´N¥i¥H¤F¡A¦Ó³o¥|­Ó¤lµøµ¡¦U¦³¦Uªº¦ì¸m¡Bµøµ¡¥N½X¡Bµøµ¡Ãþ§Oµ¥µ¥¡A¦]¦¹¦b©I¥s CreateWindowEx «Ø¥ß¤lµøµ¡®É¡A¥²¶·¤À§O«ü©w³o¨Ç¼Æ­È¡C¤@¯ë¦Ó¨¥¡A¤j¦h¦b¨t²Îµo¥X WM_CREATE °T®§®É¡A¤]´N¬O­è«Ø¥ß¤÷µøµ¡«á´N¥ß§Y«Ø¥ß¨ä¤lµøµ¡¡C

·L³n¤½¥q¦b Win32 ¨t²Îùؤw¸g¹w¥ý©w¸q¦n´XºØ±`¥Îªºµøµ¡Ãþ§O¡Aµ{¦¡³]­p®v¥u­n®³¨Ó¨Ï¥Î§Y¥i¡A¦Ó¤£»Ý­n¦A¸g¥Ñ RegisterClassEx µù¥U¡C­n¨Ï¥Î³o¨Ç¤w¹w¥ý©w¸qªºµøµ¡®É¡A¥u»Ý¦b©I¥s CreateWindowEx API ®É¡A§â¥¿½Tªºµøµ¡Ãþ§O¶ñ¤J lpClassName °Ñ¼Æ§Y¥i¡A³o¼Ë´N¸`¬Ù¤Fµ{¦¡³]­p®vªº³\¦h¤u§@¡C¥Î³o¨Ç¤w¹w¥ý©w¸q¦nªºµøµ¡Ãþ§O©Ò«Ø¥ßªº¤lµøµ¡´NºÙ¬°±±¨î¤¸¥ó¡A±`¥Îªº¦³¤U­±´XºØ¡G

µøµ¡Ãþ§O ¦W¡@ºÙ »¡¡@¡@¡@©ú
button «ö¶sÃþ§O ¦bµøµ¡ùØÅã¥Ü¤@­Óªø¤è§Î°Ï°ì·í§@«ö¶s¡A¨Ï¥ÎªÌ¥i¥H«ö¤U«ö¶s©ÎÃP¶}«ö¶s¡C
edit ½s¿è®ØÃþ§O ¦bµøµ¡ùثإߤ@­Ó½s¿è®Øªº¤lµøµ¡¡A¥i¥HÅý¨Ï¥ÎªÌ¿é¤J¤å¦r©Î¼Æ¦r¡C
static ÀRºAÃþ§O «Ø¥ß¤@­Óªø¤è§Î°Ï°ìªº¤lµøµ¡¡A¥i¥HÅã¥Ü¦r¦ê¡A³oºØ¤lµøµ¡µLªkÅý¨Ï¥ÎªÌ°µ¿é¥X¿é¤J°Ê§@¡C
listbox ²M³æÃþ§O «Ø¥ß¤@¶ôªø¤è§Î°Ï°ì¡A¨ä¤¤¦³³\¦h¦r¦ê¥i¨Ñ¨Ï¥ÎªÌ¿ï¾Ü¡A¨Ò¦p¶}±ÒÀÉ®×®ÉÅã¥Ü²{¦³Àɮתº¤lµøµ¡¡C
combobox ½Æ¦XÃþ§O ¬O½s¿è®Ø©M²M³æªºµ²¦X¡A³q±`¦³¤@¶ô°Ï°ìÅã¥Ü²M³æ¨Ñ¨Ï¥ÎªÌ¿ï¾Ü¡A©ÎªÌ«ö¤U¥kÃ䪺¤U©Ô¶s«á¤~Åã¥Ü²M³æ¡C
scrollbar ±²¶b¤¸¥ó ¤@ªø±ø§Îªº°Ï°ì¡A¤W­±¦³¤@·Æ°Ê±ì¥i¨Ñ¨Ï¥ÎªÌ©ì°Ê¦¹·Æ°Ê±ì¨Ó¿ï¾Ü¾A·íªº¼Æ­È¡A¨Ò¦p½Õ¾ã­µ¶qªº¤j¤p¡C

ÁÙ°O±o CreateWindowEx ªº­ì«¬¶Ü¡H

HWND CreateWindowEx(
    DWORD dwExStyle,        // extended window style
    LPCTSTR lpClassName,    // pointer to registered class name
    LPCTSTR lpWindowName,   // pointer to window name
    DWORD dwStyle,          // window style
    int x,                  // horizontal position of window
    int y,                  // vertical position of window
    int nWidth,             // window width
    int nHeight,            // window height
    HWND hWndParent,        // handle to parent or owner window
    HMENU hMenu,            // handle to menu, or child-window identifier
    HINSTANCE hInstance,    // handle to application instance
    LPVOID lpParam          // pointer to window-creation data
   );

·í«Ø¥ß¤lµøµ¡®É¡A¦³´X­Ó¦a¤è¶·ª`·N¡C

¦b LEAPYEAR µ{¦¡¤¤ªº½s¿è®Ø¥u¤¹³\¨Ï¥ÎªÌ¿é¤J¦è¤¸¦~¥÷¡A©Ò¥H¥u¯à¬O¼Æ¦r¡A¤£¥i¥H¬O­^¤å¦r¥À©Î¨ä¥L²Å¸¹¡A©Ò¥H¦b²Ä 156 ¦æªº dwStyle ÁÙ«ü©w¤F¤@­Ó­·®æ¡AES_NUMBER¡A¨Ó¹F¨ì¤W­z¥Øªº¡C³o¨Ç¥H©w¸qªºµøµ¡Ãþ§O³£¦³¨ä­·®æ¥i¨Ñ¨Ï¥Î¡A¤p¤ì°¸±N¦bµy«á´X³¹¤º¤¶²Ð¡A©ÎªÌ½Ð¦Û¦æ°Ñ¦Ò Win32 µ{¦¡¤â¥U¡C


­ì©l½X

©³¤U¬O LEAPYEAR.ASM ªº­ì©lÀÉ¡G

        .386
        .model  flat,stdcall
        option  casemap:none

include         windows.inc
include         user32.inc
include         kernel32.inc
includelib      user32.lib
includelib      kernel32.lib

EditID          equ     1001h    ;11 ±±¨î¤¸¥ó¡A½s¿è®Øªº ID
StrID           equ     1002h    ;12 ±±¨î¤¸¥ó¡A¦r¦êªº ID
ButtonExitID    equ     1003h    ;13 ±±¨î¤¸¥ó¡AÂ÷¶}ªº ID
ButtonInquireID equ     1004h    ;14 ±±¨î¤¸¥ó¡A¬d¸ßªº ID
IDM_Exit        equ     2101h    ;15 ¿ï³æ¡AÂ÷¶}ªº ID
IDM_Clear       equ     2102h    ;16 ¿ï³æ¡A²M°£ªº ID
IDM_Inquire     equ     2103h    ;17 ¿ï³æ¡A¬d¸ßªº ID
IDM_Help        equ     2104h    ;18 ¿ï³æ¡A»¡©úªº ID

WndProc         proto   :HWND,:UINT,:WPARAM,:LPARAM

        .DATA
ClassName       db          'SimpleWinClass',0
AppName         db          '¬O§_¶|¦~¡H',0
AskExit         db          '¬O§_°h¥X¦¹µ{¦¡¡H',0
AskExitTitle    db          '¸ß°Ý',0
AskYear         db          '¿é¤J¦è¤¸¦~¼Æ¡J',0
EditClass       db          'edit',0            ;28 µøµ¡Ãþ§O¡Aedit
ButtonClass     db          'button',0          ;29 µøµ¡Ãþ§O¡Abutton
StrClass        db          'static',0          ;30 µøµ¡Ãþ§O¡Astatic
ButtonInquire   db          '¬d¸ß',0
ButtonExit      db          'Â÷¶}',0
MenuName        db          'LEAPYEAR',0
HelpText        db          '§A¥i¥H¦b½s¿è®ØùØ¿é¤J¦è¤¸¦~¼Æ¡A',0dh,0ah
                db          'LEAP YEAR ·|­pºâ¸Ó¦~¬O§_¬°¶|¦~¡C',0
HelpTitle       db          '»¡©ú',0
ResultTitle     db          '¬d¸ßµ²ªG',0
Leap_Year       db          '¶|¦~'
Common_Year     db          '¥­¦~'
ResultStr       db          '¦è¤¸ ', 20 dup (0) ;40 Åã¥Üµ²ªGªº¦r¦ê
hInstance       HINSTANCE   ?
hwnd            HWND        ?
hMenu           HMENU       ?
hEdit           HWND        ?
hStr            HWND        ?
hExitButton     HWND        ?
hInquireButton  HWND        ?
wc              WNDCLASSEX  <30h,?,?,0,0,?,?,?,?,0,offset ClassName,?>
msg             MSG         <?>
year            db          10 dup (?)

        .CODE
start:  invoke  GetModuleHandle,NULL
        mov     hInstance,eax
        mov     wc.style,CS_HREDRAW or CS_VREDRAW
        mov     wc.lpfnWndProc,offset WndProc
        mov     eax,hInstance
        mov     wc.hInstance,eax
        mov     wc.hbrBackground,COLOR_BTNFACE+1        ;59 ³]©w¤÷µøµ¡­I´º¦â
        invoke  LoadIcon,NULL,IDI_APPLICATION
        mov     wc.hIcon,eax
        mov     wc.hIconSm,eax
        invoke  LoadCursor,NULL,IDC_ARROW
        mov     wc.hCursor,eax
        invoke  LoadMenu,hInstance,offset MenuName
        mov     hMenu,eax
        invoke  RegisterClassEx,offset wc               ;67 µù¥U¤÷µøµ¡¤§µøµ¡Ãþ§O
        invoke  CreateWindowEx,NULL,offset ClassName,\  ;68 «Ø¥ß¤÷µøµ¡
                offset AppName,WS_OVERLAPPEDWINDOW,0,\
                0,250,150,NULL,hMenu,hInstance,NULL
        mov     hwnd,eax
        invoke  ShowWindow,hwnd,SW_SHOWNORMAL
        invoke  UpdateWindow,hwnd

.while  TRUE
        invoke  GetMessage,offset msg,NULL,0,0
.break  .if     !eax
        invoke  TranslateMessage,offset msg     ;78 Âà´«¨Ï¥ÎªÌ¿é¤Jªº«öÁä
        invoke  DispatchMessage,offset msg
.endw        
        mov     eax,msg.wParam
        invoke  ExitProcess,eax
;---------------------------------------
;­pºâ¦~¥÷¬O§_¬°¶|¦~¡A¦¹°Æµ{¦¡¨ú±o year ©Ò«üªº¦~¥÷¦r     ;85
;¤¸¡A­pºâ¬O§_¬°¶|¦~¡A¨Ã¨Ïµ²ªG¶ñ¤J ResultStr ¦r¦êùØ      ;86
calc_year       proc
        push    esi
        push    edi
        sub     dx,dx   ;89 DX ±N¦s¦³ 16 ¶i¦ìªº¦è¤¸¦~¥÷
        mov     esi,offset year
        mov     edi,offset ResultStr+5
        mov     ax,dx
        mov     cl,10
nxt0:   lodsb
        or      al,al
        jz      ok0
        stosb           ;97 §â¨C¦ì¦è¤¸¦~¥÷ªº ASCII ¦r¤¸¦s¤J ResultStr
        sub     al,'0'  ;98 ­pºâ¨C¦ì¦è¤¸¦~¥÷ªº 16 ¶i¦ì¼Æ
        xchg    ax,dx
        mul     cl
        add     dx,ax
        jmp     nxt0

ok0:    mov     al,' '
        stosb           ;105 ¦s¤JªÅ¥Õ¦r¤¸¨ì ResultStr ¦r¦ê
        mov     esi,offset HelpText+50
        lodsd           ;107 ¦s¤J¡y¦~¬O¡z4 ­Ó¦ì¤¸²Õ¨ì ResultStr ¦r¦ê
        stosd

        mov     si,dx   ;110 DX¡BSI ¦s¦³ 16 ¶i¦ì¤§¦è¤¸¦~¥÷
        mov     cx,400
        mov     ax,dx
        sub     dx,dx
        div     cx
        or      dx,dx
        jz      leap

        mov     ax,si
        sub     dx,dx
        mov     cx,100
        div     cx
        or      dx,dx
        jz      common

        mov     ax,si
        mov     cx,4
        sub     dx,dx
        div     cx
        or      dx,dx
        jz      leap
;­Y¬°¶|¦~ ESI «ü¦V¡y¶|¦~¡z¦r¦ê¡A¤Ï¤§«ü¦V¡y¥­¦~¡z¦r¦ê
common: mov     esi,offset Common_Year
        jmp     ok1
leap:   mov     esi,offset Leap_Year
ok1:    lodsd
        stosd

        mov     esi,offset HelpText+62
        lodsw
        stosw           ;140 ¦s¤J¡y¡C¡z©ó ResultStr ¦r¦ê
        sub     al,al   ;141 ¦s¤J NULL ©ó ResultStr ¦r¦ê
        stosb
        pop     edi
        pop     esi
        ret
calc_year   endp
;---------------------------------------
WndProc proc    hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.if     uMsg==WM_CREATE         ;149 «Ø¥ß¥|­Ó±±¨î¤¸¥ó
        invoke  CreateWindowEx,WS_EX_LEFT,addr StrClass,\
                addr AskYear,WS_CHILD or WS_VISIBLE or ES_LEFT,\
                10,22,145,28,hWnd,StrID,hInstance,NULL
        mov     hStr,eax
        invoke  CreateWindowEx,WS_EX_CLIENTEDGE,addr EditClass,\
                NULL,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT\
                or ES_AUTOHSCROLL or ES_NUMBER,156,18,80,28,\
                hWnd,EditID,hInstance,NULL
        mov     hEdit,eax
        invoke  CreateWindowEx,NULL,addr ButtonClass,addr ButtonInquire\
                ,WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,48,60,\
                52,28,hWnd,ButtonInquireID,hInstance,NULL
        mov     hInquireButton,eax
        invoke  CreateWindowEx,NULL,addr ButtonClass,addr ButtonExit\
                ,WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,148,60,\
                52,28,hWnd,ButtonExitID,hInstance,NULL
        mov     hExitButton,eax
        invoke  SetFocus,hEdit          ;167 ¨Ï½s¿è®Ø¦¨¬°¥¿¦b§@¥Î¤¤ªºµøµ¡
                
.elseif uMsg==WM_COMMAND
        mov     edx,wParam
        .if     lParam==0               ;171 «ö¤U¿ï³æ©Î§Ö±¶Áä
                .if     dx==IDM_Exit
                        jmp     close
                .elseif dx==IDM_Clear
                        invoke  SetWindowText,hEdit,NULL
                .elseif dx==IDM_Inquire
                        jmp     inquire
                .elseif dx==IDM_Help
                        invoke  MessageBox,hWnd,offset HelpText,\
                                offset HelpTitle,MB_OK
                .endif
        .else                           ;182 «ö¤U±±¨î¤¸¥ó
                .if     dx==ButtonExitID
                        jmp     close
                .elseif dx==ButtonInquireID
inquire:                invoke  GetWindowText,hEdit,offset year,5
                        call    calc_year
                        invoke  MessageBox,hWnd,offset ResultStr,\
                                offset ResultTitle,MB_OK
                .endif
        .endif                          ;191

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

.elseif uMsg==WM_DESTROY
        invoke  PostQuitMessage,NULL

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

end     start

©³¤U¬O LEAPYEAR.RC ¸ê·½´y­zÀɪº¤º®e¡G

#define     IDM_Exit    8449
#define     IDM_Clear   8450
#define     IDM_Inquire 8451
#define     IDM_Help    8452

LEAPYEAR    MENU
{
POPUP       "ÀÉ®×(&F)"
            {
            MENUITEM    "Â÷¶}(&X)",IDM_Exit
            }

POPUP       "½s¿è(&E)"
            {
            MENUITEM    "²M°£(&C)",IDM_Clear
            MENUITEM    "¬d¸ß(&E)",IDM_Inquire
            }
            
MENUITEM    "»¡©ú(&H)",IDM_Help
}

©³¤U¬O makefile ÀÉ¡ALEAPYEAR.MAK Àɪº¤º®e¡G

ALL:LEAPYEAR.EXE

LEAPYEAR.EXE : LEAPYEAR.ASM LEAPYEAR.RES
    ml /coff LEAPYEAR.ASM /link /SUBSYSTEM:WINDOWS LEAPYEAR.RES
    
LEAPYEAR.RES : LEAPYEAR.RC
    rc LEAPYEAR.RC

²ÕĶ³o­Óµ{¦¡¡A¥u»Ý¦b DOS ¼Ò¦¡¤U¿é¤J

d:\homepage\source>nmake -f LEAPYEAR.MAK [Enter]

Microsoft (R) Program Maintenance Utility   Version 1.50
Copyright (c) Microsoft Corp 1988-94. All rights reserved.

        rc LEAPYEAR.RC
        ml /coff LEAPYEAR.ASM /link /SUBSYSTEM:WINDOWS LEAPYEAR.RES
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: LEAPYEAR.ASM
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/SUBSYSTEM:WINDOWS /SUBSYSTEM:WINDOWS
"LEAPYEAR.obj"
"/OUT:LEAPYEAR.exe"
"LEAPYEAR.RES"

d:\homepage\source>

§Y¥i¡ANMAKE ·|¦Û°ÊÀ°§Ú­Ì²ÕĶ¤Î³sµ²¦n¡C


¸Ñ»¡

LEAPYEAR.ASM ªº²Ä 11 ¨ì²Ä 14 ¦æ¬O±±¨î¤¸¥óªºÃѧO½X ( ID )¡A³o¨ÇÃѧO½X±N¤À§O¶ñ¦b WM_CREATE °T®§¤¤¡A¬°«Ø¥ßªº¥|­Ó¤l±±¨î¤¸¥ó¦Ó©I¥s CreateWindowEx ªº hMenu °Ñ¼ÆùØ¡A±z¥i¥H¨ìµ{¦¡²Ä 152¡B157¡B161 ¤Î²Ä 165 ¦æÆ[¹î¬O§_¤¬¬Û°t¦X¡C

µ{¦¡²Ä 15 ¨ì²Ä 18 ¦æ¬O¿ï³æªºÃѧO½X¡A³o¨ÇÃѧO½X¥²¶·©M¸ê·½´y­zÀÉ¡ALEAPYRAE.RC¡AùØ©w¸q¿ï³æªºÃѧO½X¬Û¦P¡A¦ý¬O¦]¬°¦b LEAPYEAR.RC ùبϥΤQ¶i¦ì¦Ó¦b LEAPYEAR.ASM ùبϥΤQ¤»¶i¦ì¡A©Ò¥H¥²¶·´«ºâ¨Ï¨âªÌ¼Æ­È¬Û¦P§Y¥i¡C·íµM±z¤]¥i¥H¤£¥²³o»ò³Â·Ð¡A¨Ï¥¦­Ì¦P®É±Ä¥Î¤Q¶i¦ì©Î¦P®É±Ä¥Î¤Q¤»¶i¦ì¡A¦b¸ê·½ÀÉùؤQ¤»¶i¦ìªí¥Üªk±Ä¥Î C/C++ ®æ¦¡¡A¤]´N¬O¦b¼Æ¦r«e¥[¤W¡y0x¡z´NÅܦ¨¤Q¤»¶i¦ì¡A¨Ò¦p¡G

#define     IDM_Exit    0x2101
#define     IDM_Clear   0x2102
#define     IDM_Inquire 0x2103

LEAPYEAR.ASM ªº²Ä 28 ¦æ¨ì²Ä 30 ¦æ¬O¨t²Î¤w¹w¥ý©w¸qªºµøµ¡Ãþ§O¦W¡A±N¨Ó¦b²Ä 150¡B154¡B159¡B163 ¦æ©I¥s CreateWindowEx ®É¡A¥²¶·¶ñ¤J CreateWindowEx ªº lpClassName ùØ¡C

²Ä 40 ¦æªº ResultStr ¦r¦ê¬O¥Î¨Ó¦L¥X³Ì«áªºµ²ªG¡G

¬d¸ßµ²ªG
³o­Ó¦r¦ê«e­± 5 ­Ó¦ì¤¸²Õ¬O¡y¦è¤¸ ¡z¡A³o 5 ­Ó¦ì¤¸²Õ¬O©T©wªº¡A¦Ó«á­±ªº¤å¦r«h¬O¦b²Ä 85 ¦æ¨ì²Ä 146 ¦æªº calc_year °Æµ{¦¡ùسQ¤@¤@¶ñ¶i¥hªº¡C

µ{¦¡²Ä 55 ¦æ¨ì²Ä 67 ¦æ¬O³]©w WNDCLASSEX µ²ºcÅ骺¨C­ÓÄæ¦ì¡A¨Ã¦V¨t²Îµù¥U SimpleWinClass µøµ¡Ãþ§O ( ²Ä 23 ¦æ )¡A¨ä¤¤²Ä 59 ¦æ¬O³]©w¤÷µøµ¡ªº­I´º¦â¡ACOLOR_BTNFACE+1¡Cµ{¦¡²Ä 78 ¦æ©I¥s TranslateMessage ¬O¥²­nªº¡A§_«hµLªk¥Ñ edit ±±¨î¤¸¥ó¿é¤J¥ô¦ó¦r¤¸¡C

©³¤U§Ú­Ì¥ý¬Ý¬Ý²Ä 148 ¦æ¶}©lªºµøµ¡¨ç¦¡¡CLEAPYEAR ³B²z¥|­Ó°T®§¡AWM_CREATE¡BWM_COMMAND¡BWM_CLOSE ©M WM_DESTROY¡A§Ú§âµJÂI¶°¤¤¦b WM_CREATE ©M WM_COMMAND¡C

«e­±¤w¸g´£¨ì¡Aµ{¦¡³]­p®v¦b¼¶¼gµ{¦¡®É¡A¥i§Q¥Î¨t²Î¤w¸g©w¸q¦nªº±±¨î¤¸¥ó§@¬°¤lµøµ¡¡A¸`¬Ù³\¦h¤u§@¡A³o¨Ç¤lµøµ¡³£¦b¤÷µøµ¡­è«Ø¥ß®É¤]¥ß§Y«Ø¥ß¡C©Ò¥H¤@¯ë¦Ó¨¥¡A§Ú­Ì¦b³B²z WM_CREATE °T®§®É«Ø¥ß³o¥|­Ó¤lµøµ¡¡C¦¹¥~¡A¤p¤ì°¸§Æ±æ¯à°¨¤W´NÅý¨Ï¥ÎªÌ¿é¤J¦~¥÷¡A©Ò¥H¦b²Ä 167 ¦æ§Q¥Î SetFocus §â½s¿è®Ø³]¬°¿é¤JµJÂI¡A¥H±µ¦¬Áä½L¿é¤J¡C

SetFocus API

³o­Ó API ³]©wÁä½L¿é¤J¨ì¨º¤@­Óµøµ¡¡A¨ä­ì«¬¬°¡G

HWND SetFocus(
    HWND    hWnd    // handle of window to receive focus
   );

SetFocus ¦pªG³]©w¦¨¥\¡A·|¶Ç¦^­ì¿é¤JµJÂIªºµøµ¡¥N½X¡A¨Ã¥B¹ï­ì¿é¤JµJÂIªºµøµ¡°e¥X WM_KILLFOCUS¡A¹ï³]©w¿é¤JµJÂIªºµøµ¡°e¥X WM_SETFOCUS¡F­Y¥¢±Ñ«h¶Ç¦^ NULL¡C

¦A½Í WM_COMMAND

·í¨Ï¥ÎªÌ«ö¤U±±¨î¤¸¥ó¡B§Ö±¶Áä©ÎÂI¿ï¿ï³æ®É¡A³£·|²£¥Í WM_COMMAND °T®§¡C§Ú­ÌÂÇ¥Ñ lParam ¨Ó¤À¿ë«ö¤U±±¨î¤¸¥ó¡B«ö¤U¿ï³æ©Î¬O«ö¤U§Ö±¶Áä¡A¦pªG«ö¤U±±¨î¤¸¥ó«h lParam ¬°¤lµøµ¡¥N½X¡A§_«h¬°¹s ( ½Ð°Ñ¦Ò²Ä¤»³¹¦³Ãö WM_COMMAND ªº»¡©ú )¡C¨Æ¹ê¤W¡A¤£¶È«ö¶s±±¨î¤¸¥ó·|µo¥X WM_COMMAND °T®§¡Aµ´¤j³¡¥÷ªº±±¨î¤¸¥ó³£¬O¾a WM_COMMAND ±N°T®§¶Ç»¼¶Ç»¼µ¹¤÷µøµ¡¡C

·í¨Ï¥ÎªÌ«ö¤U«ö¶s±±¨î¤¸¥ó«á¡A«ö¶s±±¨î¤¸¥ó¶Çµ¹¤÷µøµ¡ªº WM_COMMAND °T®§¤¤¡A¦b wParam °Ñ¼Æùئs¦³¨Ï¥ÎªÌ¹ï«ö¶sªº°Ê§@¡A±`¥Îªº¦³¨âºØ¡GBN_CLICKED ©M BN_DOUBLECLICKED¡A«eªÌªí¥Ü¨Ï¥ÎªÌ´¿«ö¤U¹L«ö¶s¡A«áªÌªí¥Ü¨Ï¥ÎªÌ´¿³sÄò«Ü§Ö¦a«ö¤U«ö¶s¡A¤S¼u°_¨Ó¨â¦¸¡Cªþ±a¤@´£¡A¤÷µøµ¡¤]¥i¹ï«ö¶s±±¨î¤¸¥óµo¥X WM_COMMAND °T®§¡A¸Ô²Ó±¡§Î½Ð°Ñ¾\²Ä¤Q³¹¡C

·í½T©w¨Ï¥ÎªÌ¬O«ö¤U«ö¶s«á¡AÁÙ­n¦AÀˬd¨Ï¥ÎªÌ¬O«ö¤U¨º¤@­Ó«ö¶s¡A¥i¥HÀˬd wParam ¸û§Cªº 16 ¦ì¤¸¡A³o 16 ­Ó¦ì¤¸Â泫ö¶sªº ID¡A¤]´N¬Oµ{¦¡²Ä 13¡B14 ¦æ©Ò©w¸qªº¡y¬d¸ß¡z¤Î¡yÂ÷¶}¡z³o¨â­Ó«ö¶s ID¡C

©Ò¥H§A¥i¥H¬Ý¨ì²Ä 171 ¦æ¨ì 191 ¦æ¬O¤@­Ó IF¡ÐELSE¡ÐENDIF °Ï¶ô¡A³o¬qµ{¦¡¥Î¨ÓÀˬd¨Ï¥ÎªÌÂI¿ï¿ï³æ©ÎªÌ«ö¤U«ö¶s¡C¦pªGÂI¿ï¿ï³æ«h°õ¦æ²Ä 172 ¨ì 181 ¦æ¡A³o´X¦æ¤S¬O¤@­Ó IF¡ÐELSE¡ÐENDIF °Ï¶ô¡A³o­Ó IF¡ÐELSE¡ÐENDIF °Ï¶ô«h¬O¨Ì¨Ï¥ÎªÌ©ÒÂI¿ïªº¿ï³æ°õ¦æ¦U­Ó¤£¦Pªº¥\¯à¡C¦pªG¨Ï¥ÎªÌ«ö¤U«ö¶s«h°õ¦æ²Ä 183 ¨ì 190 ¦æ¡A³o´X¦æ¤]¬O¤@­Ó IF¡ÐELSE¡ÐENDIF °Ï¶ô¡A³o­Ó°Ï¶ô«h¬O¨Ì¨Ï¥ÎªÌ©Ò«ö¤Uªº«ö¶s°õ¦æ¡y¬d¸ß¡z©Î¡yÂ÷¶}¡zªº°Ê§@¡C

¿ï³æùتº¥\¯à¤j¦h´£¹L¡A¶È¦³¤@­Ó SetWindowText API ¡C

SetWindowText API

SetWindowText ¬O¥Î¨Ó³]©wµøµ¡¼ÐÃD¤å¦rªº¡A°²¦p©Ò«ü©wªºµøµ¡¬O¤l±±¨î¤¸¥óªº¸Ü¡A¨º»ò´N·|§ïÅܳo­Ó¤l±±¨î¤¸¥óªº¤å¦r¡A¨Ò¦p¡G¦pªG¬O«ö¶sªº¸Ü¡A´N§ïÅÜ«ö¶s¤Wªº¤å¦r¡F¦pªG¬O½s¿è®Øªº¸Ü¡A´N·|§ïÅܽs¿è®Ø¤ºªº¤å¦r¡F¦pªG¬OÀRºA±±¨î¤¸¥ó¡A´N§ïÅܨä¤å¦r¡CSetWindowText ªº­ì«¬¬O¡G

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

hWnd ¬O·Q§ïÅܼÐÃDªºµøµ¡¥N½X¡ClpString ¬O«ü¦V§ïÅܫ᪺¦r¦ê¦ì§}¡A¦¹¦r¦ê¥H NULL µ²§À¡C¦pªG SetWindowText °õ¦æ¦¨¥\¡AEAX ¶Ç¦^«D¹s­È¡A¥¢±Ñ«h¶Ç¦^ NULL¡C

·í¨Ï¥ÎªÌ«ö¤U¡y²M°£¡z¿ï³æ®É¡A´N°õ¦æ¦bµ{¦¡²Ä 175 ¦æªº SetWindowText¡A¦Ó¨Ï½s¿è®Ø¤ºªº¤å¦r³]¬°ªÅ¦r¦ê¡A¹F¨ì²M°£¦r¦êªº¥Øªº¡C

»P³]©w¦r¦ê¬Û¤Ïªº¬O GetWindowText API¡C©Ò¥H·í°õ¦æ¡y¬d¸ß¡z®É¡A´N¬O°õ¦æ GetWindowText¡C´«¥y¸Ü»¡¡A­n¨ú±oµøµ¡¼ÐÃD¤å¦r©Î¬O¨ú±o¤l±±¨î¤¸¥óªº¤å¦r¡A¥i¥H¨Ï¥Î GetWindowText API¡C

GetWindowText API

GetWindowText API ¨ú±o«ü©wµøµ¡ªº¼ÐÃDÄæ¦r¦ê¡A°²¦p©Ò«ü©wªºµøµ¡¬O±±¨î¤¸¥óªº¸Ü¡A«h¨ú±o¨ä¤º®e¡C­ì«¬¦p¤U¡F

int GetWindowText(
    HWND    hWnd,       // handle of window or control with text
    LPTSTR  lpString,   // address of buffer for text
    int     nMaxCount   // maximum number of characters to copy
   );

hWnd ¬O­n¨ú±oµøµ¡¼ÐÃDÄ椺®eªºµøµ¡¥N½X¡AlpString ¬O«ü©w©Ò¨ú±oªº¼ÐÃD¤º®e¦s©ñ³B¦ì§}¡AnMaxCount ¬O­n¨ú±oªº¼ÐÃD¤º®eªø«×¡A¥H¦ì¤¸²Õ¬°³æ¦ì¡C¦]¬°²{¦b¦è¤¸¦~¥÷³Ì¦h¤]¤£¹L¥|¦ì¼Æ¡A©Ò¥H LEAPYEAR ¶È¶È¨ú±o«e¥|¦ì¦Ó¤w¡A§Y¨Ï¨Ï¥ÎªÌ¿é¤J¶W¹L¥|¦ì¼Æ¡Aµ{¦¡¤]¶È¶È¨ú±o«e¥|¦ì¼Æ¡CLEAPYEAR «ü©w GetWindowText §â¨Ï¥ÎªÌ©Ò¿é¤Jªº¦r¦ê¦s¤J year ¦r¦êùØ¡C

GetWindowTextLength API

°²¦p±z·Q¨ú±o¥þ³¡¿é¤J¦r¦êªº¸Ü¡A´N±o¥ýª¾¹D¿é¤Jªº¦r¦êªø«×¡A¤]¥i¥H¥Î GetWindowTextLength API ±o¨ì¦r¦êªø«×¡C

int GetWindowTextLength(
    HWND    hWnd    // handle of window or control with text
   );

hWnd ¬O­n¨ú±oµøµ¡¼ÐÃD©Î±±¨î¤¸¥ó¤º®eªºµøµ¡¥N½X¡Cªð¦^®É¨ä¤º®eªø«×¥H¦ì¤¸²Õ¬°³æ¦ì¦s©ó EAX ùØ¡A­nª`·Nªº¬O¡A³oùتº EAX ¥i¤£¥]§tµ²§À¦r¤¸¡ANULL¡C

±µ¤U¨Ó«K¬O©I¥s calc_year °Æµ{¦¡¡A¦¹°Æµ{¦¡¬O¥Î¨Ó§â¥Ñ GetWindowTexet ¶Ç¦^ªº¦è¤¸¦~¥÷¦r¦êÂà´«¦¨¤Q¤»¶i¦ì¼Æ¡A¦A­pºâ¦¹¤Q¤»¶i¦ì¼Æªº¦è¤¸¦~¥÷¬O§_¬°¶|¦~¡A³Ì«á¦s©ó ResultStr ¦r¦êùØ¡C¦A¨Ó«K¬O§â ResultStr ¦r¦ê¥æ¥Ñ MessageBox API Åã¥Ü¦b¿Ã¹õ¤W¡C


­È±o§ï¨}¤§³B

°²¦p±z¨Ì·Ó¤p¤ì°¸¦¹³¹ªº¤èªk¥h¼¶¼g¹ï¸Ü²°µ{¦¡¡A¨Ò¦pÄá¤ó»PµØ¤ó·Å«×ªº´«ºâ¡B¤½¤Ø»P­^§`ªº´«ºâ¡B¤½¤ç»P½Sªº´«ºâ¡B¿é¤J¶ê¥b®|¨D¶ê­±¿n¡B¿é¤Jªø¤è§Îªø»P¼e¨D¨ä­±¿nµ¥µ¥¤pµ{¦¡¡A±z±Nµo²{±z·|ªá³\¦h®É¶¡¦b¦w±Æ³o¨Ç±±¨î¤¸¥óªº¦ì¸m¤W¡C¨ä¹ê³o­Ó¤u§@¥i¥H¸g¥Ñ³\¦h¹ï¸Ü®Ø½s¿èµ{¦¡À°§Ú­Ì§¹¦¨¡A³o¼Ë´N·|¸`¬Ù³\¦h®É¶¡¡C¤U¤@³¹±N¤¶²Ð³o¨Ç¡C


µù¤@¡G

¶§¾ä¾äªk

¦¹³B©Ò«üªº¶§¾ä¬O¥H¤Ó¶§¹B¦æ¬°°Ñ¦Ò©Ò¨î©wªº¾äªk¡A¦¹ºØ¾äªkÁÙ¥i¤À¬°¥­¦~»P¶|¦~¡A¥­¦~¨C¦~¤À¦¨ 12 ­Ó¤ë¡A¨C­Ó¤ë±q 28 ¤Ñ¨ì 31 ¤Ñ¤£µ¥¡A¦@ 365 ¤Ñ¡G

¤@¤ë
Jan.
¤G¤ë
Feb.
¤T¤ë
Mar.
¥|¤ë
Apr.
¤­¤ë
May
¤»¤ë
Jun.
¤C¤ë
Jul.
¤K¤ë
Aug.
¤E¤ë
Sep.
¤Q¤ë
Oct.
¤Q¤@¤ë
Nov.
¤Q¤G¤ë
Dec.
31 ¤Ñ 28 ¤Ñ 31 ¤Ñ30 ¤Ñ 31 ¤Ñ30 ¤Ñ 31 ¤Ñ31 ¤Ñ 30 ¤Ñ31 ¤Ñ 30 ¤Ñ 31 ¤Ñ

¶|¦~¤@¦~¦³ 366 ¤Ñ¡A¶|¦~ªº¤G¤ëÅܬ° 29 ¤Ñ¡A¨ä¾l©M¥­¦~¤@¼Ë¡C¨º»ò¨º¤@¦~¬O¶|¦~©O¡H¶§¾ä¾äªk¬O¨C¥|¦~³]¸m¤@­Ó¶|¦~¡A¦]¦¹¥H¦è¤¸¦~¼Æ¯à³Q¥|¾ã°£ªº¬°¶|¦~¡A¨Ò¦p¦è¤¸ 1988¡B1992¡B1996 §¡¬°¶|¦~¡A¦ý¬O¹³¦è¤¸ 1700¡B1800¡B1900¡B2100 ¦~¯à³Q¥|¾ã°£«o¤£¯à³Q 400 ¾ã°£ªº«o¤£¬O¶|¦~¡A¦Ó¦è¤¸ 1600¡B2000¡B2400 ¦~¡A¯à³Q 400 ¾ã°£ªº¤~¬O¶|¦~¡C¬Ý°_¨Ó¦n¹³«Ü½ÆÂø¡A¤p¤ì°¸µy·L¾ã²z¤@¤U¡AÀ³¸Ó¥i¥H«K²³æ¤@ÂI¡G¦è¤¸¦~¼Æ«á­±¬O 00 ªº¡A¨Ò¦p 1700¡B1800¡B1900¡B2000 ¦~µ¥»Ý­n¯à³Q 400 ¾ã°£ªº¤~¬O¶|¦~¡A§_«h¬O¥­¦~¡F¦Ó¦è¤¸¦~¼Æ«á­±¤£¬O 00 ªº¡A¥u­n¯à³Q¥|¾ã°£ªº´N¬O¶|¦~¡A¤£¯à³Q¥|¾ã°£ªº´N¬O¥­¦~¡C

¬°¤°»ò¶|¦~ªº­pºâ¤è¦¡¦p¦¹½ÆÂø©O¡H³o¬O¦]¬°¦a²y¶¤Ó¶§¤½Âà»P¦a²y¦ÛÂ઺®É¶¡¨Ã«D«ê¦n¾ã¼Æ¡A¦a²y¶¤Ó¶§¤@°é¶O®É 365.2422 ¤é¡A¦ý§Ú­Ì¾äªk¤Wªº¥­¦~¥u¦³ 365 ¤Ñ¡A°²¦p¤£¥h³B²z¥Lªº¸Ü¡A¨º»ò¨C¥|¦~¤é¾ä¤Wªº¤é´Á´N·|¤ñ¦a²y¤½Âà§Ö 0.9688 ¤Ñ¡A¤j¬ù¤@¤Ñ¡A40 ¦~´N§Ö¤F 10 ¤Ñ¡A400 ¦~´N§Ö¤F 100 ¤Ñ¡A¤j¬ù§Ö¤@©u¤F¡A³o®É¦pªG¾äªk¦A¤£­×¥¿¡A¨º»ò¥¿­È´H­·¨ë°©ªº¤@¤ë¶©¥V¤Ñ®ð®É¡A¤é¾ä¤W«oÅã¥Üªº¬O¥|¤ë¬K·xªá¶}®É¡A©ó¬O³y¦¨¤é¾ä©M¹ê»Ú®ð­Ô¹H­Iªº±¡§Î¡A¥j¤H©Ò¿×¡y¤»¤ë³·¡z¤j·§´N¬O¾äªk¤£·Ç½TªºÃö«Y§a¡H( ¦ý¦³®É§Ú«o¹çÄ@¯u¦³©_­Þ®É¡A¦Ñ¤Ñ¤]¸Óµoµo·O´d )

¨¥Âk¥¿¶Ç¡A°²¦p¨C¥|¦~¦h¤@¤Ñ¡A´N·|©M¹ê»Ú±¡§Î¬Û²Å¡A¦ý§Y¨Ï¦p¦¹¡AÁÙ¬O¦³»~®t¡A¦]¬°¾äªk¤Ö¤F 0.9688 ¤Ñ¡A©Ò¥H§Ö¤F 0.9688 ¤Ñ¡A²{¦b¦pªG¨C¥|¦~¦h¤@¤Ñ¡A´N·|Åܦ¨¾äªk¨C¥|¦~ºC¤F 0.0312 ¤Ñ¡A¦]¦¹¨C¥|¦Ê¦~´NºC¤F 3.12 ¤Ñ¡A¦b 400 ¦~¤º¥²¶·´î¥h¤T¤Ñ¡A³o¤T¤Ñ´N³]©w¦b¹³ 100¡B200¡B300 µLªk¬° 400 ¾ã°£ªº¦~¼ÆùØ¡C³o´N¬O¶§¾ä¾äªkªº¥Ñ¨Ó¡C


¨ì²Ä¤C³¹¡A ¦^¨ì­º­¶¡A ¨ì²Ä¤E³¹