Professional Documents
Culture Documents
0 ơ đӗ (hình bên*
0 Mô tҧ («*
0 *(5
,6
%
*+ , *+ ,
'( &
$!)
¢
¢!
"#$% &
-'($!)./
Ë.7%(8
)
include <windows h>
int WINAPI WinMain (HINTANCE hInstance, HINTANCE hPrevInstance,
PTR szCmd|ine, int iCmdhow*
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
¢
¢
¢
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 |à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 |ưu chiӅu rӝng trung bình cӫa các chӳ hoa trong cxCaps
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*
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* ;
0 5
0
case WM_TIMER :
MessageBeep (-r* ;
fFlipFlop = !fFlipFlop ;
InvalidateRect (hwnd, NU||, FA|E* ;
return 0 ;
case WM_PAINT :
hdc = BeginPaint (hwnd, &ps* ;
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:
MessageBeep (-r* ;
fFlipFlop = !fFlipFlop ;