You are on page 1of 154

| 

GV: Trҫn Nhұt Hóa


Bm: Công nghӋ PM
! 
 !   

r Môi trưӡng Windows
0 Giao tiӃp ngưӡi dùng đӗ hӑa
0 Đa nhiӋm
0 Chia sҿ thӫ tөc mà Windows cung cҩp
0  dөng thư viӋn liên kӃt đӝng (||*
0 Có tính tương thích cao
0  dӵng dӵa trên kiӃn trúc mӣ
Ë



0 Theo hưӟng sӵ kiӋn
0 >

 Đưӧc x dӵng không nhҩt thiӃt
đưӧc chӭa trong du nhҩt trong mӝt file
0 ! : uҩt hiӋn trӵc quan trên màn hình,
là thành phҫn giao tiӃp cӫa ӭng dөng đӕi vӟi
ngưӡi dùng gӗm các thành phҫn cơ bҧn:
0 thanh tiêu đӅ
0 đưӡng viӅn ca sә
0 vùng làm viӋc (vùng client«*
R!  !"
0 #$%&'()
0 |à tác đӝng ha mӝt hoҥt đӝng nào đó ҧnh
hưӣng đӃn ӭng dөng (chương trình*
0 Phn loҥi:

0 Các sӵ kiӋn đӃn tӯ ngưӡi dùng

0 Các sӵ kiӋn đӃn tӯ hӋ thӕng

0 ChӍ xem xét các sӵ kiӋn đӃn tӯ phía ngưӡi dùng


R! %)
0 *+
 (Message*:
0 Mӝt sӵ kiӋn xҧ ra luôn phát sinh ra mӝt thông điӋp
0 Thông điӋp cho biӃt bҧn chҩt cӫa sӵ kiӋn đó là gì
0 Thông điӋp đi kèm bӣi các thông tin bә sung đưӧc chӭa trong
các thông sӕ cӫa nó
0 ,
-+
 (Message queue*
0 Mӛi ӭng dөng đӅu có mӝt hàng đӧi đӇ chӭa các thông
điӋp dành cho nó (tun theo nguên tҳc FIFO*
0 Hàng đӧi thông điӋp do Windows cung cҩp
0 Các thông điӋp có thӇ vào hàng đӧi hoһc không tù thuӝc
vào đӝ ưu tiên cӫa các thông điӋp
R! %)
0 ./
0+
 (Message loop*
0 Vòng lһp thông điӋp có chӭc năng lҩ các thông điӋp tӯ
hàng đӧi đӇ gi cho chương trình x lý
0 Vòng lһp thông điӋp phҧi đưӧc cài đһt tӯ phía ӭng
dөng
0 *1 2+

0 o chương trình cung cҩp đӇ x lý các sӵ kiӋn cҫn thiӃt
0 Các thông điӋp đã đưӧc x lý hoһc không đưӧc x lý
bӣi chương trình sӁ đưӧc gi cho thӫ tөc x lý mһc đӏnh
! 
Ë34 


0 Có hai cách tiӃp cұn cho kiӃn trúc mӝt chương


trình C/Windows, đó là:
- Theo hưӟng thông điӋp (sӵ kiӋn*
- Theo hưӟng thành phҫn
0 *( 5
$

0 ơ đӗ (hình bên*
0 Mô tҧ («*
0 *( 5
,6

0 ơ đӗ (hình bên* ¢ 


0 Mô tҧ («*
¢ 

  %
*+ ,  *+ , 
 
 
'( &

$!)

¢ 

   ¢!
     "#$% & 


-'($!)./
Ë.7%(8
)
‘include <windows h>
int WINAPI WinMain (HINTANCE hInstance, HINTANCE hPrevInstance,
PTR szCmd|ine, int iCmdhow*

MessageBox (NU||, TET ("Hello, Windows"*, TET ("HelloMsg"*, 0* ;


return 0 ;
}

39:"
º 
   
;<=>?<;8%<=#*>=!&<(@
<=#*>=!&?('<(@?#*AB! |(@
! #C)
0 Các tham sӕ:
0 Tham sӕ đҫu tiên là cái xác đӏnh chương trình
0 ThӇ hiӋn (instance* trưӟc đó cӫa nó à  
0 Tham sӕ thӭ ba là dòng lӋnh đưӧc s dөng đӇ thӵc
thi chương trình
0 Tham sӕ thӭ tư xác đӏnh cách thӭc chương trình sӁ
khӣi đӝng hiӇn thӏ
á 
8(
(D1%=E||@*&F*%G(@;CG)@*&F*
%G(8
G)@H)I
0 BiӇu diӉn mӝt thông báo ngҳn
0 Tham sӕ đҫu tiên cӫa ˜
 là mӝt nҳm bҳt
ca sә (handle to window*
0 Tham sӕ thӭ hai là chuӛi ký tӵ xuҩt hiӋn trên phҫn
thn cӫa hӝp message
0 Tham sӕ thӭ ba là chuӛi ký tӵ xuҩt hiӋn trong thanh
tiêu đӅ cӫa hӝp thoҥi
0 Tham sӕ thӭ tư xác đӏnh loҥi nút nhҩn nào mà ta
muӕn nó xuҩt hiӋn trong hӝp thoҥi (0 là OK*
R8+| !;C
¢  

  


 ¢ 




¢


 


¢  ¢ 


.7%(;)
 01230 0$4$56 7  
.7%)
89:#7  
 '($!)
.7%)
; <$ 
-2 =$1>= $% &
.7%)
3#8?¢
@-ABBC¢
@ DC¢
@EBFAGH
39:"
*,'J 

0 TiӅn x lý
‘ include <windows h>

0 Khai báo hàm x lý thông điӋp cӫa ca sә:


|REU|T CA||BACK WndProc (HWN, UINT, WPARAM, |PARAM* ;

0 Hai hàm thành phҫn cӫa chương trình:


0 WinMain( *
0 WndProc( *
!K
L,
0 |   |oads an icon for use b a program
0 |   |oads a mouse cursor for use b a program
0    Obtains a graphic object, in this case a brush
used for painting the window's background
0 Ö
 Registers a window class for the program's window
0 ˜
 isplas a message box
0   Creates a window based on a window class
0 à   hows the window on the screen
0    irects the window to paint itself
!K
L, %)
0 ˜
 Obtains a message from the message queue
0 2˜
 Translates some keboard messages
0   à˜
 ends a message to a window procedure
0   Plas a sound file
0 
  Initiates the beginning of window painting
0 Ö  Obtains the dimensions of the window's client
area
0 2  isplas a text string
0 i  Ends window painting
0 ˜
 Inserts a "quit" message into the message
queue
0    Performs default processing of messages
32:

|5 
! " #$
% &'( &) * ' $+
! %CC)
0 |ӟp ca sә:
0 ùng đӇ đӏnh nghĩa các đһc điӇm cӫa ca sә
0 Và đӇ tҥo ra các ca sә
0 HiӇn thӏ ca sә, bҵng các hàm:
0 howWindow (hwnd, iCmdhow* ;
0 Tham sӕ đҫu là mӝt handle cho ca sә đưӧc tҥo bӣi
hàm CreateWindow
0 Tham sӕ thӭ hai xác đӏnh cách ca sә hiӇn thӏ trên
màn hình (normal, minimized, maximized*
0 UpdateWindow (hwnd* ;
0 ĐӇ vӁ ca sә lên màn hình
./
0+

*1 2+

8 +

! 
R.MN 
r Painting and Repainting
0 Khái niӋm vùng client (vùng làm viӋc*
0 Trong môi trưӡng kí tӵ, chương trình có thӇ vӁ
vào bҩt cӭ phҫn nào cӫa màn hình
0 Trong Windows, ta chӍ có thӇ hiӇn thӏ chӳ ha
phҫn đӗ hӑa trên vùng client
0 Windows báo cho thӫ tөc ca sә rҵng phҫn
client cӫa ca sә cҫn vӁ lҥi bҵng thông điӋp
WM_PAINT
r r Thông điӋp WM_PAINT
0 Khi khӣi đӝng, chương trình gӑi hàm UpdateWindow
0 Windows gi cho thӫ tөc ca sә thông điӋp
WM_PAINT
0 Thông điӋp nà thông báo cho thӫ tөc ca sә rҵng
vùng client cҫn đưӧc vӁ
0 Thӫ tөc ca sә sӁ nhұn đưӧc thông điӋp WM_PAINT
khi:
0 Mӝt vùng ca sә bӏ che đưӧc hiӋn

0 Ngưӡi dùng tha đәi kích thưӟc ca sә


r r Thông điӋp WM_PAINT (tiӃp*
0 Thông điӋp WM_PAINT đưӧc nhұn khi: (tt*
0 Chương trình s dөng các hàm crollWindow ha
crollC đӇ cuӝn phҫn client cӫa nó
0 Chương trình s dөng các hàm InvalidateRect ha
InvalidateRgn đӇ tҥo ra các thông điӋp WM_PAINT
0 Mӝt sӕ trưӡng hӧp khác Windows lưu phҫn màn hình nó
ghi lên và phөc hӗi lҥi:
0 Con trӓ chuӝt di chuӇn qua vùng client

0 Mӝt icon đưӧc kéo qua vùng client


r  Valid & Invalid Rectangles
0 Khi nhұn đưӧc mӝt thông điӋp WM_PAINT, nó thưӡng
chӍ cұp nhұt mӝt vùng chӳ nhұt nhӓ, gӑi là: ³Vùng
không hӧp lӋ´ ha ³Vùng cұp nhұt´
0 Windows đһt mӝt thông điӋp WM_PAINT vào hàng đӧi
khi có mӝt phҫn vùng client không hӧp lӋ
0 Mӛi mӝt ca sә có mӝt cҩu trúc vӁ đưӧc du trì ӣ bên
trong Cҩu trúc nà chӭa tӑa đӝ cӫa hình chӳ nhұt nhӓ
nhҩt bao quanh vùng không hӧp lӋ
0 Windows không đһt nhiӅu thông điӋp WM_PAINT
trong hàng đӧi (ViӋc x lý sӁ thӃ nào?*
 GI (Graphics evice Interface*
0 ĐӇ vӁ vùng client cӫa ca sә, ta s dөng các
hàm GI
0 Windows cung cҩp mӝt sӕ hàm GI đӇ ghi các
chuӛi văn bҧn ra vùng client cӫa ca sә
0 Ví dө:
0 rawText (hdc, TET ("Hello, Windows 98!"*, -r, &rect,
T_ING|E|INE | T_CENTER | T_VCENTER* ;
0 TextOut (hdc, x, , psText, i|ength* ;
 r evice Context (Ngӳ cҧnh
thiӃt bӏ*
0 HC (Handle evice Context*
0 Mӝt handle đơn giҧn chӍ là mӝt tham trӓ đӃn đӕi
tưӧng
0 Handle device context (hdc* là ³giҩ thông hành´ cӫa
ca sә đӃn các hàm GI
0 Ngӳ cҧnh thiӃt bӏ là mӝt cҩu trúc dӳ liӋu đưӧc du trì
bên trong bӣi GI (kӃt hӧp vӟi mӝt thiӃt bӏ hiӇn thӏ
đһc thù như màn hình ha má in*
0 Vӟi màn hình, mӝt device context thưӡng kӃt hӧp
vӟi mӝt ca sә trên màn hình
Ë =
O"!P%)
0 Thӵc hiӋn thao tác vӁ:
0 Khi mӝt chương trình cҫn vӁ, đҫu tiên nó cҫn nhұn
mӝt handle cӫa device context
0 Khi nhұn handle nà, Windows điӅn thông tin vào
cҩu trúc device context các giá trӏ mһc đӏnh
0 au khi mӝt chҩm dӭt viӋc vӁ, cҫn giҧi phóng
handle device context
ËË= (('((1
8(Q(
0 Đưӧc s dөng khi x lý thông điӋp WM_PAINT
0 Hai hàm đưӧc êu cҫu: BeginPaint và EndPaint
0 êu cҫu: handle ca sә, đӏa chӍ cӫa biӃn cҩu trúc PAINTTRUCT
(PAINTTRUCT ps;*
0 D(
?, nhiӋm vө:
0 óa nӅn cӫa vùng không hӧp lӋ đӇ chuҭn bӏ vӁ

0 ĐiӅn thông tin vào cҩu trúc 

0 Trҧ vӅ giá trӏ là handle device context

HC hdc;
0 |oҥi bӓ handle device context nà bӣi gӑi: &?
  Nhұn handle device context (tt*
0 ҥng cӫa x lý thông điӋp WM_PAINT
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps* ;
t  
EndPaint (hwnd, &ps* ;
return 0 ;
0 ViӋc gӑi liên tiӃp BeginPaint và EndPaint sӁ hӧp lý hóa
vùng không hӧp lӋ trưӟc đó
  Nhұn handle device context (tt*
0 Tu nhiên, không đưӧc dùng thӃ nà:
(;8R?><=*
(:HI;AQ=STTT
0 Vì sao?
0 o Windows không cұp nhұt vùng không hӧp lӋ
0 NӃu không gӑi BeginPaint và EndPaint (ha ValidateRect*,
Windows sӁ lҥi gi cho ta thông điӋp WM_PAINT khác
ĐiӅu đó làm treo chương trình vì không thӇ thoát đưӧc
  Cҩu trúc paint
(PAINTTRUCTURE*
0 Đӏnh nghĩa:

0 Windows điӅn thông tin vào các trưӡng khi chương trình
gӑi BeginPaint
  Cҩu trúc paint (TiӃp*
0 Chương trình chúng ta chӍ s dөng ba trưӡng đҫu tiên,
các trưӡng còn lҥi đưӧc s dөng bên trong bӣi
Windows
0 Chi tiӃt các trưӡng:
0 hdc: handle device context

0 fErase: cӡ FA|E (0*, xóa nӅn cӫa hình chӳ nhұt


không hӧp lӋ bҵng brush chӍ đӏnh trong lӟp ca sә
0 Nhҳc lҥi (trong WinMain*:

wndclass hbrBackground = (HBRUH*


GettockObject (WHITE_BRUH* ;
  Cҩu trúc paint (TiӃp*
0 Chi tiӃt các trưӡng (TiӃp*:
0 Trưӡng rcPaint cӫa PAINTTRUCT là mӝt cҩu trúc RECT

0 Cҩu trúc nà đӏnh nghĩa mӝt hình chӳ nhұt

0 ĐӇ giӟi hҥn vùng không hӧp lӋ

0 Và giӟi hҥn vӁ trong vùng nà

0 ĐӇ vӁ bên ngoài hình chӳ nhұt khi x lý thông điӋp WM_PAINT,


ta có thӇ gӑi:
0 InvalidateRect (hwnd, NU||, TRUE* ; trưӟc khi gӑi BeginPaint

0 |àm bҩt hӧp lӋ toàn vùng client khiӃn cho BeginPaint xóa nӅn

0 Ta có thӇ vӁ lҥi toàn bӝ vùng client khi nhұn đưӧc thông điӋp
WM_PAINT
0 Còn khi ta s dөng handle device context trҧ vӅ tӯ BeginPaint, ta
sӁ không vӁ bên ngoài hình chӳ nhұt rcPaint
ËU= %8(*C)
0 Thӵc sӵ hӳu dөng nӃu như:
0 Ta chӍ vӁ mӝt phҫn cӫa vùng client trong quá trình x lý
0 Hoһc cҫn handle device context (* cho mөc đích khác
0 ĐӇ nhұn mӝt  cӫa vùng client cӫa ca sә:
hdc = GetC (hwnd* ;
t  
ReleaseC (hwnd, hdc* ;
0 GetC và ReleaseC nên đưӧc gӑi theo cһp
0 Khác vӟi  nhұn đưӧc tӯ BeginPaint,  đưӧc nhұn
bӣi GetC có vùng chӳ nhұt bҵng toàn bӝ vùng client
0 Hàm GetWindowC trҧ vӅ mӝt hdc cho phép ta vӁ lên
toàn bӝ ca sә Tu nhiên cҫn phҧi x lý thêm thông
điӋp WM_NCPAINT cho vùng nonclient
ËV, *(1Q:
0 TextOut là hàm GI đӇ hiӇn thӏ chӳ
TextOut (hdc, x, , psText, i|ength* ;

0 Tham sӕ đҫu là handle device context trҧ vӅ tӯ GetC


hoһc BeginPaint
0 psText là mӝt con trӓ đӃn chuӛi ký tӵ
0 i|ength là sӕ ký tӵ có trong chuӛi
0 x, đӏnh nghĩa điӇm bҳt đҫu cӫa chuӛi (theo hӋ tӑa đӝ
logic*
ËW*+
7 57$
0 ĐӇ hiӇn thӏ nhiӅu hàng chӳ bҵng hàmTextOut ta
cҫn biӃt không tin vӅ kích thưӟc kí tӵ
0 ác đӏnh bҵng cách gӑi hàm:
GetstemMetricts(hdc,&tm*;
0 ĐӇ s dөng hàm nà, cҫn đӏnh nghĩa mӝt trưӡng
cҩu trúc:
TETMETRIC tm;
0 Và lҩ mӝt handle device context
hdc = GetC (hwnd* ;
GetTextMetrics (hdc, &tm* ;
ReleaseC (hwnd, hdc* ;
ËX!'J*(18(
ËYZP
O
0 ChӍ cҫn gӑi GetTextMetricts mӝt lҫn trong chương trình vì kích
thưӟc font hӋ thӕng không tha đәi
0 Nên đһt lӡi gӑi hàm nà trong viӋc x lý thông điӋp
WM_CREATE
0  dөng hai biӃn đӇ lưu chiӅu rӝng trung bình và tәng chiӅu
cao cӫa kí tӵ
static int cxChar, cChar ;
0 Nhұn chiӅu rӝng và chiӅu cao cӫa ký tӵ:
case WM_CREATE:
hdc = GetC (hwnd* ;
GetTextMetrics (hdc, &tm* ;
cxChar = tm tmAveCharWidth ;
cChar = tm tmHeight + tm tmExternal|eading ;
ReleaseC (hwnd, hdc* ;
return 0 ;
Ë[.7%#\8( )
Ë[.7%)
Ë[.7%)
Ë[.7%)
Ë[.7%)
Ë[.7%)
Ë[.7%)
39:"
Ë[.7%)
0 em xét chương trình
0 Thӫ tөc ca sә x lý  loҥi thông điӋp:
0 WM_CREATE, WM_PAINT, và WM_ETRO

0 Thông điӋp WM_CREATE


0 Đưӧc tҥo ra khi tҥo ra ca sә (hàm CreateWindow*

0 Nhұn mӝt device context bҵng lӡi gӑi GetC

0 Nhұn text metrics cӫa font hӋ thӕng bҵng GetTextMetrics

0 |ưu chiӅu rӝng trung bình cӫa ký tӵ trong cxChar

0 |ưu tәng chiӅu cao ký tӵ trong cChar

0 |ưu chiӅu rӝng trung bình cӫa các chӳ hoa trong cxCaps

cxCaps = (tm tmPitchAndFamil & r ?  : * * cxChar /  ;


0 Thông điӋp WM_PAINT
0 em các lӡi gӑi hàm TextOut(*«

0 Hҥn chӃ cӫa chương trình?


R!:

0 ĐӇ đưa các thanh cuӝn vào chương trình, ta


cҫn thêm vào các đӏnh danh W_VCRO||
(cuӝn dӑc* ha W_HCRO|| (cuӝn ngang*
trong hàm CreateWindow:
R!:%)
0 #DA
(?
Mӛi thanh cuӝn đӅu kӃt hӧp mӝt range (khoҧng,
vùng* và position (vӏ trí*
R!:%)

0 Mһc đӏnh, vùng cӫa thanh cuӝn có giá trӏ tӯ 0 ± r00


0 Có thӇ tha đәi các giá trӏ nà bҵng lӡi gӑi:
etcrollRange (hwnd, iBar, iMin, iMax, bRedraw* ;
0 iBar sӁ là: B_VERT hoһc B_HORZ

0 iMin, iMax: là các giá trӏ mӟi

0 bRedraw đһt bҵng TRUE nӃu ta muӕn Windows vӁ lҥi


thanh cuӝn dӵa trên vùng mӟi
0 Các giá trӏ thumb:
0 Đһt vӏ trí mӟi bҵng cu lӋnh:

etcrollPos (hwnd, iBar, iPos, bRedraw* ;


R!:%)

0 NhiӋm vө:
0 Cӫa Windows:
0 Quҧn lý x lý thông điӋp thanh cuӝn
0 Đҧo màn hình khi ngưӡi dùng nhҩp vào thanh cuӝn
0 i chuӇn thumb
0 Gi các thông điӋp thanh cuӝn đӃn thӫ tөc ca sә
0 Cӫa chương trình:
0 Khӣi tҥo vùng và vӏ trí thanh cuӝn
0  lý thông sӕ thanh cuӝn
0 Cұp nhұt vӏ trí thumb
0 Tha đәi nӝi dung vùng client
R!:%)
0 Các thông điӋp thanh cuӝn:
0 WM_VCRO|| (cuӝn dӑc*

0 WM_HCRO|| (cuӝn ngang*

0 Các tham sӕ đi kèm: wParam và lParam


0 Thông sӕ lParam có thӇ bӓ qua

0 Thông sӕ wParam đưӧc chia thành mӝt word thҩp


và mӝt word cao
0 Word thҩp chӍ đӏnh tác đӝng cӫa chuӝt lên thanh
cuӝn (xem hình dưӟi*
R!:%)
0 Các mã thông báo cӫa tác
đӝng đưӧc đӏnh nghĩa như
hình bên:
0 Trong đó: các đӏnh danh
|EFT, RIGHT đӕi vӟi các
thanh cuӝn ngang;
0 UP,OWN,TOP,BOTTOM
đӕi vӟi thanh cuӝn dӑc
!:%)
R!:%)
0 Ta có thӇ di chuӇn thumb bҵng cách đӏnh
vӏ trӓ chuӝt trên thumb thanh cuӝn và nhҩn
chuӝt ĐiӅu nà tҥo ra thông điӋp thanh
cuӝn vӟi mã thông báo B_THUMBTRACK
và B_THUMBPOITION
0 Chi tiӃt vӅ x lý thông điӋp cuӝn, V xem
trong tài liӋu (Programming Windows«*
R.7%#\8(Ë)
R.7%)
.7%)
0 KӃt quҧ
=  ('(!(1%)
0 Ngoài ra, ta có thӇ nhұn mӝt hdc áp dөng
cho toàn ca sә không chӍ vùng client:
hdc = GetWindowC (hwnd*;
t à 

ReleaseC (hwnd, hdc*;
0 Tu nhiên trong trưӡng hӧp nà ta phҧi bү
thông điӋp WM_NCPAINT, đӇ vӁ trên vùng
nonclient
=  ('(!(1%)
0 Mӝt hàm khác đӇ nhұn hdc:
hdc = CreateC (pszriver, pszevice, pszOutput, pata* ;
t à 

eleteC (hdc* ;
0 Ví dө, ta có thӇ nhұn mӝt handle device
context cӫa toàn màn hình:
hdc = CreateC (TET ("IP|A"*, NU||, NU||, NU||* ;
=  ('(!(1%)
0 Khi ta chӍ cҫn nhұn thông tin vӅ device
context, ta có thӇ s dөng hàm CreateIC:
hdc = CreateIC (TET ("IP|A"*, NU||, NU||, NU||* ;

0 |ưu ý rҵng: Ta không thӇ vӁ lên thiӃt bӏ bҵng


cách s dөng handle thông tin context nà
= +
('(!(1
0 evice Context chӍ đӃn mӝt thiӃt bӏ vұt lý
0 Ta có thӇ lҩ thông tin vӅ thiӃt bӏ bҵng lӡi gӑi
hàm GeteviceCap (get device capabilities*:
iValue = GeteviceCaps (hdc, iIndex* ;
0 iIndex là mӝt trong nhӳng đӏnh danh đưӧc
đӏnh nghĩa trong WINGI H
0 Ví dө: giá trӏ iIndex cӫa HORZE, VERTRE
GeteviceCaps trҧ vӅ chiӅu rӝng, cao cӫa
thiӃt bӏ
.7%('! )
0 em thêm tài liӋu
0 |ưu ý các điӇm sau:
- Khai báo cҩu trúc devcaps[]
.7%)
-  lý các thông điӋp:
.7%)
.7%)
0 KӃt quҧ
!:7!
0 Windows s dөng evice Context đӇ lưu các
thuӝc tính xác đӏnh cách các hàm GI hoҥt
đӝng
0 Khi chúng ta nhұn mӝt handle device context,
Windows đһt tҩt cҧ các thuӝc tính theo giá trӏ
mһc đӏnh
0 Ta có thӇ s dөng các hàm đӇ nhұn hoһc
tha đәi các giá trӏ nà
!:7!%)
| :('(!(1
0 Khi ta gӑi hàm GetC, BeginPaint ta nhұn
đưӧc mӝt handle device context vӟi các giá
trӏ mһc đӏnh đӕi vӟi các thuӝc tính
0 Các giá trӏ nà sӁ mҩt khi device context
đưӧc giҧi phóng (au lӡi gӑi: ReleaseC
ha EndPaint*
| :('(!(1%)
0 NӃu ta cҫn s dөng các thông sӕ device
context không mһc đӏnh, ta phҧi khӣi tҥo
device context mӛi lúc ta nhұn handle context
mӟi:
| :('(!(1%)
0 Ta có thӇ lưu lҥi các giá trӏ thuӝc tính khi trҧ lҥi
device context
0 Cách thӵc hiӋn:
0 Đһt C_OWNC trong lӟp ca sә khi đăng ký
C\(]!#RA&A>;^!#R.A&A>;^!#RQ;=!I
ü
à à !˜ "#$ %&'  "#(
) *   &
(*+,- .$ à 
+/à "#0à1*
| :('(!(1%)
0 Ta chӍ phҧi khӣi tҥo các thuӝc tính evice
Context mӝt lҫn, khi x lý thông điӋp
WM_CREATE
| :('(!(1%)
0 |ưu trҥng thái cӫa evice Context bҵng lӡi
gӑi:
idaved = aveC (hdc* ;
0 Khi muӕn trӣ lҥi trҥng thái trưӟc cӫa evice
Context, ta thӵc hiӋn lӡi gӑi:
RestoreC (hdc, idaved* ;
| :('(!(1%)
0 Ta có thӇ gӑi aveC mà không cҫn giá trӏ
trҧ vӅ:
aveC (hdc* ;
0 ĐӇ khôi phөc trҥng thái:
RestoreC(HC, int*;
0 Ví dө:
RestoreC (hdc, -r* ;
.M ', K
_

0 Trên lý thuӃt, tҩt cҧ các thiӃt bӏ phҫn cӭng chӍ cҫn có


hai hàm    (vӁ điӇm* và    (lҩ điӇm* đӇ
thӵc hiӋn thao tác vӁ
0 Ví dө, viӋc vӁ mӝt đưӡng thҷng chӍ cҫn thӵc hiӋn lӡi gӑi
hàm GI    nhiӅu lҫn vӟi sӵ tha đәi cӫa tӑa đӝ x
và  tương ӭng
0 Trên thӵc tӃ, ta có thӇ thӵc hiӋn tҩt cҧ các thao tác vӁ
chӍ cҫn vӟi hai hàm nà (   và   *, vҩn đӅ
chӍ là hiӋu năng
.M %?1()
0   2  cung cҩp điӇm khӣi đҫu cho viӋc vӁ
các hình
0 Hàm    đһt mӝt điӇm tҥi tӑa đӝ xác đӏnh x và 
vӟi mӝt màu nào đó, đӏnh dҥng hàm như sau:
#(?1(%@1@\@!)I
0 Tham sӕ đҫu tiên là mӝt handle cho device context
0 Tham sӕ thӭ  và  xác đӏnh tӑa đӝ cӫa điӇm cҫn vӁ
0 Tham sӕ cuӕi cùng thuӝc kiӇu CO|ORREF xác đӏnh màu
0 Hàm    trҧ vӅ kӃt quҧ là màu cӫa mӝt điêmr
tҥi mӝt ví trí nào đó:
!]S(?1(%@1@\)I
.M K
_

0 Windows có thӇ vӁ các đưӡng thҷng, elip và các đưӡng
Bezier
0 Các hàm thӵc hiӋn vӁ như:
0 |2 ! VӁ đưӡng thҷng

0  và 2 ! VӁ các đưӡng kӃt nӕi vӟi nhau


0  !VӁ nhiӅu polline
0 c ! VӁ mӝt đưӡng elip

0  3 (  32 ! VӁ các đưӡng Bezier


#
|(%)
0 Functions that draw lines:
0 c 2 c
c raw elliptical lines
0  raws a series of connected
straight lines and Bezier splines
(These three functions are not supported under
Windows 98 *
#
|(%)
ome functions that draw lines but that also
fill the enclosed area within the figure the
draw These functions are:
0 Ö 
 raws a rectangle
0 i  raws an ellipse
0 Ö Ö  raws a rectangle with rounded
corners
0  raws a part of an ellipse that looks like a pie
slice
0 à  raws part of an ellipse formed b a chord
#
|(%)
0 Five attributes of the device context affect the
appearance of lines that ou draw using
these functions:
0 current pen position (for |2 , 2 ,
 32 , and c 2 onl*
0 pen
0 background mode
0 background color
0 and drawing mode
#
|(%)
0 To draw a straight line, ou must call two
functions
0 The first function specifies the point at which
the line begins, and the second function
specifies the end point of the line:
0 MoveToEx (hdc, xBeg, Beg, NU||* ;
0 |ineTo (hdc, xEnd, End*
0 If ou call |2 without first setting the
current position, it draws a line starting at the
upper left corner of the client area
#
|(%)
0 If ou ever need the current position, ou can
obtain it b calling
GetCurrentPositionEx (hdc, &pt* ;
where  is a POINT structure
#
|(%)
0 Example:
#
|(%)
0 efine an arra of 5 points (r0 values* that
define the outline of a rectangle

0 Now ou need onl use ˜ 2 i for the


first point and |2 for the successive
points:
#
|(%)
0 When ou have an arra of points that ou
want connected with lines, ou can draw the
lines more easil using the  function
Polline (hdc, apt, 5* ;
0 This statement draws the same rectangle as
in the code shown above
0 The last argument is the number of points
#
|(%)
0 A(
( (hdc, x|eft, Top, xRight, Bottom* ;
#
|(%)
0 &( (hdc, x|eft, Top, xRight, Bottom* ;
#
|(%)
0 A:A( (hdc, x|eft, Top, xRight, Bottom,
xCornerEllipse, CornerEllipse* ;
#
|(%)
0 For more draw function in more detail, please look
at our book (Programming Windows 5th Editon*
0 Homework (Ví dө: #(;'(*:
0 Write one program like this to displa a sine curve
?!( 
0 How can write a program that runs "forever´?
0 Example:
0 ispla messages on program screen
0 raw something on program screen
A C

How?
0 on¶t put a àü2Öi loop in the WM_PAINT
message
0 etting a Windows timer to send WM_TIMER
messages
0 But Inconvenience?
0 Uses ˜
 function
0 Example of a ˜
 call:
?((8(
( (&msg, NU||, 0, 0, PM_REMOVE* ;
?((8(
(
?((8(
( (&msg, NU||, 0, 0, PM_REMOVE* ;
0 Parameters:
0 A pointer to a MG structure
0 A window handle
0 Two values indicating a message range* are identical to
those of ˜
4
0 etting the second, third, and fourth parameters to
NU|| or 0 indicates that we want ˜
 to
return all messages for all windows in the program
0 The last parameter to ˜
 is set to
PM_REMOVE if the message is to be removed from
the message queue (ou can set it to
PM_NOREMOVE if the message isn't to be removed*
?((8(
(%)
0 ˜
 doesn't return control to a program
unless it retrieves a message from the program's
message queue But ˜
 alwas returns
right awa regardless whether a message is present
or not
0 When there's a message in the program's message
queue, the return value of ˜
 is TRUE
(nonzero* and the message can be processed as
normal When there is no message in the queue,
˜
 returns FA|E (0*
=  (
(
?((8(
(
=(
0 ou can't use ˜
 to remove
WM_PAINT messages from the message queue,
this isn't reall a problem
0 ˜
 doesn't remove WM_PAINT
messages from the queue either The onl wa to
remove a WM_PAINT message from the queue is
to validate the invalid regions of the window's
client area
0 If ou process a WM_PAINT message normall
after retrieving it from the queue with
˜
, ou'll have no problems
=(%)
0 What ou can't do is use code like this to empt our
message queue of all messages:
C( (PeekMessage (&msg, NU||, 0, 0, PM_REMOVE** ;
0 This statement removes and discards all messages from our
message queue except WM_PAINT
0 If a WM_PAINT message is in the queue, ou'll be stuck inside
the while loop forever
=(%)
0 WM_QUIT message is explicitl checked
0 ou don't have to do this in a normal message loop,
because the return value of ˜
 is FA|E (0*
when it retrieves a WM_QUIT message
0 ˜
 uses its return value to indicate whether a
message was retrieved, so the check of WM_QUIT is
required
=(%)
0 If the return value of ˜
 is TRUE,
the message is processed normall
0 If the value is FA|E, the program can do
some work (such as displaing et another
random rectangle* before returning control to
Windows
.7%AA()

void CA(
( (HWN hwnd*

HBRUH hBrush ;
HC hdc ;
RECT rect ;

if (cxClient == 0 || cClient == 0*
return ;

#(A( (&rect, rand(* % cxClient, rand(* % cClient, rand(* % cxClient, rand(* % cClient* ;

hBrush = CreateolidBrush (RGB (rand (* % 56, rand (* % 56, rand (* % 56** ;


hdc = GetC (hwnd* ;
`A( (hdc, &rect, hBrush* ;

ReleaseC (hwnd, hdc* ;


eleteObject (hBrush* ;
}
! 
UD,7
0 Giӟi thiӋu:
0 Bàn phím và chuӝt là hai thành phҫn nhұp liӋu
chuҭn quan trӑng đӕi vӟi ngưӡi s dөng
0 Trong nhiӅu ӭng dөng (như game, drawing* thì
thiӃt bӏ chuӝt đưӧc s dөng rҩt phә biӃn
0 Tu nhiên, không thӇ thiӃu bàn phím vì chuӝt
không có khҧ năng nhұp liӋu phong phú như thiӃt
bӏ nà
0 Trong chương nà chúng ta sӁ khҧo sát vӅ:
0 Cơ sӣ vӅ bàn phím
0 Các thông điӋp và x lý các thông điӋp bàn phím
3(\!D
0 Thông tin tӯ bàn phím đưӧc gi đӃn thӫ tөc
ca sә dưӟi dҥng thông điӋp
0 Có khá nhiӅu thông điӋp bàn phím tu nhiên
chúng ta không cҫn phҧi x lý hӃt chúng
0 Ngưӡi lұp trình cҫn xác đӏnh thông điӋp nào
cҫn x lý, thông điӋp không cҫn thiӃt đӇ bӓ
qua
<

(3(\!
0 Trong chương trình, chúng ta không cҫn x lý
hӃt nhӳng thông điӋp phím do Windows chuӇn
đӃn:
0 Các giao tiӃp vӟi bàn phím: phím nóng, giao tiӃp vӟi
bàn phím cӫa hӝp thoҥi
0 Các thành phҫn điӅu khiӇn (như check box, radio,
button * đӅu có giao tiӃp bàn phím
0 Chương trình cӫa chúng ta không cҫn phҧi x lý
thông điӋp bàn phím trong các trưӡng hӧp nà
;aS(`:b
0 Các ӭng dөng, các ca sә con cӫa ӭng dөng
giao tiӃp chung vӟi mӝt bàn phím
0 Vòng lһp thông điӋp chӏu trách nhiӋm gi thông
điӋp đӃn thӫ tөc ca sә bҵng hàm
ispatchMessage tương ӭng vӟi ca sә
0 Trong mӝt thӡi điӇm chӍ có mӝt ca sә có focus,
và chӍ có thӫ tөc ca sә cӫa ca sә nà có khҧ
năng nhұn đưӧc thông điӋp
0 Mӝt C cho phép xác đӏnh ca sә có đưӧc
điӅu khiӇn
;aS(`:b%)
0 Mӝt ca sә active luôn là ca sә nҵm trên
cùng, các điӇu khiӇn trong ca sә có đưӧc
điӅu khiӇn đӅu có dҩu hiӋu đӇ nhұn biӃt
0 Các thông điӋp
0 WM_ETFOCU
0 và WM_KI||FOCU
cho biӃt thӡi điӇm mà ca sә có đưӧc điӅu
khiӇn hoһc mҩt điӅu khiӇn
Ú:(:(#\B
0 Khi ngưӡi dùng nhҩn và nhҧ phím trên bàn
phím, Windows và các trình điӅu khiӇn thiӃt bӏ
sӁ diӉn dӏch scan code cӫa phҫn cӭng sang
hình thӭc thông điӋp
0 Chúng đưӧc lưu trӳ vào hàng đӧi hӋ thӕng
0 Windows chӍ gi các thông điӋp đӃn hàng đӧi
ӭng dөng khi ӭng dөng đã x lý xong thông
điӋp chuӝt ha bàn phím trưӟc đó
Ú:(:(c%)
0 Hàng đӧi cӫa hӋ thӕng là hàng đӧi du nhҩt do
Windows quҧn lý cho viӋc tiӅn x lý thông tin
nhұp vào tӯ bàn phím và chuӝt
0 |ý do:
0 Đҧm bҧo quá trình đӗng bӝ hóa đӕi vӟi mӑi
chương trình
0 NӃu như chương trình cӫa chúng ta chưa kӏp x
lý xong
3(\(!(
0 Các thông điӋp bàn phím, phn biӋt:
0 Thông điӋp phím gõ (3(\( (
()
0 Thông điӋp ký tӵ (!( (
()
3(\(8(
(
0 Khi ta nhҩn phím, Windows sӁ các đһt thông
điӋp vào hàng đӧi cӫa ӭng dөng
0 Các thông điӋp gӗm có:

0 Các thông điӋp nà lҫn lưӧt sӁ đưӧc gi đӃn


WndProc
#\( =\( 
3(\(
0 Các thông điӋp nà thưӡng đưӧc phát sinh đӕi
vӟi các tә hӧp phím kӃt hӧp vӟi phím Alt (V:
Alt-Tab, Alt-Esc*
0 Tu nhiên trӯ khi muӕn thӵc hiӋn nhӳng tác vө
đһc biӋt, chúng ta mӟi bү các thông điӋp nà
0 Thông thưӡng, chúng thưӡng đưӧc chuӇn đӃn
cho (d;C? x lý*
0 KӃt quҧ là ta sӁ nhұn đưӧc các thông điӋp hӳu
ích hơn (V: WM_C|OE, vӟi tә hӧp Alt-F4*
#\( =\( 
3(\(
0 Đoҥn mã sau làm cho các phím chӭc năng
Alt-ke cӫa Windows tê liӋt

0 Đӕi vӟi thông điӋp phím gõ hӋ thӕng, ta nên


gӑi hàm efWindowsProc chӭ không nên trҧ
vӅ giá trӏ 0
#\( =\( 
3(\(
0 Các thông điӋp WM_KEOWN và
WM_KEUP thưӡng đưӧc sinh ra bӣi các phím
thông thưӡng không kӃt hӧp vӟi Alt
0 Vӟi các thông điӋp phím gõ, tham sӕ wParam sӁ
chӭa mã ҧo cӫa phím (virtual ke code*
0 Tham sӕ lParam chӭa các thông tin vӅ trҥng thái
cӫa phím nhҩn
.:(\(
0 Đưӧc chӭa trong tham sӕ wParam đӕi vӟi các
thông điӋp WM_KEOWN, WM_KEUP,
WM_KEOWN và WM_KEUP
0 Mã nà là các hҵng cho biӃt giá trӏ cӫa phím
đưӧc nhҩn ha nhҧ
0 Mã cӫa phím thұt là mã đưӧc phát sinh tӯ phҫn
cӭng vұt lý cӫa bàn phím (gӑi là mã quét*
0 Tұp giá trӏ phím tәng quát đưӧc đӏnh nghĩa theo
kiӇu đӝc lұp vӟi thiӃt bӏ gӑi là các mã phím ҧo
.:(\(%)
0 Các giá trӏ phím ҧo đưӧc đӏnh nghĩa vӟi tiӃp đҫu
ngӳ VK_xxx

0 Ba trong bӕn phím ҧo đҫu tiên dành cho chuӝt


0 Ta sӁ không nhұn đưӧc mã ҧo cӫa phím chuӝt
trong các thông điӋp do bàn phím gi đӃn
.:(\(%)
0 Mã phím ҧo bҵng vӟi mã ACII cӫa ký tӵ mà
phím thӇ hiӋn

0 Chương trình Windows hҫu như không dùng


đӃn thông điӋp phím gõ đӕi vӟi các mã ҧo nà
mà dӵa vào thông điӋp ký tӵ gõ WM_CHAR
*(ï  <d 
0 Trong bӕn thông điӋp phím gõ (WM_KEOWN,
WM_KEUP, WM_KEOWN,
WM_KEUP*:
0 wParam mang mã phím ҧo
0 lParam chӭa thông tin cӫa phím đưӧc gõ, gӗm có:
A((!:
0 ChiӃm r6 bit, thӇ hiӋn sӕ lҫn phím đưӧc nhҩn
0 Thông thưӡng trưӡng nà luôn có giá trӏ là r
0 NӃu như mӝt phím đưӧc nhҩn, Windows gi
mӝt thông điӋp WM_KEOWN hoһc
WM_KEOWN kèm theo giá trӏ cӫa
trưӡng nà bҵng sӕ lҫn lһp phím
0 Vӟi WM_KEUP hoһc WM_KEUP giá trӏ
nà luôn bҵng r
Q&8#!(
0 |à mã đưӧc sinh ra do phҫn cӭng cӫa
bàn phím
0 Thông thưӡng ta không cҫn quan tm
đӃn mã nà
&1((3(\`

0 ChiӃm đӝ dài r bit trong lParam
0 Cӡ nà có giá trӏ là r nӃu như phím đưӧc nhҩn
là mӝt trong nhӳng phím mӣ rӝng
0 Đưӧc đһt là r vӟi phím Alt và Ctrl bên phҧi bàn phím,
các phím di chuӇn con trӓ (bao gӗm cҧ phím Insert
và elete* phím (/* và phím Enter trong vùng phím sӕ
và phím Num |ock
0 Thông thưӡng Windows bӓ qua cӡ nà
!(1!(
0 Đưӧc đһt là r đӕi vӟi các thông điӋp WM_KEUP và
WM_KEOWN (phím Alt đưӧc nhҩn kèm*
0 Đưӧc đһt bҵng 0 đӕi vӟi các thông điӋp WM_KEUP và
WM_KEOWN, trӯ hai trưӡng hӧp:
0 NӃu ca sә active bӏ thu nhӓ, tҩt cҧ phím nhҩn sinh ra
thông điӋp WM_KEUP và WM_KEOWN
NӃu như phím Alt không đưӧc nhҩn trưӡng Context
Code đưӧc đһt là 0 (Windows s dөng các thông điӋp
WM_KEUP và WM_KEOWN đӇ cho ca
sә thu nhӓ nà không x lý phím nhҩn*
0 Mӝt sӕ bàn phím nưӟc ngoài, mӝt sӕ kí tӵ đưӧc sinh ra
bӣi viӋc nhҩn kèm các phím hift, Ctrl, hoһc Alt Trong
trưӡng hӧp nà, trưӡng Context Code đưӧc đһt bҵng
r nhưng các thông điӋp không phҧi là các thông điӋp
sstem kestroke
?(':3(\#(
0 Trưӡng nà cho biӃt trҥng thái cӫa phím trưӟc đó khi
phát sinh ra thông điӋp
0 Có giá trӏ bҵng 0 nӃu như phím trưӟc đó đang ӣ trong
trҥng thái up, bҵng r nӃu như phím ӣ trҥng thái down
0 Vӟi WM_KEUP và WM_KEUP trưӡng nà có giá
trӏ là r
0 Vӟi WM_KEOWN, WM_KEOWN nó có giá trӏ
bҵng 0 hoһc r (r vӟi trưӡng hӧp lһp phím*
*#(
0 Cho biӃt trҥng thái dӏch chuӇn cӫa phím
0 Giá trӏ 0 nӃu phím đang đưӧc nhҩn
0 Bҵng r nӃu phím đang đưӧc nhҧ
0 Vӟi WM_KEOWN và WM_KEOWN trưӡng
nà luôn có giá trӏ 0
0 Vӟi WM_KEUP hoһc WM_KEUP trưӡng nà
luôn có giá trӏ r
#d#(
0 Khi x lý thông điӋp phím gõ đôi khi ta cũng cҫn phҧi
biӃt mӝt sӕ trҥng thái cӫa các phím như hift, Ctrl và Alt
có đưӧc nhҩn kèm ha không, hoһc Caps |ock, Num
|ock, croll |ock đang đưӧc tҳt ha mӣ
0 Ta có thӇ biӃt đưӧc nhӳng thông tin nà bҵng lӡi gӑi
hàm GetKetate V:
0 itate = GetKetate(VK_HIFT*;
*+
7 
e
*+
2$
8 , J:\
0  : Tҥo con nhá cho mӝt ca sә
0   : Đһt vӏ trí con nhá trong ca sә
0 à  : HiӇn thӏ con nhá
0 á : Ҭn con nhá
0   : Hӫ con nhá
.7%*\()
0 Chương trình Tper
! 
V!Ef*
8 P
g
0 Các thao tác đӕi vӟi chuӝt:
0  

0  5  

0 



0 wndclass hCursor = |oadCursor (NU||, IC_ARROW* ;


8 ,  !"
0 ác đӏnh sӵ hiӇn diӋn cӫa chuӝt:
fMouse = GetstemMetrics (M_MOUEPREENT* ;
0 ác đӏnh sӕ nút nhҩn:
cButtons = GetstemMetrics (M_CMOUEBUTTON* ;
!+
:'h

(
0 Bao gӗm:

0 ác đӏnh tӑa đӝ cӫa chuӝt:


x = |OWOR (lParam* ;
 = HIWOR (lParam* ;
.7%!()
.7%)
0 KӃt quҧ
!+
:'h

(
0 Các thông điӋp bao gӗm:

0 Thông thưӡng ta đưa các thông điӋp nà cho


efWindowProc x lý
*+
i*(
0 Thông điӋp WM_NCHITTET đi trưӟc tҩt cҧ các thông
điӋp vùng client và nonclient
0 Các ӭng dөng thưӡng đưa thông điӋp nà cho
efWindowProc x lý, giá trӏ trҧ khi x lý thông điӋp
WM_NCHITTET sӁ là thông sӕ wParam trong các thông
điӋp chuӝt
0 HTC|IENT Vùng client
0 HTNOWHERE Không thuӝc ca sә nào
0 HTTRANPARENT A window covered b another window
0 HTERROR Tҥo ra tiӃng beep
*+
i*(%)
0 NӃu giá trӏ trҧ vӅ là HTC|IENT, Windows sӁ chuӇn tӑa
đӝ màn hình thành tӑa đӝ vùng client và tҥo ra mӝt
thông điӋp chuӝt vùng client
0 Ta có thӇ cҩm chӭc năng chuӝt bҵng cách bү thông
điӋp:
(;8R=!<**&#*
(:%|A&#E|*)*=Q;&A&I
*+
+

0 Windows s dөng WM_NCHITTET đӇ tҥo ra các
thông điӋp chuӝt khác
0 Ví dө:
0 ouble-click vào sstem menu icon -> WM_NCHITTET
0 Thông điӋp WM_NC|BUTTONB|C|K đưӧc đһt vào
hàng đӧi vӟi wParam bҵng HTMENU
0 Thông điӋp WM_COMMAN vӟi wParam bҵng
C_C|OE
0 efWindowProc gi thông điӋp WM_C|OE cho thӫ tөc
ca sә
! 
VDfZj=
*k<%*<8&A)
=O
  !"
0 Tác vө mang tính đӏnh kǤ
0 Đưӧc cài đһt trong các ӭng dөng đӇ thӵc
hiӋn các nhiӋm vө:
0 Đa nhiӋm
0 Cұp nhұt trҥng thái
0 Cơ chӃ tӵ đӝng
0 ThiӃt kӃ các ӭng dөng hoҥt hình
8  :2
0 Thông điӋp WM_TIMER đưӧc x lý tuҫn tӵ
và bình đҷng như tҩt cҧ các thông điӋp khác
0 Windows sӁ không đһt vào hàng đӧi hàng
loҥt thông điӋp WM_TIMER
0 Ta không thӇ biӃt đưӧc có bao nhiêu thông
điӋp WM_TIMER bӏ bӓ qua
? 
 
*<8&A
0 Phương pháp r: êu cҫu Windows gi
thông điӋp WM_TIMER gi đӃn hàm
WndProc bҵng hàm:
etTimer (hwnd, r, uiMsecInterval, NU||* ;
0 Các tham sӕ:
0 Timer I, khác 0
0 ӕ nguên -bit không dҩu xác đӏnh mili gi
(60,000 -> r phút*
0 Hӫ bӓ bӝ đӏnh thӡi Timer bҵng lӡi gӑi:
KillTimer (hwnd, r* ; Tham sӕ thӭ  là Timer I
? 
 %)
0 Khi nhұn đưӧc WM_TIMER, wParam sӁ xác
đӏnh I cӫa Timer
0 Cách s dөng
0 Đӏnh nghĩa I cho mӛi Timer:
‘define TIMER_EC r
‘define TIMER_MIN 
0 Tҥo ra các Timer:
etTimer (hwnd, TIMER_EC, r000, NU||* ;
etTimer (hwnd, TIMER_MIN, 60000, NU||* ;
? 
 %)
0 Cҩu trúc x lý:
.7%D((( )
case WM_CREATE:
etTimer (hwnd, I_TIMER, r000*, NU||* ;
etTimer (hwnd, I_TIMER, r500*, NU||* ;
return 0 ;

case WM_TIMER :
MessageBeep (-r* ;
fFlipFlop = !fFlipFlop ;
InvalidateRect (hwnd, NU||, FA|E* ;
return 0 ;

case WM_PAINT :
hdc = BeginPaint (hwnd, &ps* ;

GetClientRect (hwnd, &rc* ;


hBrush = CreateolidBrush (fFlipFlop ? RGB(55,0,0* : RGB(0,0,55** ;
FillRect (hdc, &rc, hBrush* ;

EndPaint (hwnd, &ps* ;


eleteObject (hBrush* ;
return 0 ;

case WM_ETRO :
KillTimer (hwnd, I_TIMER* ;
PostQuitMessage (0* ;
return 0 ;
? 
Ë
0 Gӑi trӵc tiӃp mӝt hàm x dӵng cho viӋc x lý
đӏnh thӡi (gӑi là call-back*
0  dӵng hàm:

0 ThiӃt lұp bӝ đӏnh thӡi:


etTimer (hwnd, iTimerI, iMsecInterval, TimerProc* ;
.7%D(((Ë)
VOI CA||BACK TimerProc (HWN hwnd, UINT message, UINT
iTimerI, WOR dwTime*

static BOO| fFlipFlop = FA|E ;


HBRUH hBrush ;
HC hdc ;
RECT rc ;

MessageBeep (-r* ;
fFlipFlop = !fFlipFlop ;

GetClientRect (hwnd, &rc* ;

hdc = GetC (hwnd* ;


hBrush = CreateolidBrush (fFlipFlop ? RGB(55,0,0* : RGB(0,0,55** ;

FillRect (hdc, &rc, hBrush* ;


ReleaseC (hwnd, hdc* ;
eleteObject (hBrush* ;
}
? 
R
0 ThiӃt lұp bҵng lӡi gӑi hàm:
iTimerI = etTimer (NU||, 0, wMsecInterval, TimerProc* ;
0 Hӫ bӓ: KillTimer (NU||, iTimerI* ;

You might also like