Professional Documents
Culture Documents
Lap Trinh C Tren Windows121
Lap Trinh C Tren Windows121
LP TRNH C TRN
WINDOWS
Trang 1
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Chng 1
TNG QUAN LP TRNH C TRN WINDOWS
1.1. M U
Phn tip theo s trnh by nhng khi nim v yu cu cn bn ca vic lp trnh C trn
Windows. Ngoi ra, phn ny cng gii thiu cc c ch v cc cng c m h iu hnh cung
cp cho ngi lp trnh hay ngi pht trin cc ng dng trn Windows.
Cui chng l phn xy dng mt chng trnh n gin nht trn Windows. Chng
trnh ny c xem nh l khun mu ca mt chng trnh ng dng in hnh, v hu ht cc
on chng trnh c vit minh ha trong sch u ly chng trnh ny lm khung sn
pht trin cho ph hp vi tng yu cu. Thm vo , mt s kiu d liu mi c nh ngha
trn Windows v nhng qui c v cch t tn bin cng c gii thiu trong phn ny.
Phn chi tit v chuyn su hn ca vic lp trnh bng ngn ng C trn mi trng
Windows s c trnh by trong cc chng tip theo.
Gia thp nin 80, cng ty phn mm my tnh Microsoft cng b phin bn u tin ca
dng h iu hnh Windows l Microsoft Windows 1.0. y l h iu hnh dng giao din
ha khc vi giao din k t (text hay console) ca MS-DOS. Tuy nhin phi n phin bn
th hai (Windows 2.0 - thng 11 nm 1987) th mi c bc ci tin ng k, l s m rng
giao tip gia bn phm v thit b chut v giao din ha (GUI-Graphic User Interface) nh
trnh n (menu) v hp thoi (dialog). Trong phin bn ny Windows ch yu cu b vi x l
Intel 8086 hay 8088 chy real-mode truy xut 1 megabyte b nh.
Thng 5 nm 1990, Microsoft cng b phin bn tip theo l Windows 3.0. S thay i
ln trong phin bn ny l Windows 3.0 h tr protected-mode 16 bit ca cc b vi x l 286,
386, v 486 ca Intel. S thay i ny cho php cc ng dng trn Windows truy xut 16
megabyte b nh. Tip bc vi s pht trin l phin bn Windows 3.1 ra i nm 1992,
Microsoft a cng ngh Font TrueType, m nhc (multimedia), lin kt v nhng i tng
(OLE- Object Linking and Embedding), v a ra cc hp thoi chung c chun ha.
Trang 2
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trong s pht trin mnh m ca nhng thp nin 90, Microsoft cng b tip dng h
iu hnh Windows vi ng dng cng ngh mi (1993). H iu hnh ny ly tn l
Windows NT (Windows New Technology), y l phin bn h iu hnh u tin ca
Windows h tr 32 bit cho b x l 386, 486 v Pentium. Trong h iu hnh ny th cc ng
dng phi truy xut b nh vi a ch l 32-bit v cc tp lnh hay ch th 32-bit. Ngoi ra
Windows NT cng c thit k chy cc b vi x l (CPU) khc ngoi Intel v c th chy
trn cc my trm (workstation).
Song song vi s pht trin phn mm th cng ngh phn cng cng pht trin khng
km. tn dng sc mnh ca phn cng th cc th h Windows tip theo ngy cng hon
thin hn. Nh Windows 98 pht trin t Window 95 v c nhiu ci thin nh hiu nng lm
vic, h tr cc thit b phn cng tt hn, v cui cng l vic tch hp cht ch vi Internet v
Word Wide Web.
Tht ra mt ng dng trn Windows khng phi l qu phc tp v chng c hnh thc
chung. Chng trnh ng dng thung chim mt phm vi hnh ch nht trn mn hnh gi l
mt ca s. Trn cng ca mi ca s l thanh tiu (title bar). Cc chc nng ca chng
trnh th c lit k trong thc n la chn ca chng trnh (menu) , hay xut hin di dng
trc quan hn l cc thanh cng c (toolbar). Cc thanh cng c ny cha cc chc nng c
s dng thng xuyn trong thc n gim thi gian cho ngi dng phi m thc n v
Trang 3
NGN NG LP TRNH LP TRNH C TRN WINDOWS
chn. Thng thng khi cn ly thng tin hay cung cp thng tin cho ngi dng th mt ng
dng s a ra mt hp thoi, trong hp thoi ny s cha cc iu khin chung giao tip vi
ngi dng. Windows cng ra to mt s cc hp thoi chun nh Open Files, v mt s hp
thoi tng t nh nhau.
Trong Windows, chng trnh ng dng khi thc thi c chia s nhng th tc m
Windows cung cp sn, cc tp tin cung cp nhng th tc trn c gi l th vin lin kt
ng (Dynamic Link Libraries - DLL). Windows c c ch lin kt nhng chng trnh ng
dng vi cc th tc c cung cp trong th vin lin kt ng.
Kh nng tng thch ca Windows cng rt cao. Cc chng trnh ng dng c vit
cho Windows khng truy xut trc tip phn cng ca nhng thit b ho nh mn hnh v
my in. M thay vo , h iu hnh cung cp mt ngn ng lp trnh ha (gi l Giao tip
thit b ho - Graphic Device Interface - GDI) cho php hin th nhng i tng ha mt
cch d dng. Nh vy mt ng dng vit cho Windows s chy vi bt c thit b mn hnh no
hay bt k my in, min l ci t trnh iu khin thit b h tr cho Windows. Chng trnh
ng dng khng quan tm n kiu thit b kt ni vi h thng.
Nh gii thiu phn trn khi nim lin kt ng l thnh phn quan trng ca
Windows, n c xem nh l ht nhn ca h iu hnh, v bn thn ca Windows l cc tp
th vin lin kt ng. Windows cung cp rt nhiu hm cho nhng chng trnh ng dng
ci t giao din ngi dng v hin th vn bn hay ha trn mn hnh. Nhng hm ny c
ci t trong th vin lin kt ng hay cn gi l DLL. l cc tp tin c dng phn m rng
l *.DLL hay *.EXE, hu ht c cha trong th mc \Windows\System,
\Windows\system32 ca Windows 98 v cc th mc \WinNT\System, \WinNT\System32
ca Windows NT.
GDI cung cp ton b giao din thit b ho (Graphics Device Interface), cho php
chng trnh ng dng hin th vn bn v ho trn cc thit b xut phn cng nh mn hnh
v my in.
Trang 4
NGN NG LP TRNH LP TRNH C TRN WINDOWS
1.3.1. c im chung
Trang 5
NGN NG LP TRNH LP TRNH C TRN WINDOWS
iu trc tin ca ngi hc lp trnh C trn Windows l phi bit lp trnh C, sch ny
khng c tham vng hng dn ngi hc c th thng tho lp trnh C trn Windows m cha
qua mt lp hun luyn C no. Tuy nhin, khng nht thit phi hon ton thng tho C mi hc
c lp trnh Windows.
Ngoi nhng yu cu trn, i khi ngi lp trnh trn Windows cng cn c khiu thm
m, v cch trnh by cc hnh nh, cc iu khin trn cc hp thoi tt th s lm cho ng dng
cng tin li, r rng, v thn thin vi ngi dng.
1.3.5. C ch thng ip
Trang 6
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 7
NGN NG LP TRNH LP TRNH C TRN WINDOWS
1.4.1.1. Ca s
Tt c cc ca s u c to t mt cu trc c cung cp sn gi l lp ca s
(window class). Cu trc ny l mt tp m t cc thuc tnh m h thng dng nh khun mu
to nn cc ca s. Mi mt ca s phi l thnh vin ca mt lp ca s. Tt c cc lp ca
s ny u c x l ring bit.
Hp thoi (Dialog) dng tng tc vi ngi dng trong mt chng trnh ng dng.
Mt hp thoi thng cha nhiu cc u khin nh nhp vn bn (edit text), nt bm (button),
ghi ch (static control), hp danh sch (list box)
Nt bm (button): gm c Push Button dng kch hot mt thao tc, Check Box
dng chn mt trong hai trng thi (TRUE hay FALSE), Radio Button cng ging nh
Check Box nhng mt nhm cc Radio Button phi c chn loi tr nhau.
Ch thch (static): dng cha cc ghi ch trong hp thoi, ngoi ra ni dung
c th thay i trong qu trnh s dng hp thoi.
Hp lit k (list box): Chn mt hay nhiu d liu c lit k trong danh sch,
nu hp cha nhiu dng v hp khng hin th ht cc mu thng tin th phi km theo mt
thanh cun (scroll bar).
Trang 8
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Thanh cun (scroll bar): ngoi vic dng km vi list box hay edit box th thanh
cun cn c th s dng c lp nhm to cc thc o
Tng t nh cc chng trnh C chun, bao gm cc tp tin tiu (header) cha trong
tp tin *.h, *.hpp. Cn m ngun (source code) cha trong tp tin *.c hay *.cpp.
Tp tin nh ngha
Cc file *.ico l cc biu tng (icon) c dng trong chng trnh. Thng
thng cc cng c lp trnh trn Windows u c cc tool to cc nh ny.
Con tr chut ca ng dng c th c v li di dng cc biu tng v lu
trn a vi dng file *.cur.
Cc kiu d liu trn Windows thng c nh ngha nh ton t typedef trong tp tin
windows.h hay cc tp tin khc. Thng thng cc tp tin nh ngha ny do Microsoft vit ra
Trang 9
NGN NG LP TRNH LP TRNH C TRN WINDOWS
hoc cc cng ty vit trnh bin dch C to ra, nht thit n phi tng thch vi h iu hnh
Windows 98, hay NT da trn kin trc 32-bit.
Ngoi ra, c mt kiu thng xuyn dng l kiu HANDLE l mt s nguyn 32-bit
c s dng nh mt kiu nh danh. C nhiu kiu nh danh nhng nht thit tt c phi c
cng kch thc vi HANDLE.
Kiu ngha
Trang 10
NGN NG LP TRNH LP TRNH C TRN WINDOWS
BOOL Bool.
WPARAM 32-bit.
LPARAM 32-bit.
BSTR Gi tr 32-bit tr n k t.
nh ngha lp ca s ng dng.
ng k lp ca s va nh ngha.
To ra th hin ca s ca lp cho.
Trang 11
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Hin th ca s.
1.4.3. Hm WinMain
HWND hwnd;
MSG msg;
/* nh ngha kiu ca s */
wndclass.lpfnWndProc = WndProc; // Hm th tc ca s
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
Trang 12
NGN NG LP TRNH LP TRNH C TRN WINDOWS
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
/* ng k lp ca s */
if (!RegisterClass(&wndclass)) return 0;
/* To lp ca s */
WS_OVERLAPPEDWINDOW, // Kiu ca s
CW_USEDEFAULT, // Ta x
CW_USEDEFAULT, // Ta y
CW_USEDEFAULT, // Chiu di
NULL, // Ca s cha
/* Hin th ca s */
UpdateWindow (hwnd);
TranslateMessage (&msg);
Trang 13
NGN NG LP TRNH LP TRNH C TRN WINDOWS
DispatchMessage (&msg);
return msg.wParam;
nh ngha mt lp ca s :
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
} WNDCLASS, *PWNDCLASS;
Trang 14
NGN NG LP TRNH LP TRNH C TRN WINDOWS
lpszClassName Tn lp
ng k lp ca s :
To ca s :
Khai bo hm to ca s :
Trang 15
NGN NG LP TRNH LP TRNH C TRN WINDOWS
HWND CreateWindow(
LPCSTR lpClassName, // Tn lp ca s ng k
LPCSTR lpwindowName, // Tn ca ca s
int y, // V tr dc ban u
);
Hin th ca s :
BOOL ShowWindow(
);
SW_HIDE : n ca s.
Trang 16
NGN NG LP TRNH LP TRNH C TRN WINDOWS
1.4.4. Hm x l ca s WndProc
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch (msg)
case WM_CREATE:
Trang 17
NGN NG LP TRNH LP TRNH C TRN WINDOWS
return 0;
case WM_PAINT:
return 0;
case WM_SIZE:
return 0;
case WM_DESTROY:
/*Ca s b ng*/
PostQuitMessage (0);
return 0;
1.4.5. X l thng ip
Sau khi ca s c hin th trn mn hnh, th chng trnh phi c cc thng tin nhp
ca ngi dng t bn phm hay thit b chut. Windows s duy tr mt hng i thng ip cho
mi chng trnh chy trn n. Khi mt s kin nhp thng tin xut hin, Windows s dch s
kin ny thnh dng thng ip v a n vo hng i thng ip ca ng dng tng ng.
Trang 18
NGN NG LP TRNH LP TRNH C TRN WINDOWS
TranslateMessage (&msg);
DispatchMessage (&msg);
Trong msg l mt bin cu trc kiu MSG c nh ngha trong tp tin tiu
WINUSER.H.
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG;
Kiu d liu POINT l mt kiu cu trc khc, c nh ngha trong tp tin tiu
WINDEF.H, v c m t :
LONG x;
LONG y;
} POINT, *PPOINT;
Trang 19
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Khai bo lp ca s.
ng k lp ca s va khai bo.
To v hin th lp ca s trn.
WndProc : Hm x l thng ip gi n ca s.
/* HELLOWORLD.C */
#include <windows.h>
Trang 20
NGN NG LP TRNH LP TRNH C TRN WINDOWS
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hbrBackground =
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if ( !RegisterClass ( &wndclass ) )
return 0;
WS_OVERLAPPEDWINDOW, // Kiu ca s
CW_USEDEFAULT, // Ta x
CW_USEDEFAULT, // Ta y
Trang 21
NGN NG LP TRNH LP TRNH C TRN WINDOWS
CW_USEDEFAULT, // Chiu dc
NULL, // Ca s cha
NULL, // Thc n
hInstance, // nh danh
NULL ); // Tham s
UpdateWindow ( hwnd );
TranslateMessage (&msg);
DispatchMessage (&msg) ;
return msg.wParam;
} // End WinMain
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch ( msg )
case WM_CREATE:
return 0;
case WM_PAINT:
Trang 22
NGN NG LP TRNH LP TRNH C TRN WINDOWS
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
} // End switch
Tn hm ngha
CreateWindow To mt ca s da trn mt lp ca s.
Trang 23
NGN NG LP TRNH LP TRNH C TRN WINDOWS
DispatchMessage Gi thng ip n hm x l ca s.
Khi vit mt chng trnh ng dng ln vi nhiu kiu khai bo bin khc nhau, nu vic
khai bo cc tn bin khng thch hp s lm cho chng trnh phc tp thm, i khi lm kh
ngay c ngi vit ra cc m ngun . V vy cc lp trnh vin thng qui c sao cho mt tn
bin va gi c chc nng ca n va xc nh c kiu loi. C rt nhiu phong cch t
tn, trong s th c phong cch t tn theo c php Hungary (Hungarian Notation) l c
dng nhiu nht. Qui c rt n gin l bt u tn bin th vit ch thng v cc ch u th
hin kiu d liu ca bin, v c gi l cc tin t. V d nh bin szCmdLine l mt bin lu
chui nhp t dng lnh, sz l th hin cho bin kiu chui kt thc k t 0, ngoi ra ta hay thy
hInstance v hPrevInstance, trong h vit tt cho kiu handle, kiu d liu nguyn thng
c khai bo dng tin t l ch i.
Trang 24
NGN NG LP TRNH LP TRNH C TRN WINDOWS
C php Hungary ny gip cho ngi lp trnh rt nhiu trong khu kim tra li ca
chng trnh, v khi nhn vo hai bin ta c th d dng nhn bit c s khng tng thch
gia hai kiu d liu th hin trong tn ca hai bin.
by BYTE
n short
i int
x,y bin lu ta x, y
b BOOL
w WORD
l long
dw DWORD
s string
sz chui kt thc bi k t 0
h handle
p pointer
Trang 25
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Chng 2
HP THOI V THANH TRNH N
2.1. M U
Hp thoi (dialog) v thanh trnh n (menu) l cc thnh phn khng th thiu trong
vic t chc giao tip gia ngi s dng v chng trnh. Hp thoi c xem nh l mt loi
ca s c bit, l cng c mm do, linh hot a thng tin vo chng trnh mt cch d
dng. Trong khi menu l cng c gip ngi dng thc hin cc thao tc n gin hn, thng
qua cc nhm chc nng thng s dng.
Trang 26
NGN NG LP TRNH LP TRNH C TRN WINDOWS
2.2. HP THOI
Hp thoi phi hp gia ngi s dng vi chng trnh bng mt s phn t iu khin
m cc phn t ny nhn nhim v thu nhn thng tin t ngi dng v cung cp thng tin n
ngi dng khi ngi dng tc ng n cc phn t iu khin. Cc phn t iu khin ny
nhn ca s cha l mt hp thoi. Cc phn t iu khin thng l cc Button, List Box,
Combo Box, Check Box, Radio Button, Edit Box, Scroll Bar, Static.
Hp thoi trng thi (modal) l loi hp thoi thng dng trong cc ng dng ca chng
ta. Khi hp thoi trng thi c hin th th bn khng th chuyn iu khin n cc ca s
khc, iu ny c ngha bn phi ng hp thoi hin hnh trc khi mun chuyn iu khin
n cc ca s khc.
Khi hp thoi hin ln c xut hin dng ch "HELLO WORLD", bn trn hp thoi c
mt biu tng ca hp thoi l mt icon, v pha di hp thoi l mt nt bm (Button) c
tn l OK, khi nhp chut vo nt OK th hp thoi "HELLO WORLD" c ng li.
Trang 27
NGN NG LP TRNH LP TRNH C TRN WINDOWS
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
switch (message)
case WM_CREATE :
return 0 ;
case WM_COMMAND :
case IDC_SHOW :
hwnd, DialogProc) ;
break;
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
Trang 28
NGN NG LP TRNH LP TRNH C TRN WINDOWS
BOOL CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM
lParam)
switch (message)
case WM_INITDIALOG :
return TRUE ;
case WM_COMMAND :
case IDOK :
EndDialog (hDlg, 0) ;
return TRUE ;
break ;
return FALSE ;
/*---------------------------------------dialog--------------------------------------------*/
BEGIN
DEFPUSHBUTTON "OK",IDOK,54,65,50,14
Trang 29
NGN NG LP TRNH LP TRNH C TRN WINDOWS
ICON IDI_ICON1,IDC_STATIC,68,9,20,20
END
/* -----------------------------------------Menu------------------------------------------*/
BEGIN
POPUP "Dialog1"
BEGIN
END
END
Trong v d 2.1 trn, ta to hp thoi bng cch dng cc cu lnh cha trong file ti
nguyn DIALOG1.RC. Cch lm ny gip ta hiu cu trc lnh ca Windows, tuy nhin cng c
Visual C++ Developer Studio, ta c th thit lp mt hp thoi trc quan hn nh sau : Chn
Insert t thc n Resource View thm mt hp thoi, mn hnh c th hin nh trong
hnh 2.2.
Trang 30
NGN NG LP TRNH LP TRNH C TRN WINDOWS
thm dng ch "HELLO WORLD" vo hp thoi, chn Static Text t bng cng c
v t i tng vo hp thoi. Nhn chut phi hin th Properties ca Static Text, sau
vo mc caption nh dng ch "HELLO WORD" vo y.
Dch v chy chng trnh sau xem file DIALOG1.RC di dng text, ni dung hp
thoi c Windows pht sinh nh sau :
BEGIN
DEFPUSHBUTTON "OK",IDOK,54,65,50,14
ICON IDI_ICON1,IDC_STATIC,68,9,21,20
END
Trang 31
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Theo sau lnh STYLE l cc thuc tnh ca hp thoi m bn cn thm vo. Thng
thng hp thoi modal s dng cc hng WS_POPUP v DS_MODALFRAME ngoi ra cn
c cc hng WS_CAPTION, WS_MAXIMIZEBOX, WS_MINIMIZEBOX, WS_POPUP,
WS_VSCROLL, WS_HSCROLL, WS_SYSMENU, .... Lnh BEGIN v lnh END c th
c thay bng { v }. Trong v d trn, hp thoi s dng 3 kiu iu khin l
DEFPUSHBUTTON (kiu nt bm mc nh), ICON (biu tng), v kiu CTEXT (vn bn
c canh gia). Mt kiu iu khin c khai bo tng qut nh sau.
Trang 32
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Tuy Visual C++ Developer cung cp cho chng ta b son tho hp thoi trc quan
m ta khng cn phi quan tm n ni dung trong tp tin .RC. Tuy nhin vi cch thit k mt
hp thoi bng cc cu lnh gip chng ta hiu chi tit hn cu trc lnh ca Windows hn th
na tp lnh dng thit k hp thoi phong ph v a dng hn rt nhiu so vi nhng g m
ta trc quan c trn b son tho ca Developer. Bng cch s dng cc lnh c bit trong
tp tin Resource editor ca Visual C++ ta c th to ra nhiu i tng m trong b son tho
khng c.
Trang 33
NGN NG LP TRNH LP TRNH C TRN WINDOWS
C th dng cch khc thm tiu cho hp thoi, bng cch trong khi x l thng
ip WM_INITDIALOG thm vo dng lnh:
SetWindowText(hDlg,TEXT("Hello Dialog"));
Khi hp thoi c tiu ri, c th thm cc chc nng phng to v thu nh hp thoi
bng hng WS_MINIMIZEBOX, WS_MAXIMIZEBOX.
MENU MENU1
Trang 34
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Cc kiu iu khin c khai bo trong resource script c dng nh sau, ngoi tr kiu
iu khin LISTBOX, COMBOBOX, SCROLLBAR, EDITTEXT.
Trang 35
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Thm thuc tnh cho cc kiu iu khin bng cch thay i tham s iStyle. V d ta
mun to radio button vi chui din t nm bn tri ca nt th ta gn trng iStyle bng
BS_LEFTTEXT c th nh sau.
RADIOBUTTON Radio1",IDC_RADIO1,106,10,53,15,BS_LEFTTEXT
Trong resource script ta cng c th to mt kiu iu khin bng lnh tng qut sau.
RADIOBUTTON "Radio1",IDC_RADIO1,106,10,53,15,BS_LEFTTEXT
CONTROL"Radio1",IDC_RADIO1,"button",106,10,53,15,BS_LEFTTEXT
minh ha cho vic trao i thng ip gia cc thnh phn iu khin bn trong hp
thoi (ng vai tr l mt ca s cha) vi cc thnh phn iu khin con nm bn trong hp
thoi, v c ch qun l hp thoi ca Windows. Chng ta tin hnh xem xt v d 2-2. Kt qu
thc hin ca chng trnh nh trong hnh 2.5.
Trang 36
NGN NG LP TRNH LP TRNH C TRN WINDOWS
#include <windows.h>
#include "resource.h"
static COLORREF crColor[8] = { RGB(0, 0, 0), RGB(0, 0, 255), RGB(0, 255, 0), RGB(0, 255,
255), RGB(255, 0, 0), RGB(255, 0, 255), RGB(255, 255, 0), RGB(255, 255, 255) } ;
HBRUSH hBrush,hbrush;
HDC hdc ;
RECT rect ;
if(iBrush==IDC_HS_BDIAGONAL)
hbrush=CreateHatchBrush(HS_BDIAGONAL,
Trang 37
NGN NG LP TRNH LP TRNH C TRN WINDOWS
crColor[iColor-IDC_BLACK]);
if(iBrush == IDC_HS_CROSS)
hbrush=CreateHatchBrush(HS_CROSS,
crColor[iColor - IDC_BLACK]);
if(iBrush == IDC_HS_DIAGCROSS)
hbrush=CreateHatchBrush(HS_DIAGCROSS,
crColor[iColor - IDC_BLACK]);
if(iBrush == IDC_HS_FDIAGONAL)
hbrush=CreateHatchBrush(HS_FDIAGONAL,
crColor[iColor - IDC_BLACK]);
if(iBrush == IDC_HS_HORIZONTAL)
hbrush=CreateHatchBrush(HS_HORIZONTAL,
crColor[iColor - IDC_BLACK]);
if(iBrush == IDC_HS_VERTICAL)
hbrush=CreateHatchBrush(HS_BDIAGONAL,
crColor[iColor - IDC_BLACK]);
if (iFigure == IDC_RECT)
else
Trang 38
NGN NG LP TRNH LP TRNH C TRN WINDOWS
UpdateWindow (hCtrl) ;
PAINTSTRUCT ps ;
switch (message)
case WM_CREATE:
return 0 ;
case WM_COMMAND:
case IDC_SHOW:
return 0 ;
break;
case WM_PAINT:
Trang 39
NGN NG LP TRNH LP TRNH C TRN WINDOWS
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
switch (message)
case WM_INITDIALOG:
iColor = iCurrentColor ;
iFigure = iCurrentFigure ;
iBrush = iCurrenBrush;
CheckRadioButton(hDlg,IDC_BLACK,IDC_WHITE, iColor);
CheckRadioButton(hDlg,IDC_RECT,IDC_ELLIPSE,iFigure);CheckRadioButton (hDlg,
IDC_HS_BDIAGONAL, IDC_HS_VERTICAL, iBrush);
return FALSE ;
Trang 40
NGN NG LP TRNH LP TRNH C TRN WINDOWS
case WM_COMMAND:
case IDOK:
iCurrentColor = iColor ;
iCurrentFigure = iFigure ;
iCurrenBrush = iBrush;
return TRUE ;
case IDCANCEL:
return TRUE ;
case IDC_BLACK:
case IDC_RED:
case IDC_GREEN:
case IDC_YELLOW:
case IDC_BLUE:
case IDC_MAGENTA:
case IDC_CYAN:
case IDC_WHITE:
return TRUE ;
case IDC_RECT:
Trang 41
NGN NG LP TRNH LP TRNH C TRN WINDOWS
case IDC_ELLIPSE:
return TRUE ;
case IDC_HS_BDIAGONAL:
case IDC_HS_CROSS:
case IDC_HS_DIAGCROSS:
case IDC_HS_FDIAGONAL:
case IDC_HS_HORIZONTAL:
case IDC_HS_VERTICAL:
CheckRadioButton(hDlg,IDC_HS_BDIAGONAL,IDC_HS_VERTICAL, LOWORD
(wParam)) ;
return TRUE ;
break;
case WM_PAINT:
break ;
return FALSE ;
Trang 42
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 43
NGN NG LP TRNH LP TRNH C TRN WINDOWS
case WM_COMMAND:
case IDC_BLACK:
case IDC_RED:
case IDC_GREEN:
case IDC_YELLOW:
case IDC_BLUE:
case IDC_MAGENTA:
case IDC_CYAN:
case IDC_WHITE:
return TRUE ;
Trong iColor dng lu gi tr mu hin hnh c chn. Vng lp for dng kim
tra trng thi ca tt c cc nt radio thng qua ID ca chng. Hm GetDlgItem dng ly
handle ca nt c chn v lu vo bin i. Hm SendMessage dng gi thng ip
MB_SETCHECK ti cc nt radio. Nu word thp ca i s wParam bng ch danh ID ca
nt c chn th nt c nh du v cc nt khc s khng c chn.
Trang 44
NGN NG LP TRNH LP TRNH C TRN WINDOWS
case IDOK:
iCurrentColor = iColor ;
iCurrentFigure = iFigure ;
return TRUE ;
case IDCANCEL:
return TRUE ;
case WM_COMMAND:
switch (LOWORD(wParam))
case IDC_SHOW:
return 0 ;
Trang 45
NGN NG LP TRNH LP TRNH C TRN WINDOWS
break;
Gi tr TRUE hay FALSE thng bo cho ca s chnh bit rng ngi dng t chi hay
chp thun ty chn trong hp thoi. V TRUE v FALSE c kiu s nguyn (1,0) nn i s th
hai trong li gi hm EndDialog c kiu s nguyn (int). Do kt qu tr v ca hm ny cng
c kiu l s nguyn. V d nu bn bm nt OK th tr tr v ca hm bng 1. Nu bn bm nt
Cancel th tr tr v ca hm bng 0, v nu trong chng trnh c s dng nt bm mc nh
Inoge th khi bm nt ny tr tr ca hm s l 2.
Trong v d 2.2 chng ta dng phng php v trn hp thoi y l cng vic khc
thng. By gi ta tm hiu cng vic tin hnh nh th no.
Khi chng ta chn nt radio thay i mu, hnh v hay nhn c thng ip
WM_PAINT th th tc DialogProc thc hin thao tc v vo thnh phn iu khin ca hp
thoi bng hm PaintTheBlock. Hm ny c khai bo nh sau.
hCtrBlock=GetDlgItem(hDlg, IDC_PAINT);
UpdateWinDow(hCtrl);
Trang 46
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Chng ta v trn vng client ca cc iu khin con ch khng v trc tip ln vng
client ca hp thoi. Khi hp thoi nhn c thng ip WM_PAINT th thnh phn iu khin
c nh danh IDC_PAINT c v li. Cch x l thng ip WM_PAINT ging nh th tc
x l WndProc ca ca s chnh, nhng th tc x l hp thoi khng gi hm BeginPaint v
hm EndPaint bi v n khng t v ln ca s ca chnh n.
EnableWindow(hwndCtrl, bEnable);
i s hwndCtrl l ch danh ca thnh phn iu khin mun v hiu ha, thnh phn th
hai l bEnable mang hai gi tr TRUE hay FALSE, nu thnh phn ny mang gi tr FALSE th
iu khin ny c v hiu ha, cn ngc li nu thnh phn ny mang gi tr TRUE th iu
khin c hiu ha tr li.
Trong phn trn tho lun loi hp thoi, th nht l hp thoi trng thi, v by
gi tip tc tho lun n loi hp thoi th hai, hp thoi khng trng thi (modeless). hiu
r cch s dng cng nh nhng thao tc trn hp thoi khng trng thi, chng ta th t tm
hiu qua cc mc sau.
2.2.2.1. S khc nhau gia hp thoi trng thi v hp thoi khng trng thi
Hp thoi khng trng thi khc vi hp thoi trng thi ch. Sau khi hin th hp thoi
khng trng thi chng ta c th chuyn thao tc n cc ca s khc m khng cn ng hp
thoi dng ny li. iu ny thun tin i vi ngi dng khi ngi dng mun trc quan cc
s thao tc cng mt lc. V d nh trnh son tho Studio Deverloper bn c th thao tc qua
li gia hai hp thoi, l hp thoi bn cn thit k v mt hp thoi cha cc loi iu khin
m bn dng thit k. Vi cch lm ny gip ngi dng trc quan hn so vi cch ch cho
php ngi dng ch thao tc trn mt ca s.
Trang 47
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Phi t ch WS_VISIBLE cho hp thoi khng trng thi, bng cch chn mc
More Styles trong ca s Properties ca hp thoi. Nu nh khng bt ch VISIBLE ln th
chng trnh phi c cu lnh ShowWindow sau li gi hm CreateDialog khi mun hin th
hp thoi dng ny ln mn hnh.
ShowWindow(hDlgModeless,SW_SHOW);
TranslateMessage(&msg);
DispatchMessage(&msg);
Trang 48
NGN NG LP TRNH LP TRNH C TRN WINDOWS
TranslateMessage(&msg);
DispatchMessage(&msg);
minh ha cch dng hp thoi khng trng thi (modeless) ta xt v d 2.3. Chng
trnh v d 2.3 sau khi chy c kt qu nh sau.
Khi dng chut chn loi hnh v trn radio button, loi hnh v c chn s v cng
lc ln control tnh ca hp thoi v ca s chnh. Dng chut chn mu t cho hnh v c
chn, bng cch r chut ln 3 thanh cun Scrollbar.
Trang 49
NGN NG LP TRNH LP TRNH C TRN WINDOWS
HBRUSH hBrush ;
HDC hdc ;
RECT rect ;
hdc = GetDC(hwnd) ;
if (iFigure == IDC_RECT)
else
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
switch (message)
case WM_PAINT:
return 0 ;
case WM_DESTROY :
DeleteObject((HGDIOBJ)SetClassLong(hwnd, GCL_HBRBACKGROUND,(LONG)GetStockObject
(WHITE_BRUSH))) ;
Trang 50
NGN NG LP TRNH LP TRNH C TRN WINDOWS
PostQuitMessage (0) ;
return 0 ;
UpdateWindow (hCtrl) ;
BOOL CALLBACK ColorScrDlg (HWND hDlg, UINT message, WPARAM wParam, LPARAM
lParam)
switch (message)
case WM_INITDIALOG :
Trang 51
NGN NG LP TRNH LP TRNH C TRN WINDOWS
return TRUE ;
case WM_COMMAND:
switch( LOWORD(wParam))
case IDC_RECT:
case IDC_ELLIPSE:
iFigure = LOWORD(wParam) ;
return TRUE ;
break;
case WM_VSCROLL :
iIndex = iCtrlID - 10 ;
Trang 52
NGN NG LP TRNH LP TRNH C TRN WINDOWS
case SB_PAGEDOWN :
iColor[iIndex] += 15 ;
case SB_LINEDOWN :
break;
case SB_PAGEUP :
iColor[iIndex] -= 15 ;
case SB_LINEUP :
break;
case SB_TOP :
iColor[iIndex] = 0 ;
break;
case SB_BOTTOM :
iColor[iIndex] = 255 ;
break;
case SB_THUMBPOSITION :
case SB_THUMBTRACK :
break;
default :
return FALSE ;
Trang 53
NGN NG LP TRNH LP TRNH C TRN WINDOWS
InvalidateRect(hwndParent,NULL,TRUE);
return TRUE ;
case WM_PAINT:
break;
return FALSE ;
2.3. MENU
Trong giao din ng dng Windows, thnh phn quan trng thng khng th thiu l
menu ca chng trnh. Menu xut hin ngay di thanh tiu ca chng trnh ng dng.
Ngoi ra trong mt s ng dng thanh menu c th di chuyn c.
Tht ra menu cng kh n gin, v chng c t chc thnh cc nhm trn thanh chnh
(File, Edit, View,), mi mc lit k trong menu chnh c th cha mt hay nhiu mc lit k
gi l menu popup hay dropdown, v vi mi mc lit k trong menu popup ny c th c cc
mc con ca n,.
Cc mc lit k trn menu c th dng kch hot mt lnh, hay chn trng thi (check,
uncheck). Cc mc lit k trn menu c 3 dng: c hiu lc (enabled), khng c hiu lc
(disabled), v mu xm (grayed). Vi quan im lp trnh th ta ch cn hai trng thi l c hiu
lc v khng c hiu lc m thi, do trng thi mu xm s ch cho ngi dng bit l trng
thi ca mc lit k c hiu lc hay khng. V vy khi vit chng trnh nhng mc no khng
c hiu lc th ta thit lp trng thi mu xm, khi ngi dng s bit rng mc lit k
khng c hiu lc.
*To menu trong tp tin ti nguyn *.RC: to menu trong tp tin ti nguyn, thng
c 2 cch chnh l: dng mt trnh son tho m tp tin ti nguyn v son tho theo cu trc
tp tin RC cung cp cho ti nguyn menu. Thng thng, cch ny t s dng, v cc mi trng
pht trin C trn Windows (Borland C for Windows, Visual C) u cung cp cc cng c cho
php to menu mt cch d dng.
Trang 54
NGN NG LP TRNH LP TRNH C TRN WINDOWS
V d : wndclass.lpszMenuName = "MENU1";
BEGIN
POPUP "&File"
BEGIN
MENUITEM SEPARATOR
Trang 55
NGN NG LP TRNH LP TRNH C TRN WINDOWS
END
POPUP "&Edit"
BEGIN
MENUITEM SEPARATOR
END
POPUP "&Background"
BEGIN
END
POPUP "&Help"
BEGIN
END
END
Trang 56
NGN NG LP TRNH LP TRNH C TRN WINDOWS
#include <windows.h>
#include "menudemo.h"
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int
iCmdShow)
HWND hwnd;
Trang 57
NGN NG LP TRNH LP TRNH C TRN WINDOWS
MSG msg;
WNDCLASS wndclass;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hbrBackground =
(HBRUSH)GetStockObject(WHITE_BRUSH) ;
wndclass.lpszMenuName = szAppName ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
return 0 ;
UpdateWindow (hwnd) ;
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
Trang 58
NGN NG LP TRNH LP TRNH C TRN WINDOWS
return msg.wParam ;
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
HMENU hMenu ;
switch (message)
case WM_COMMAND:
case IDM_FILE_NEW:
case IDM_FILE_OPEN:
case IDM_FILE_SAVE:
case IDM_FILE_SAVE_AS:
return 0 ;
case IDM_APP_EXIT:
return 0 ;
Trang 59
NGN NG LP TRNH LP TRNH C TRN WINDOWS
case IDM_EDIT_UNDO:
case IDM_EDIT_CUT:
case IDM_EDIT_COPY:
case IDM_EDIT_PASTE:
case IDM_EDIT_CLEAR:
MessageBeep (0) ;
return 0 ;
case IDM_BKGND_WHITE:
case IDM_BKGND_LTGRAY:
case IDM_BKGND_GRAY:
case IDM_BKGND_DKGRAY:
case IDM_BKGND_BLACK:
CheckMenuItem(hMenu,iSelection, MF_UNCHECKED);
return 0 ;
case IDM_APP_HELP:
return 0 ;
case IDM_APP_ABOUT:
Trang 60
NGN NG LP TRNH LP TRNH C TRN WINDOWS
MessageBox (hwnd, TEXT ("Menu Demonstration Program\n (c) Charles Petzold, 1998"), szAppName,
MB_ICONINFORMATION | MB_OK) ;
return 0 ;
break;
case WM_DESTROY:
PostQuitMessage(0) ;
return 0 ;
Trang 61
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Chng 3
CC I TNG IU KHIN
3.1. M U
Lp Combo Box.
Trang 62
NGN NG LP TRNH LP TRNH C TRN WINDOWS
3.3. LP BUTTON
Trang 63
NGN NG LP TRNH LP TRNH C TRN WINDOWS
BN_CLICKED 0
BN_PAINT 1
BN_DISABLE 4
BN_SETFOCUS 6
BN_KILLFOCUS 7
struct
Trang 64
NGN NG LP TRNH LP TRNH C TRN WINDOWS
int iStyle ;
TCHAR *szText ;
button[ ] =
};
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
szBuffer[50];
Trang 65
NGN NG LP TRNH LP TRNH C TRN WINDOWS
HDC hdc ;
PAINTSTRUCT ps ;
int i ;
switch (message)
case WM_CREATE :
cxChar = LOWORD(GetDialogBaseUnits()) ;
cyChar = HIWORD(GetDialogBaseUnits()) ;
return 0 ;
case WM_SIZE :
rect.left = 24*cxChar ;
rect.top = 2*cyChar ;
rect.right = LOWORD(lParam) ;
rect.bottom = HIWORD(lParam) ;
return 0 ;
case WM_PAINT :
SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
TextOut (hdc, 24 * cxChar, cyChar, szTop, lstrlen (szTop)); TextOut (hdc, 24 * cxChar, cyChar, szUnd,
lstrlen (szUnd)) ;
return 0 ;
Trang 66
NGN NG LP TRNH LP TRNH C TRN WINDOWS
case WM_DRAWITEM :
case WM_COMMAND :
SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
break;
case WM_DESTROY :
PostQuitMessage(0) ;
return 0 ;
Tn lp : TEXT ("button")
Text ca s : Button[i].szText
V tr x : cxChar
V tr y : cyChar*( 1+2*i )
Trang 67
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Tip theo l 4 thng s xc nh v tr x, v tr y, kch thc theo chiu rng, kch thc
chiu cao ca ca s con trn vng client ca ca s cha. hwnd l handle ca ca s cha. ID l
ch danh ca mi ca s con (mi ca s con c duy nht mi s ID). ID ny phi p kiu
HMENU ch nh trnh n. lParam thc cht l mt con tr n cu trc
LPCREATESTRUCT c thnh phn hInstance. D mun ly th qun hInstance th phi p
kiu lParam.
SendMessage(hwndButton, BM_SETSTASE, 0, 0 );
Trang 68
NGN NG LP TRNH LP TRNH C TRN WINDOWS
iCheck mang gi tr TRUE nu check box trng thi chn, cn ngc li iCheck mang
gi tr FALSE.
Ngoi ra cn c hai loi check box khc l BS_3STATE v BS_AUTO3STATE. Hai loi
ny cn c thm trng thi th 3, l trng thi nt check box c mu xm xut hin khi bn
gi thng ip WM_SETCHECK vi tham s wParam bng 2 n check box ny. Mu xm
cho bit ngi dng chn la khng thch hp hay khng xc nh.
Trang 69
NGN NG LP TRNH LP TRNH C TRN WINDOWS
3.4. LP STATIC
Mt trong nhng ng dng thng xuyn nht, v n gin nht ca lp son tho l to
ra mt ca s cho php ngi dng nhp cc ch vo. minh ha cho ca s nhp ta xt v d
3.2 sau.
*EDITTEXT.CPP
#include <windows.h>
#define ID_EDIT 1
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
Trang 70
NGN NG LP TRNH LP TRNH C TRN WINDOWS
switch (message)
case WM_CREATE :
return 0 ;
case WM_SETFOCUS :
SetFocus (hwndEdit) ;
return 0 ;
case WM_SIZE :
return 0 ;
case WM_COMMAND :
if ( HIWORD(wParam)==EN_ERRSPACE || HIWORD(wParam)==EN_MAXTEXT )
return 0 ;
case WM_DESTROY :
PostQuitMessage(0) ;
return 0 ;
Trang 71
NGN NG LP TRNH LP TRNH C TRN WINDOWS
C th to mt edit control cho php hin th nhiu hng bng cch chn kiu ca s
ES_MULTILINE. Mt edit control mc nh ch cho php nhp mt hng k t cho n cui
edit box. S dng ES_AUTOHSCROLL, ES_AUTOVSCROLL to mt edit control c
thanh cun ngang, v cun ng t ng. C th thm thanh cun ngang v ng vo edit
control bng cch s dng kiu ca s WS_HSCROLL, WS_VSCROLL. Dng kiu ca s
WS_BORDER to ng vin cho edit control.
M thng bo ngha
Trang 72
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Cc th t thng ip sau cho php ct, sao chp, xo cc phn ch c chn (selected).
Chn phn ch nm trong clipboard vo vng son tho edit control bng cch gi hm.
SendMessage(hwndEdit,EM_REPLACESEL,0,(LPARAM)szString);
Trang 73
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Mt list box c th chn c mt mc hay nhiu mc cng mt lc (ty theo loi list
box n hay kp).
Theo mc nh, nhng list box to ra l nhng list box n. V th, nu mun to ra mt
list box kp (tc list box cho php ngi dng chn nhiu dng cng lc) th phi s dng loi
list box LBS_MULTIPLESEL.Thng thng, List box s t cp nht khi mt mc c thm
vo. Tuy nhin c th ngn cn vic cp nht ny bng kiu LBS_NOREDRAW. Vic lm ny
i khi khng thch lm, thay vo chng ta c th s dng thng ip WM_SETREDRAW
ngn chn tm thi vic v li ca list box.
Theo mc nh, cc mc trong list box khng c ng vin bao quanh khi hin th trn
mn hnh. Tuy nhin, c th thm ng vin cho cc mc bng nh danh ca s
WS_BORDER. Thm thanh cun ng vo list box bng cch thm nh danh ca s
WS_VSCROLL.
GetSystemMetrics(SM_CXVCROLL);
Trang 74
NGN NG LP TRNH LP TRNH C TRN WINDOWS
SendMessage(hwndList, LB_LB_RESETCONTENT, 0, 0 );
Khi thm vo hay xa th Windows t cp nht li list box. Tuy nhin ta cng c th tm
thi cn s cp nht ny bng cch tt c v li list box.
Tng t nh t chui vo List box , chn v ly mc trong List box cng phi gi cc
thng ip n th tc Window List box bng hm SendMessage.
Trang 75
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Xc nh trng thi ca mt mc no trong list box (loi list box chn kp) dng hm.
Trang 76
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Khi dng chut nhn vo list box, khi list box nhn focus nhp. Ca s cha c th t
focus nhp n list box bng hm.
SetFocus (hwndList);
Khi list box nhn focus nhp, chng ta dng con chut, cc phm ch, phm Spacebar
chn cc mc trong list box. List box gi thng ip WM_COMMAND vi cc thng s
wParam, lParam n ca s cha vi ngha :
M thng bo Gi tr ngha
LBN_SELCANCEL 3 Cho bit ngi dng thay i mc chn trong list box
Trang 77
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Sau y l mt v d v list box, kt qu chng trnh sau khi chy th hin trong hnh
3.2.
Trong v d ny, ta to ra mt list box gm cc phn t cam, chanh, nho . Khi dng
chut hay dng phm Spacebar cng vi phm mi tn chn cc mc trong list box, mc c
chn s c mu t th hin c chn la (mc nh trong Windows l mu xanh) v ni dung
mc chn ny c hin th ln kiu iu khin tnh nm bn trn vng thao tc ca ca s
chnh. Chng trnh minh ha nh sau (v d 3.2).
#include <windows.h>
#define ID_LIST 1
#define ID_TEXT 2
int i;
Trang 78
NGN NG LP TRNH LP TRNH C TRN WINDOWS
TCHAR *pVarName;
switch (message)
case WM_CREATE :
// To mt listbox
// to mt control "static"
FillListBox (hwndList) ;
return 0 ;
SetFocus (hwndList) ;
return 0 ;
case WM_COMMAND :
// ly ch v tr ca mc c chn
iIndex=SendMessage(hwndList,LB_GETCURSEL, 0, 0);
Trang 79
NGN NG LP TRNH LP TRNH C TRN WINDOWS
free (pVarName) ;
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
Khi dng chut hay bn phm chn mc trong list box, th list box gi thng ip
WM_COMMAND cho th tc WndProc ca ca s cha x l. Khi th tc WndProc nhn
c thng ip WM_COMMAND, n kim tra word thp ca tham s wParam c bng nh
danh ca list box ( v d trn l ID_LIST) khng v word cao ca tham s wParam(m thng
bo) c bng LBN_SELCHANGE khng. Nu bng, n ly ch s ca mc c chn thng
qua hm:
Trang 80
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trong Combox box ch cho php chn mt mc trong danh sch cc mc c trong
Combo box.
Cc thao tc trn list box v combo box l hon ton ging nhau, ch khc nhau hnh
thc th hin. List box hin th cc mc khi chng c cp nht, cn combo box ch hin th cc
mc khi ta nhp chut vo n. Khi to kiu iu khin combo box vi hm CreateWindow phi
s dng lp ca s "combobox" cng vi kiu ca s l WS_CHILD.
List box c th cho php chn nhiu mc cng lc, cn combo box th ch cho php chn
mt mc m thi.
Khng ging nh list box, combo box c hai phn. Phn di l danh sch cc mc c
thm vo combo box, phn trn l mt edit control dng hin th mc chn hin hnh.
Trang 81
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 82
NGN NG LP TRNH LP TRNH C TRN WINDOWS
int i;
static TCHAR *tc[ ] = {TEXT("MAI XUAN HUNG"), TEXT("LE HOAN VU"), TEXT("LE LU
NHA"), TEXT("PHAM THANH PHONG"), TEXT("LE LUC"), TEXT("NGUYEN TIEN"), TEXT("DINH
QUYEN")};
SendMessage(hwndCombo,CB_ADDSTRING,0,(LPARAM)tc[i]);
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
TCHAR *pVarName;
switch (message)
Trang 83
NGN NG LP TRNH LP TRNH C TRN WINDOWS
case WM_CREATE :
FillListBox (hwndCombo) ;
return 0 ;
case WM_SETFOCUS :
SetFocus (hwndCombo) ;
return 0 ;
case WM_COMMAND :
iIndex=SendMessage(hwndCombo,CB_GETCURSEL,0,0);
iLength=SendMessage(hwndCombo,CB_GETLBTEXTLEN,iIndex, 0)+1;
free (pVarName) ;
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
Trang 84
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trong cc chng trc thanh cun ca s c to ra bng cch s dng hai thng s
WS_VSCROLL hay WS_HSCROLL, thanh cun c to ra trong trng hp ny nm bn
di hoc bn phi vng client. By gi to lp mt control thanh cun m kiu iu khin thanh
cun ny xut hin bt c ni no trong vng thao tc. Bng cch s dng lp "scrollbar" cng
vi hai kiu thanh cun nh ngha sn SBS_VERT v SBS_HORZ.
GetsystemMetrics (SM_CYHCROLL) ;
GetsystemMetrics (SM_CXVCROLL) ;
hwnScroll l handle ca control thanh cun. Tham s SB_CTL l mt trong hai kiu
SBS_VERT tng ng vi thanh cun ngang v SBS_HORZ tng ng vi thanh cun ng.
Theo mc nh th thanh cun nm trong vng c gi tr t 0 n 100 n v chiu di, tuy nhin
c th t li vng thanh cun thng qua hai tham s iMin tng ng vi chn di ca vng v
iMax tng ng vi chn trn ca vng. Tham s nRedraw mang mt trong hai gi tr TRUE
hoc FALSE, nu mun Windows v li thanh cun da trn vng mi th phi t gi tr ny
bng TRUE, cn ngc li th t gi tr ny bng FALSE.
Trang 85
NGN NG LP TRNH LP TRNH C TRN WINDOWS
C th dng bn phm di chuyn con chy trn vng control thanh cun khi thanh
cun nhn c focus nhp. Sau y l cc phm di chuyn cng vi cc chc nng ca n
trn control thanh cun.
Home SB_TOP
End SB_BOTTOM
Page Up SB_PAGEUP
SetFocus (hwndScroll);
Vi hwnScroll l handle ca control thanh cun. Mun t focus cho mt thanh cun no
khi khi ng chng trnh th phi t focus ny khi x l thng ip WM_SETFOCUS
trong th tc WndProc. V l do, thanh cun ch quan tm n cc phm di chuyn, n khng
quan tm n phm Tab. iu ny lm cho vic s dng phm Tab di chuyn focus nhp t
thanh cun ny n thanh cun khc gp nhiu kh khn. Tuy nhin gii quyt vn ny ta
nguyn cu cc k thut sau.
Trang 86
NGN NG LP TRNH LP TRNH C TRN WINDOWS
case WM_CTLCOLORCROLLBAR:
Trang 87
NGN NG LP TRNH LP TRNH C TRN WINDOWS
3.8.3. T mu nn ca s
Khi thay i vic chn trn cc thanh cun th chng trnh to ra mt chi t (brush)
mi v chn handle ca chi t mi ny vo ca s trn. Nhn hay t handle ca chi t
(brush) bng hm GetClassWord v hm SetClassWord. C th to mt chi t (brush) mi v
chn handle ca chi t ny vo cu trc ca ca s, sau xa chi t (brush) c.
UpdateWindow (hwnd) ;
Trang 88
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Hnh 3.4 minh ha mt ng dng v thanh cun (Scroll Bar). Trong v d ny, ta s dng
3 thanh cun v 6 static text. Bng cch dng chut hay bn phm, ta di chuyn con trt trn
thanh cun thay i gi tr mu. Mu thay i tng ng s l mu t ca vng client bn
cnh. Ba stactic text di mi thanh cun dng ghi nhn gi tr mu thay i tng ng vi
cc thanh cun.
int idFocus ;
WNDPROC OldScroll[3] ;
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
static COLORREF crPrim[3] = { RGB (255, 0, 0), RGB (0, 255, 0),
TEXT("Green"), TEXT("Blue") } ;
Trang 89
NGN NG LP TRNH LP TRNH C TRN WINDOWS
HINSTANCE hInstance ;
TCHAR szBuffer[10] ;
switch (message)
case WM_CREATE :
return 0 ;
case WM_SIZE :
Trang 90
NGN NG LP TRNH LP TRNH C TRN WINDOWS
SetFocus (hwnd) ;
return 0 ;
case WM_SETFOCUS :
SetFocus (hwndScroll[idFocus]) ;
return 0 ;
case WM_VSCROLL :
case SB_PAGEDOWN :
color[i] += 15 ;
case SB_LINEDOWN :
break;
case SB_PAGEUP :
color[i] -= 15 ;
case SB_LINEUP :
Trang 91
NGN NG LP TRNH LP TRNH C TRN WINDOWS
break;
case SB_TOP :
color[i] = 0 ;
break ;
case SB_BOTTOM :
color[i] = 255 ;
break ;
case SB_THUMBPOSITION :
case SB_THUMBTRACK :
break ;
default :
break ;
return 0 ;
case WM_CTLCOLORSCROLLBAR :
case WM_CTLCOLORSTATIC :
Trang 92
NGN NG LP TRNH LP TRNH C TRN WINDOWS
break ;
case WM_SYSCOLORCHANGE :
DeleteObject (hBrushStatic) ;
return 0 ;
case WM_DESTROY :
DeleteObject (hBrush[i]) ;
DeleteObject (hBrushStatic) ;
PostQuitMessage (0) ;
return 0 ;
LRESULT CALLBACK ScrollProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
switch (message)
Trang 93
NGN NG LP TRNH LP TRNH C TRN WINDOWS
case WM_KEYDOWN :
if (wParam == VK_TAB)
SetFocus (GetDlgItem (GetParent (hwnd), (id + (GetKeyState (VK_SHIFT) < 0 ? 2 : 1)) % 3)) ;
break ;
case WM_SETFOCUS :
idFocus = id ;
break ;
return CallWindowProc(OldScroll[id],hwnd,message,wParam,lParam);
Trang 94
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Chng 4
X L BN PHM, THIT B CHUT, V B NH
THI GIAN
4.1. M U
Trong chng ny, hai phn u s trnh by cch ngi lp trnh s dng bn phm v
thit b chut xy dng mt ng dng trn Windows. Thc cht ca vic x l bn phm hay
thit b chut cng n gin, v vi c ch thng ip ca Windows th ta ch cn tm hiu cc
thng ip c pht sinh t bn phm hay t thit b chut vit cc x l tng ng vi tng
thit b.
Phn cui ca chng trnh by mt thnh phn cng khng km quan trng l b nh
thi gian. Windows cung cp c ch ny truyn thng vi ng dng theo nh k. Vi c ch
ny, ng dng ch cn khai bo mt b nh thi gian vi mt khong thi gian cho trc. V khi
ng dng hot ng th h thng s truyn mt tn hiu cho ng dng theo tng khong thi gian
nh k c khai bo.
4.2. BN PHM
Trong mi trng tng tc ho ngy nay c hai thnh phn nhp liu khng th thiu
l bn phm (keyboard) v thit b chut (mouse). Tuy mt s ng dng khng tin li khi dng
bn phm, nh cc chng trnh tr chi (game), hay cc m phng ha vi thit b nh v l
thit b chut chng hn, nhng bn phm vn l thit b khng th thay th ca mt my tnh.
Bn phm h tr nhp liu rt phong ph : mt chng trnh son tho vn bn th khng th
thiu vic nhp d liu t bn phm. Nu my tnh b h thit b chut b ta vn c th thc thi
cc tc v ca ng dng mt cch bnh thng.
Trang 95
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Windows nhn v x l thng tin nhn c t bn phm, qua hnh thc cc thng ip
v gi cho ng dng. Trong ng dng Windows cc thng ip s c h iu hnh chuyn cho
hm x l ca s WndProc ca ng dng.
Windows cung cp 8 loi thng ip khc nhau phn bit cc tnh hung ca cc phm
c g. Tuy nhin khng phi lc no chng ta cng phi x l ton b cc thng ip ,
thng thng th ch cn x l mt na cc thng ip c pht sinh t bn phm, v cc thng
ip cn li s c Windows x l mc nh.
V d, trong Windows c th b qua khi nhn phm Ctrl, Alt, Shift cng vi cc phm
khc, nu khng mun chn x l ring cho ng dng. Trong trng hp nu chng ta mun
chn x l ring cho mnh, chng hn to phm nng (hotkey) phi ch trnh dng trng hp
vi cc phm nng m Windows cung cp. V khi theo quyn u tin, ng dng ca chng ta
s x l thng ip v s lm cho h thng khng hot ng nh bnh thng.
Thnh phn giao tip chung nh hp thoi (dialog) cng c nhiu giao tip vi bn phm,
nhng chng ta khng cn quan tm n vic giao tip vi bn phm khi hp thoi c kch
hot. X l bn phm trong hp thoi thng c giao cho Windows x l. Cc iu khin
c dng trong hp thoi nh hp nhp liu (edit box), hp la chn (check box), hay cc nt
nhn (button)...iu c kh nng t x l phm g vo v ch tr li thng bo ca cc phm g
cho ca s cha (parent window). Tuy vy, vi mt s cc iu khin nht nh theo ng dng ta
c th phi x l cc thng ip tng cng thm sc mnh ca thnh phn iu khin ny.
Trang 96
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trong Windows khi ngi dng nhn v nh phm trn bn phm, th thng qua trnh iu
khin thit b bn phm (keyboard driver) s din dch m qut (scan code) ca phn cng sang
hnh thc thng ip. Trc ht Windows s tm thi lu tr thng ip ny vo hng i thng
ip ca h thng (system message queue). Hng i thng ip h thng ca Windows l mt
hng i duy nht v qun l cc thao tc tin x l thng tin nhp t bn phm v chut.
Windows s ln lt ly cc thng ip trong hng i x l v s gi n hng i ca ng
dng khi ng dng x l xong thng ip bn phm v thit b chut trc .
L do m Windows phi chia thnh hai giai on trong qu trnh nhn v gi thng ip
t bn phm n hng i ca ng dng l do vic ng b ha vi mi tin trnh. Nu Windows
khng qun l hng i h thng th rt kh ng b cc tin trnh ca cc ng dng. V d, khi
mt ca s nhn c s quan tm v chun b x l cc thng ip. Ngi dng c th g phm
nhanh trong khi thng ip trc vn cha x l xong. Gi s ngi dng mun chuyn qua ng
dng khc v nhn Alt-Tab, khi thng ip bn phm mi ny s c a vo hng i ca
h thng v phn pht cho ng dng kia ch khng phi a vo hng i ca ng dng. Vi
tnh nng ng b ha ca Windows th cc thng ip t bn phm m bo c chuyn giao
ng cho cc ca s tng ng.
Khi thc hin thao tc nhp t bn phm th vic nhn (down) v nh (up) phi i i vi
nhau. Tuy nhin, nu chng ta nhn mt phm v gi lun th Windows s pht sinh hng lot
cc thng ip WM_KEYDOWN hay WM_SYSKEYDOWN, nhng vi thao tc nh th ch
pht sinh mt thng ip WM_KEYUP hay WM_SYSKEYUP. Cc thng ip ny s c
gi tun t n cc hm WndProc ca cc c s nhn c s quan tm ca Windows. Ngoi ra
chng ta c th bit c thi im m thng ip phm c g vo lc no bng cch dng
hm GetMessageTime.
Nh chng ta thy trong dng trn mt thao tc nhn hay th th c hai dng thng
ip khc nhau nh WM_KEYDOWN v WM_SYSKEYDOWN ca thao tc nhn, v tng
t i vi thao tc nh. Thng ip c tip u ng l "SYS" thng c pht sinh khi ngi
dng nhn cc phm g h thng. Khi ngi dng nhn phm Alt kt hp vi phm khc th
thng pht sinh thng ip WM_SYSKEYDOWN v WM_SYSKEYUP. i vi t hp cc
phm Alt, chc nng thng l gi mt mc chn trn trnh n menu ca ng dng hay trnh
Trang 97
NGN NG LP TRNH LP TRNH C TRN WINDOWS
n h thng system menu v ngoi ra dng chuyn i cc tc v gia nhiu ng dng khc
nhau (phm Alt+Tab hay Alt+Esc), v ng ca s ng dng khi kt hp vi phm chc nng
F4.
Trang 98
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 99
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Windows cung cp khi nim phm o nhm tch ri vi thit b bn phm hay ni cch
khc l tin ti c lp thit b vi bn phm. Khi mt phm c nhn th phn cng vt l pht
sinh ra mt m qut (scan code), trn bn phm tng thch IBM cc phm c gn vi cc m
v d phm W l 17, phm E l 18, v phm R l 19... Cch sp xp ny thun ty da trn v tr
vt l ca phm trn bn phm. Nhng ngi xy dng nn Windows nhn thy rng nu dng
trc tip m qut th s khng thch hp khi b l thuc vo bn phm hin ti v tng lai. Do
h c x l bn phm bng cch c lp thit b hn, bng cch to ra mt bng nh ngha tp
gi tr phm tng qut m sau ny c gi l m phm o. Mt s gi tr bn phm o m ta
khng thy xut hin trn bn phm IBM tng thch nhng c th tm thy chng trong bn
phm ca cc nh sn xut khc hay chng c dnh cho bn phm trong tng lai. Cc gi
tr ca phm o ny c nh ngha trong tp tin tiu WINUSER.H v c bt u vi cc
tip u ng VK_xxxxx. sau y l bng m t cc phm o thng dng trong Windows giao tip
vi bn phm IBM tng thch.
Thp phn Thp lc Hng phm nh ngha Windows dng Bn phm IBM tng
Trang 100
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Cc thng ip trn ch c nhn khi dng chut, ta khng bao gi nhn c thng
ip trn nu g t bn phm. Khng nn dng phm CtrlBreak trong ng dng Windows,
phm ny thng c ngt cc ng dng trong DOS.
Nhng gi tr phm o tip sai dnh cho cc phm Backspace, Tab, Enter, Escape, v
Spacebar c dng nhiu trong chng trnh Windows.
Thp phn Thp lc Hng phm nh ngha Windows Bn phm IBM tng thch
phn trong WINUSER.H dng
8 08 VK_BACK X Backspace
9 09 VK_TAB X Tab
Trang 101
NGN NG LP TRNH LP TRNH C TRN WINDOWS
19 13 VK_PAUSE X Pause
27 1B VK_ESCAPE X Esc
32 20 VK_SPACE X Spacebar
Bng m t phm o tip sau y l cc phm thng c s dng nhiu trong Windows.
Thp phn Thp lc Hng phm nh ngha Windows Bn phm IBM tng thch
phn trong WINUSER.H dng
33 21 VK_PRIOR X Page Up
35 23 VK_END X End
36 24 VK_HOME X Home
38 26 VK_UP X Phm mi tn ln
Trang 102
NGN NG LP TRNH LP TRNH C TRN WINDOWS
41 29 VK_SELECT -
42 2A VK_PRINT -
43 2B VK_EXECUTE -
45 2D VK_INSERT X Insert
46 2E VK_DELETE X Delete
47 2F VK_HELP
Thp Thp lc Hng phm nh ngha Windows Bn phm IBM tng thch
phn phn trong WINUSER.H dng
Trang 103
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Cui cng l m phm o ca bn phm m rng Num Pad (bn phi ca bn phm) v
cc phm chc nng (F1, F2, F3...).
Thp Thp lc Hng phm nh ngha trong Windows Bn phm IBM tng
phn phn WINUSER.H dng thch
108 6C VK_SEPARATOR
Trang 104
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 105
NGN NG LP TRNH LP TRNH C TRN WINDOWS
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam )
int i, j; // Bin lp
Trang 106
NGN NG LP TRNH LP TRNH C TRN WINDOWS
TCHAR ch; // K t
COLORREF crPrevText; // Mu ca vn bn
COLORREF crPrevBk; // Mu nn
switch ( message )
case WM_CREATE:
dwCharX = tm.tmAveCharWidth;
dwCharY = tm.tmHeight;
/* Cp pht b nh m lu k t nhp vo */
return 0;
case WM_SIZE:
Trang 107
NGN NG LP TRNH LP TRNH C TRN WINDOWS
break;
case WM_SETFOCUS:
ShowCaret ( hWnd );
break;
case WM_KILLFOCUS:
HideCaret ( hWnd );
DestroyCaret ( );
break;
case WM_CHAR:
switch ( wParam )
MessageBeep( ( UINT ) 1 );
return 0;
for ( i = 0; i < 4; i ++ )
return 0;
Trang 108
NGN NG LP TRNH LP TRNH C TRN WINDOWS
xung v tr mi */
nCaretPosX = 0;
nCaretPosY += 1;
break;
ch = ( TCHAR ) wParam;
HideCaret ( hWnd );
/* Ly b dy ca k t v xut ra */
&nCharWidth );
/* Lu k t vo buffer */
/* Tnh li v tr ngang ca caret. Nu v tr ny ti cui dng th chn thm k t xung dng v di chuyn
caret n dng mi */
nCaretPosX += nCharWidth;
nCaretPosX = 0;
++nCaretPosY;
Trang 109
NGN NG LP TRNH LP TRNH C TRN WINDOWS
nCurChar = cch;
ShowCaret ( hWnd );
break;
break;
case WM_KEYDOWN:
switch ( wParam )
if ( nCaretPosX > 0 )
HideCaret ( hWnd );
ch = pchInputBuf [--nCurChar ];
nCaretPosX=max(nCaretPosX-nCharWidth,0 );
ShowCaret ( hWnd );
break;
Trang 110
NGN NG LP TRNH LP TRNH C TRN WINDOWS
HideCaret ( hWnd );
ch = pchInputBuf [ nCurChar ];
if ( ch == 0x0D )
nCaretPosX = 0;
nCaretPosY++;
/* Nu k t khng phi l enter th kim tra xem phm shift c c nhn hay khng. Nu c nhn th i
mu v xut ra mn hnh. */
else
crPrevBk= SetBkColor(hdc,RGB(0,0,0));
TextOut(hdc,nCaretPosX,nCaretPosY*dwCharY,
&ch,1 );
GetCharWidth32(hdc,ch,ch,&nCharWidth);
Trang 111
NGN NG LP TRNH LP TRNH C TRN WINDOWS
nCurChar++;
ShowCaret ( hWnd );
break;
break;
MessageBeep ( (UINT) 1 );
return 0;
nCaretPosX = nCaretPosY = 0;
nCurChar = 0;
break;
if ( pchInputBuf [ i ] == 0x0D )
cCR++;
nCRIndex = i + 1;
nCaretPosY = cCR;
Trang 112
NGN NG LP TRNH LP TRNH C TRN WINDOWS
szBuf [ j ] = pchInputBuf [ i ];
/* Tnh v tr dc ca caret */
nCaretPosX = sz.cx;
nCurChar = cch;
break;
default:
break;
break;
case WM_PAINT:
if ( cch == 0 )
break;
HideCaret ( hWnd );
ShowCaret ( hWnd );
break;
Trang 113
NGN NG LP TRNH LP TRNH C TRN WINDOWS
case WM_DESTROY:
PostQuitMessage ( 0 );
break;
default:
return NULL;
Cng tng t nh bn phm, thit b chut cng c dng nhp d liu t ngi
dng vo ng dng nhng d liu y khng phi l vn bn nh khi nhp t bn phm m l cc
thao tc v hay x l cc i tng ha.
Theo nguyn tc, ta c th kim tra xem c tn ti thit b chut hay khng bng cch
dng hm GetSystemMetrics.
Trang 114
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Ta cng c th kim tra s nt ca thit b chut bng cch dng hm trn theo cu lnh
sau:
Khi ngi dng di chuyn thit b chut th Windows cng di chuyn mt nh bitmap
nh trn mn hnh, nh ny c gi l con tr chut (mouse cursor). Con tr chut ny c mt
im gi l im nng (hot spot) , im nng ny nm trong hnh bitmap, v do ngi to con
tr chut quyt nh. Khi chng ta tham chiu ti mt v tr ca con tr chut th chnh l chng
ta ang dng ta ca im nng ny.
Trang 115
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Nt Nhn Th Nhn p
Wndclass.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
Trong thng ip pht sinh t thit b chut th tham s lParam s cha v tr ca thit b
chut, 16 byte thp s cha gi tr ta x, cn 16 byte cao s cha gi tr ta ca y. ly ra
hai gi tr ny ta c th dng macro l LOWORD v HIWORD.
Gi tr wParam s cho bit trng thi ca nt nhn, phm Shift, v phm Ctrl. Chng ta
c th kim tra cc trng thi ny bng cch dng bit mt n c nh ngha trc trong
WINUSER.H. Cc mt n ny c bt u bng tin t MK_xxx (Mouse Key)
MK_LBUTTON
Nt chut tri nhn
MK_MBUTTON
Nt chut gia nhn
MK_RBUTTON
Nt chut phi nhn
Trang 116
NGN NG LP TRNH LP TRNH C TRN WINDOWS
MK_SHIFT
Phm Shift c nhn
MK_CONTROL
Phm Ctrl c nhn
...
/* C gi phm control */
else
Nh chng ta bit khi di chuyn thit b chut qua vng lm vic th thng ip
WM_MOUSEMOVE s c gi n cho th tc ca s . Nhng Windows khng pht sinh
thng ip ny cho tng pixel trn mn hnh m tu thuc vo thng s phn cng ca thit b
chut c ci t v tc lm vic ca n.
Khi chng ta kch nt chut tri vo vng lm vic ca mt ca s khng kch hot
(inactive window) th Windows s kch hot ca s ny tc l ca s va c kch sau truyn
thng ip WM_LBUTTONDOWN vo th tc WndProc ca ca s. Khi mt ca s nhn
c thng ip WM_XXXDOWN th khng nht thit phi nhn c thng ip
WM_XXXUP hay ngc li. iu ny c gii thch nh sau, khi ngi dng kch tri vo
mt ca s v gi lun nt chut va kch ri ko thit b chut n mt vng thuc phm vi ca
ca s khc mi th. Khi ca s u tin s nhn c thng ip nhn chut
WM_LBUTTONDOWN v ca s th hai s nhn c thng ip nh thit b chut
WM_LBUTTONUP. Tuy nhin tnh hung trn s khng xut hin vi hai trng hp ngoi l
sau :
Trang 117
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Cng tng t nh thng ip xut pht t vng lm vic, cc thng ip ngoi vng lm
vic c nh ngha vi t NC vo sau du "_", ta c bng m t cc thng ip pht sinh t
ngoi vng lm vic nh sau.
Nt Nhn Th Nhn p
Trang 118
NGN NG LP TRNH LP TRNH C TRN WINDOWS
pt l bit cu trc POINT, hai hm trn s nhn tham chiu n bin pt do sau khi gi
hm ta s c gi tr pt tng ng ta mi.
on chng trnh thc hin chc nng v t do bng cc thao tc: Nhn chut tri v
mt ng thng t v tr con tr ca bt v n v tr chut tri kch, ngoi ra ta cng c th v
bng cch nhn phm tri v gi lun sau ta ko chut n v tr bt k ri th. Nu ta nhn
chut phi th s i mu ca bt v.
HDC hdc;
Trang 119
NGN NG LP TRNH LP TRNH C TRN WINDOWS
int WIDTH_PEN = 2;
HPEN oPen,pen;
POINT point;
case WM_LBUTTONDOWN:
oldPoint = point;
DeleteObject ( pen );
Trang 120
NGN NG LP TRNH LP TRNH C TRN WINDOWS
break;
case WM_RBUTTONDOWN:
/* Chuyn index ca bng mu sang v tr tip theo, nu cui bng mu th quay li mu u tin*/
break;
case WM_MOUSEMOVE:
oldPoint = point;
DeleteObject ( pen );
break;
Trang 121
NGN NG LP TRNH LP TRNH C TRN WINDOWS
case WM_DESTROY:
PostQuitMessage ( 0 );
break;
default:
return 0;
Nh chng ta bit Windows cung cp cho ta cc thng tin thng qua dng thng ip
nh l thng ip bn phm, thng ip pht sinh t thit b chut . V ngoi ra th mt thng
ip cng rt hu dng l thng ip thi gian. Khi vit mt chng trnh chng ta c th yu
cu h iu hnh gi mt thng ip cnh bo theo tng khong thi gian nht nh chng ta
c th lm mt s x l cn thit. Thng ip ny c gi t h iu hnh n chng trnh
thng qua mt b nh thi gian (Timer) v thng ip c pht sinh l WM_TIMER. Vic
dng chc nng ny rt n gin, ta khai bo mt b nh thi gian v thit lp thng s khong
thi gian Windows pht sinh thng ip Timer cho ng dng. Khi ng dng ch cn x l
thng ip WM_TIMER trong hm x l ca s WinProc.
Theo l thuyt thng ip thi gian do Windows cung cp l chnh xc n mili giy
nhng thc t khng hon ton nh vy. S chnh xc cn ph thuc vo ng h ca h thng
v cc hot ng hin thi ca chng trnh. Nguyn nhn ca vn l thng ip thi gian
WM_TIMER c u tin thp, nh thng ip t v li mn hnh WM_PAINT, thng thng
chng phi ch cho x l xong cc thng ip khc.
Trang 122
NGN NG LP TRNH LP TRNH C TRN WINDOWS
on chng trnh minh ha vic s dng b nh thi gian trong chng trnh. C mi
0.5 giy th chng trnh pht sinh t ng ngu nhin mt vng trn trn mn hnh.
#include <time.h>
#include "stdio.h"
#define IDT_TIMER1 1
PAINTSTRUCT ps;
HDC hdc;
Trang 123
NGN NG LP TRNH LP TRNH C TRN WINDOWS
int r = 5, i;
RECT rc;
/* X l thng ip*/
switch ( message )
case WM_CREATE:
break;
case WM_PAINT:
/* Ly li bt v trc v hy bt v va to*/
DeleteObject ( pen );
break;
case WM_TIMER:
Trang 124
NGN NG LP TRNH LP TRNH C TRN WINDOWS
NumCir++;
break;
case WM_DESTROY:
PostQuitMessage ( 0 );
break;
default:
return 0;
4.4.3.2. Dng hm x l
on chng trnh sau cng khai bo s dng mt b nh thi gian, nhng khai bo trc
tip, tc l khi ht thi gian ch thay v truyn thng ip WM_TIMER th Windows gi hm
TimerProc thc hin.
Trang 125
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Chng trnh khi thc thi s xut ra mt dng ng h in t theo dng : gi : pht
:giy.
#include <time.h>
#include "stdio.h"
#define IDT_TIMER1 1
PAINTSTRUCT ps;
HDC hdc;
struct tm *newtime;
time_t CurTime;
RECT rc;
LOGFONT lf;
switch ( message )
case WM_CREATE:
break;
case WM_PAINT:
Trang 126
NGN NG LP TRNH LP TRNH C TRN WINDOWS
/* Ly gi ng h h thng*/
time( &CurTime );
/* Thit lp mu k t xut*/
lf.lfHeight = 50;
/* Xut ra mn hnh*/
/* Ly li cc gi tr mc nh*/
SetTextColor ( hdc,oldColor );
SelectObject ( hdc,oldFont );
DeleteObject ( font );
break;
case WM_DESTROY:
PostQuitMessage ( 0 );
break;
default:
Trang 127
NGN NG LP TRNH LP TRNH C TRN WINDOWS
return 0;
/* Hm x l ca Timer*/
VOID CALLBACK TimerProc( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
RECT rc;
Trang 128
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Chng 5
X L VN BN V FONT CH
5.1. M U
Mt trong cc c tnh ni bt nht ca Windows l giao din giao tip vi ngi dng.
Nh c tnh ny, nhiu dng d liu thng tin khc nhau c my tnh h tr khi xut ra mn
hnh, my in, Trong , xut vn bn ra vng lm vic ca cc ng dng Win32 l hnh thc
ph bin nht trong giao din ha.
cc chng trc, cc thao tc xut thng tin ch c thc hin thng qua cc ca s
thng bo, hp thoi v cc phn t iu khin. Chng ny s trnh by cch th hin ni dung
vn bn trn vng lm vic ca ca s thng qua cc hm Win32 API.
Phn cui chng s trnh by cch khi to, chn v x l cc dng font ch khc nhau.
Nh kh nng ny, vic th hin cc on vn bn s tr nn sinh ng v trc quan hn.
5.2. X L VN BN
5.2.1. Hin th vn bn
Hm ph bin nht thc hin thao tc xut mt chui k t vn bn, s dng font ch,
mu ch v mu nn hin hnh l :
BOOL TextOut(HDC hDC, int nXStart, int nYStart, LPCTSTR lpString, int cbString);
Trang 129
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Nu thao tc xut chui thc hin thnh cng, hm tr v gi tr khc 0. Ngc li, gi tr
tr v bng 0.
LONG TabbedTextOut(HDC hDC, int nX, int nY, LPCTSTR lpString, int nCount, int
nNumTabs, LPINT lpnTabStopPositions, int nTabOrigin);
Hm tr v kch thc chui hin th, theo n v logic, nu thnh cng. Ngc li, hm
tr v 0. Trong , chiu cao chui l WORD cao ca bin kiu LONG, chiu rng l WORD
thp.
BOOL ExtTextOut(HDC hDC, int X, int Y, UINT fuOptions, CONST RECT *lprc,
LPCTSTR lpString, UINT cbCount, CONST INT *lpDx);
Trang 130
NGN NG LP TRNH LP TRNH C TRN WINDOWS
int DrawText(HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT
uFormat);
Trong trng hp hin th nhiu dng vn bn, Windows ch ngt dng khi gp k t CR
v LF. ngt dng di hn kch thc hnh ch nht hin th, cn thit lp c
DT_WORDBREAK. Nu khng mun Windows ct b cc phn d ra khi v ch vt qu
phm vi khung ch nht, ta thm c DT_NOCLIP. Nu mun k t tab (\t hoc 0x09) c
din dch thnh k t phn ct, cn thm c DT_EXPANDTABS. Gi tr mc nh ca tab l 8
khong trng. C DT_TABSTOP c dng t li gi tr tab. Trong trng hp ny, byte cao
ca word thp (bits 15-8) ca uFormat s cha gi tr tab cn thay th.
5.2.2. nh dng vn bn
Vic thit lp thuc tnh nh dng vn bn cho DC c thc hin thng qua cc hm
canh l vn bn, thit lp khong cch k t, xc nh mu nn v mu vn bn. Cng vi cc
hm ny, Windows cng cung cp cc hm cho bit thuc tnh hin hnh tng ng cho DC.
Trong cc hm v thuc tnh DC, bin u tin lun l handle ca DC hin hnh. Xt
hm thit lp mu ch v mu nn :
Trang 131
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 132
NGN NG LP TRNH LP TRNH C TRN WINDOWS
case TA_LEFT:
case TA_RIGHT:
case TA_CENTER:
UINT uAlignPrev;
char szCount[8];
Trang 133
NGN NG LP TRNH LP TRNH C TRN WINDOWS
SetTextAlign(hdc, uAlignPrev);
Nu thnh cng, gi tr tr v cho bit khong cch hin ti. Ngc li, gi tr tr v l
0x80000000.
Ngoi ra, Windows cn h tr cc hm cho bit rng k t v kch thc chui hin
th. y l cc hm cp cao, s dng trong vic trnh by vn bn vi cc kiu font kh phc tp.
Trong chng ny, chng ta ch cp n mt s hm nh GetTextMetrics (phn 5.3.2) v
GetTextExtentPoint32 (phn 5.3.5).
5.3. FONT CH
Trong Windows, khi trnh by vn bn, cc k t c th hin theo nhiu dng khc
nhau. y l mt trong nhng c trng c bn ca giao din ha - ngi dng (GUI
Graphical User Interface). thc hin iu ny, Windows h tr nhiu dng font ch khc
nhau. Trong phn ny, chng ta tm hiu cc vn chnh v cc font ch, cng nh cch s
dng chng trnh by vn bn.
Trang 134
NGN NG LP TRNH LP TRNH C TRN WINDOWS
bnh, thng dng trong in n. Font opaque l dng c bin i nging ca font roman. Font
italic l dng font c thit k theo dng nghing chuyn bit.
Mt tp cc font vi mt s kch c v trng lng khc nhau nhng cng mt kiu loi
c xem l mt h font ch.
Cc font ch trong Windows c chia thnh hai nhm, gi l font GDI v font thit b.
Font GDI c lu tr di dng tp tin trn a, trong khi font thit b c thit k sn trong
thit b xut tng ng, v d my in. Khng nh font GDI, khi in bng font thit b, Windows
khng cn nh dng font, m ch cn gi ni dung d liu trc tip n thit b. Ngi dng
chn trc tip font t my in in. i vi font GDI, Windows chuyn vn bn thnh nh
bitmap sau chuyn n my in in. Nh vy, li im ca font GDI l c lp vi thit b
xut, tuy nhin tc x l in chm hn.
Cc font GDI thng thng gm c : font bitmap, font vector v font TrueType. Font
bitmap c cu thnh t ma trn pixel, c li im l hin th nhanh, nhng hn ch trong vic
th hin vi cc kch thc khc nhau (do ch phng to thu nh, v khi phng trng rt th).
Font vector th hin cc k t nh l tp hp cc nt v (s dng cc hm GDI), do linh ng
v co gin hn font bitmap, tuy nhin c v kh chm v ng nt cng khng c mm
mi cho lm.
Font TrueType l dng font c s dng ph bin nht hin nay, c lu tr di dng
mt tp cc im nh, kt hp mt s thut ton bin i. Do th hin sc xo cc ng nt
trn mn hnh v my in. Chng ta s kho st cc hm x l cho cc font ch dng ny trong
phn 5.3.3. Cn by gi chng ta tm hiu cch s dng cc font c sn ca h thng.
MACRO FONT
Trang 135
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trong , kiu HGDIOBJ l HFONT, bin fnObject l mt trong cc macro bng trn.
Nu thnh cng, hm ny tr v handle ca font h thng hin hnh. Ngc li, gi tr tr v l
NULL. thay i font, ta gi hm SelectObject.
Trang 136
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Hoc gn hn, ta c th gi :
SelectObject(hDC.GetStockObject(fnObject));
Khi , font hin hnh trong DC l font va c gi. Hm tr v macro font trc .
Nu khng thnh cng, li tr v l GDI_ERROR. Thng khi gi font nh sn, nu cc font
khng c sn, h thng s tr v font h thng (SYSTEM_FONT). Lu , ch nn dng cc font
c sn nu ch hin th ca DC ng dng hin thi l MM_TEXT.
xem cc thuc tnh ca font h thng, v d kch thc ca b font tnh ton v tr
khi xut vn bn, ta dng hm GetTextMetrics.
on chng trnh sau minh ha vic chn font nh sn vo mt DC, sau vit mt
chui k t s dng font ny.
hfnt = GetStockObject(ANSI_VAR_FONT);
SelectObject(hdc, hOldFont);
Trang 137
NGN NG LP TRNH LP TRNH C TRN WINDOWS
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
Trang 138
NGN NG LP TRNH LP TRNH C TRN WINDOWS
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;
RECT rc;
int angle;
Trang 139
NGN NG LP TRNH LP TRNH C TRN WINDOWS
// Xc nh tn v m nht ca font.
lstrcpy(plf->lfFaceName, "Arial");
plf->lfWeight = FW_NORMAL;
GetClientRect(hwnd, &rc);
SetBkMode(hdc, TRANSPARENT);
plf->lfEscapement = angle;
hfnt = CreateFontIndirect(plf);
SelectObject(hdc, hfntPrev);
DeleteObject(hfnt);
SetBkMode(hdc, OPAQUE);
LocalFree((LOCALHANDLE) plf);
Tn Gi tr
Trang 140
NGN NG LP TRNH LP TRNH C TRN WINDOWS
FW_DONTCARE 0
FW_THIN 100
FW_EXTRALIGHT 200
FW_ULTRALIGHT 200
FW_LIGHT 300
FW_NORMAL 400
FW_REGULAR 400
FW_MEDIUM 500
FW_SEMIBOLD 600
FW_DEMIBOLD 600
FW_BOLD 700
FW_EXTRABOLD 800
FW_ULTRABOLD 800
FW_HEAVY 900
FW_BLACK 900
Trang 141
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Sau khi chn font cho DC, ta cn bit cc c trng ca font hin ti dng cho vic
xut vn bn bng hm GetTextMetrics. Ta c cu trc TEXTMETRIC :
LONG tmHeight;
LONG tmAscent;
LONG tmDescent;
LONG tmInternalLeading;
LONG tmExternalLeading;
LONG tmAveCharWidth;
LONG tmMaxCharWidth;
LONG tmWeight;
LONG tmOverhang;
LONG tmDigitizedAspectX;
LONG tmDigitizedAspectY;
BCHAR tmFirstChar;
BCHAR tmLastChar;
BCHAR tmDefaultChar;
BCHAR tmBreakChar;
Trang 142
NGN NG LP TRNH LP TRNH C TRN WINDOWS
BYTE tmItalic;
BYTE tmUnderlined;
BYTE tmStruckOut;
BYTE tmPitchAndFamily;
BYTE tmCharSet;
} TEXTMETRIC;
Trng tmOverhang cho bit phn m rng (theo n v logic) m Windows thm vo
font vector khi font nghing hoc t m. Khi font nghing, gi tr tmAveCharWidth khng thay
i, bi v chui cc k t nghing vn c rng bng chui ch thng thng. Trong trng
hp ch m, Windows s m rng tng k t. Khi , tmAveCharWidth ca k t bnh thng
bng tmAveCharWidth tr i ln tmOverhang ca k t m.
Trang 143
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Xt cu trc CHOOSEFONT.
DWORD lStructSize;
HWND hwndOwner;
HDC hDC;
LPLOGFONT lpLogFont;
INT iPointSize;
DWORD Flags;
DWORD rgbColors;
LPARAM lCustData;
LPCFHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
HINSTANCE hInstance;
LPTSTR lpszStyle;
WORD nFontType;
WORD ___MISSING_ALIGNMENT__;
INT nSizeMin;
INT nSizeMax;
} CHOOSEFONT;
Trang 144
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 145
NGN NG LP TRNH LP TRNH C TRN WINDOWS
CF_FORCEFONTEXIST Xc nh hm ChooseFont s ch ra li
nu ngi dng c chn font hoc kiu khng
tn ti.
Trang 146
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 147
NGN NG LP TRNH LP TRNH C TRN WINDOWS
BOLD_FONTTYPE Font ch m. Gi tr ny c lp
li trong trng lfWeight ca cu trc
LOGFONT, v bng FW_BOLD.
Trang 148
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Nh trnh by trn, to hp thoi font cho php ngi dng chn cc thuc tnh
ca mt font logic, ta dng hm ChooseFont.
CHOOSEFONT cf;
LOGFONT lf;
HFONT hfont;
cf.lStructSize = sizeof(CHOOSEFONT);
cf.hwndOwner = (HWND)NULL;
cf.hDC = (HDC)NULL;
cf.lpLogFont = &lf;
Trang 149
NGN NG LP TRNH LP TRNH C TRN WINDOWS
cf.iPointSize = 0;
cf.Flags = CF_SCREENFONTS;
cf.rgbColors = RGB(0,0,0);
cf.lCustData = 0L;
cf.lpfnHook = (LPCFHOOKPROC)NULL;
cf.lpTemplateName = (LPSTR)NULL;
cf.lpszStyle = (LPSTR)NULL;
cf.nFontType = SCREEN_FONTTYPE;
cf.nSizeMin = 0;
cf.nSizeMax = 0;
ChooseFont(&cf);
hfont = CreateFontIndirect(cf.lpLogFont);
return (hfont);
int XIncrement;
int YStart;
TEXTMETRIC tm;
Trang 150
NGN NG LP TRNH LP TRNH C TRN WINDOWS
SIZE sz;
hfntItalic = MyCreateFont();
hfntBold = MyCreateFont();
XIncrement = 10;
YStart = 50;
XIncrement += sz.cx;
GetTextMetrics(hdc, &tm);
XIncrement -= tm.tmOverhang;
GetTextMetrics(hdc, &tm);
XIncrement -= tm.tmOverhang;
Trang 151
NGN NG LP TRNH LP TRNH C TRN WINDOWS
XIncrement += sz.cx;
SelectObject(hdc, hfntBold);
SelectObject(hdc, hfntDefault);
/* Xo cc i tng font ch */
DeleteObject(hfntItalic);
DeleteObject(hfntBold);
LONG cx;
LONG cy;
} SIZE;
Cu trc trn xc nh chiu rng v chiu cao ca mt hnh ch nht ln lt qua hai
bin cx v cy.
Trang 152
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Chng 6
HA V CC I TNG GDI
6.1. M U
Mn hnh
My in
My v
GDI c trch nhim giao tip v kt xut cc yu cu m ngi dng chuyn cho n n
ng thit b ch. V c bn, n giao tip vi cc trnh iu khin thit b (cc tp tin .drv), tht
ra cc trnh iu khin thit b cng l mt giao din do Windows a ra, do trch nhim nng
n khng tht s thuc v GDI ca Windows m l ca cc nh sn xut thit b phn cng, h
buc phi cung cp trnh iu khin theo giao din ny nu mun bn c sn phm cho ngi
dng Windows. Nh vy, ngi lp trnh khng cn quan tm n vic iu khin trc tip thit
b xut m ch cn quan tm n th vin hm GDI.
Trang 153
NGN NG LP TRNH LP TRNH C TRN WINDOWS
HDC hDC;
/* Ly device context ca ca s */
hDC=GetDC(hWnd);
RealeaseDC(hWnd, hDC);
V d 2 : V hnh ch nht
HDC hDC;
/* Ly v device context ca ca s */
hDC=GetDC(hWnd);
/* To bt v mi vi nt lin, dy 5, mu xanh */
oldHPen=(HPEN)SelectObject(hDC, hPen);
/* V hnh ch nht */
Trang 154
NGN NG LP TRNH LP TRNH C TRN WINDOWS
/* Restore li bt v c */
SelectObject(hDC, oldHPen);
/* Gii phng bt v to ra */
DeleteObject(hPen);
ReleaseDC(hWnd, hDC);
// X l
EndPaint(hWnd, &ps);
hDC = GetDC(hWnd);
//X l
ReleaseDC(hWnd, hDC);
hDC = GetWindowDC(hWnd);
// X l
ReleaseDC(hWnd, hDC);
Trang 155
NGN NG LP TRNH LP TRNH C TRN WINDOWS
HDC hMemDC;
hMemDC = CreateCompatibleDC(hDC);
SelectObject(hMemDC, hBitmap);
Sau khi chn mt i tng bitmap cho MDC, c th dng MDC nh mt device context
tht s.
case WM_PAINT:
Trang 156
NGN NG LP TRNH LP TRNH C TRN WINDOWS
RECT rect;
GetClientRect(hWnd, &rect);
HDC hMemDC;
hMemDC = CreateCompatibleDC(hdc);
HBITMAP bitmap,oBitmap;
bitmap = CreateCompatibleBitmap(hdc,rect.right,rect.bottom);
oBitmap = (HBITMAP)SelectObject(hMemDC,bitmap);
// V li nn MDC
SetPixel(hMemDC, 0, 0, RGB(255,0,0));
SelectObject(hMemDC, oBitmap);
DeleteDC(hMemDC);
DeleteObject(bitmap);
EndPaint(hWnd, &ps);
break;
Trang 157
NGN NG LP TRNH LP TRNH C TRN WINDOWS
6.3. MT S HM HA C S
6.3.1. Nhm hm v
BOOL Rectangle(HDC hDC, int left, int top, int right, int bottom);
Trang 158
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Gi tr Gii thch
PS_SOLID
PS_DASH
PS_DOT
PS_DASHDOT
PS_DASHDOTDOT
PS_INSIDEFRAME
V d : To bt v mi v dng bt v ny v mt s ng c s.
HDC hDC;
POINT PointArr[3];
hDC = GetDC(hWnd);
PointArr[0].x = 50;
PointArr[0].y = 10;
PointArr[1].x = 250;
PointArr[1].y = 50;
PointArr[2].x = 125;
PointArr[2].y = 130;
Trang 159
NGN NG LP TRNH LP TRNH C TRN WINDOWS
//V ng thng vi bt v mi
SelectObject(hDC, hOldPen);
DeleteObject(hPen);
ReleaseDC(hWnd, hDC);
To mu t c vi mu cRef.
Cc kiu bStyle :
HS_HORIZONTAL
HS_VERTICAL
HS_FDIAGONAL
HS_BDIAGONAL
HS_CROSS
Trang 160
NGN NG LP TRNH LP TRNH C TRN WINDOWS
HS_DIAGCROSS
BOOL ExtFloodFill(HDC hDC, int xStart, int yStart, COLORREF cRef, UINT
fillStyle);
V d : S dng cc mu c sn v to cc mu t mi t.
HDC hDC;
HPEN hPen;
hDC = GetDC(hWnd);
hPen = (HPEN)GetStockObject(BLACK_PEN);
SelectObject(hDC, hPen);
hBrush = (HBRUSH)GetStockObject(GRAY_BRUSH);
SelectObject(hDC, hBrush);
// To mu t mi t hnh th hai
Trang 161
NGN NG LP TRNH LP TRNH C TRN WINDOWS
SelectObject(hDC, hOldBrush);
DeleteObject(hBrush);
ReleaseDC(hWnd, hDC);
6.3.3.1. Np nh
RECT rect;
GetClientRect(hWnd, &rect);
HDC hdc;
hdc = GetDC(hWnd);
HDC hMemDC;
hMemDC = CreateCompatibleDC(hdc);
HBITMAP hNewBmp,hOldBmp;
Trang 162
NGN NG LP TRNH LP TRNH C TRN WINDOWS
if(hNewBmp)
hOldBmp = (HBITMAP)SelectObject(hMemDC,hNewBmp);
SelectObject(hMemDC, hOldBmp);
DeleteObject(hNewBmp);
DeleteDC(hMemDC);
ReleaseDC(hdc);
Trang 163
NGN NG LP TRNH LP TRNH C TRN WINDOWS
o Cu trc BITMAPFILEHEADER
o Cu trc BITMAPINFO
Trang 164
NGN NG LP TRNH LP TRNH C TRN WINDOWS
o Cu trc BITMAPINFOHEADER
= 4: nh 16 mu
= 8: nh 256 mu
=16: nh 16 bits
=24: nh 24 bits
Trang 165
NGN NG LP TRNH LP TRNH C TRN WINDOWS
biXPelsPerMeter LONG phn gii (DPI/m) theo phng ngang. Dng trong
trng hp nh qut t scanner.
biYPelsPerMeter LONG phn gii (DPI/m) theo phng dc. Dng trong
trng hp nh qut t scanner.
biClrImportant DWORD S lng mu quan trng dng trong vic hin th nh.
Nu = 0 ht dng tt c mu trong bng mu.
o Cu trc RGBQUAD
Trang 166
NGN NG LP TRNH LP TRNH C TRN WINDOWS
(R,G,B) ca im nh i = bmiColors[i]
i vi nh 16 v 24 bits mu, ta khng dng palette v cch biu din ca phn d liu
c trnh by trn.
Phn d liu ca file bitmap c th c nn theo phng php RLE, ti liu ny khng
trnh by chi tit vo mi loi nh nn, nu cn cc bn c th tham kho trong cc gio trnh v
x l nh.
V d : Np nh bitmap t file.
try
Trang 167
NGN NG LP TRNH LP TRNH C TRN WINDOWS
int FHandle;
BITMAPFILEHEADER bmpfh;
BITMAPINFO *BmpInfo;
int Count,NumColor;
long n, BytesPerLine;
Count=0;
SetCursor(LoadCursor(NULL, IDC_WAIT));
// M file bitmap c
if ((FHandle=open(bmpFN, O_BINARY|O_RDONLY))==-1)
hBmp=GlobalAlloc(LMEM_MOVEABLE, bmpfh.bfOffBits-sizeof(BITMAPFILEHEADER));
BmpInfo=(BITMAPINFO*)GlobalLock(hBmp);
if (BmpInfo->bmiHeader.biCompression != BI_RGB)
// Xc nh s mu ca palette
NumColor=(int)pow(2,BmpInfo->bmiHeader.biBitCount);
if(NumColor>256)
BytesPerLine=(bmpfh.bfSize-bmpfh.bfOffBits)/
Trang 168
NGN NG LP TRNH LP TRNH C TRN WINDOWS
BmpInfo->bmiHeader.biHeight;
/* Cp nht thng tin kch thc nh trn BITMAPINFO (hin ti = 0 nu nh khng nn) */
BmpInfo->bmiHeader.biSizeImage=bmpfh.bfSize-bmpfh.bfOffBits;
hBuff=GlobalAlloc(GMEM_MOVEABLE,
BmpInfo->bmiHeader.biSizeImage);
do
n = read(FHandle,Buff,BytesPerLine);
Buff+=n;
Count++;
}while (Count<BmpInfo->bmiHeader.biHeight);
close(FHandle);
GlobalUnlock(hBuff);
GlobalUnlock(hBmp);
SetCursor(LoadCursor(NULL, IDC_ARROW));
HANDLE hMemPal;
HPALETTE hPal;
int i;
hMemPal=GlobalAlloc(LMEM_MOVEABLE, sizeof(LOGPALETTE)
+NumColor*sizeof(PALETTEENTRY));
Trang 169
NGN NG LP TRNH LP TRNH C TRN WINDOWS
// S mc trong Palette
logPal->palNumEntries=NumColor;
logPal->palVersion=0x300;
logPal->palPalEntry[i].peRed=BmpInfo->bmiColors[i].rgbRed;
logPal->palPalEntry[i].peGreen =
BmpInfo->bmiColors[i].rgbGreen;
logPal->palPalEntry[i].peBlue =
BmpInfo->bmiColors[i].rgbBlue;
logPal->palPalEntry[i].peFlags = PC_RESERVED;
hPal=CreatePalette(logPal);
GlobalUnlock(hMemPal);
GlobalFree(hMemPal);
SetCursor(LoadCursor(NULL, IDC_WAIT));
SelectPalette(hdc,hPal,FALSE);
RealizePalette(hdc);
BmpInfo=(BITMAPINFO *)LocalLock(hBmp);
//To bitmap
Trang 170
NGN NG LP TRNH LP TRNH C TRN WINDOWS
GlobalUnlock(hBuff);
GlobalUnlock(hBmp);
GlobalFree(hBuff);
GlobalFree(hBmp);
SetCursor(LoadCursor(NULL, IDC_ARROW));
HDC hMemDC;
HANDLE OldBmp;
// To MDC
hMemDC=CreateCompatibleDC(hdc);
// Tr v palette h thng
UnrealizeObject(hPal);
// Map li palette
RealizePalette(hdc);
OldBmp=SelectObject(hMemDC, hBmp);
// Hy MDC
SelectObject(hMemDC,OldBmp);
DeleteDC(hMemDC);
Trang 171
NGN NG LP TRNH LP TRNH C TRN WINDOWS
catch(char *e)
6.3.3.2. Zoom nh
RECT rect;
GetClientRect(hWnd, &rect);
HDC hdc;
hdc = GetDC(hWnd);
hSourceMemDC = CreateCompatibleDC(hdc);
hDestMemDC = CreateCompatibleDC(hdc);
HBITMAP hBmp,hOldBmp,hBlankBmp,hOldBlankBmp;
hBlankBmp = CreateCompatibleBitmap(hdc,rect.right,rect.bottom);
Trang 172
NGN NG LP TRNH LP TRNH C TRN WINDOWS
hOldBlankBmp =(HBITMAP)SelectObject(hDestMemDC,hBlankBmp);
// Ly v thng tin ca nh
BITMAP bmpInfo;
SelectObject(hSourceMemDC, hOldBmp);
DeleteObject(hBmp);
SelectObject(hDestMemDC, hOldBlankBmp);
DeleteObject(hBlankBmp);
DeleteDC(hSourceMemDC);
DeleteDC(hDestMemDC);
ReleaseDC(hdc);
6.4. IN N
Trn Windows, cc ng dng khng truy xut trc tip my in m s dng cc hm GDI
v ra device context ca my in. Do vic in n trn Windows tr nn n gin, tng t
vic v ra cc hp thoi trn mn hnh.
Trang 173
NGN NG LP TRNH LP TRNH C TRN WINDOWS
[windows]
V d : In dng ch ra my in mc nh.
char prnInfo[200];
If ( strcmp(prnInfo, "NoPrinter") )
Trang 174
NGN NG LP TRNH LP TRNH C TRN WINDOWS
char seps[10];
char *token;
strcpy(seps,",");
strcpy(prnName, token);
token=strtok(NULL, seps);
strcpy(prnDriver, token);
token=strtok(NULL, seps);
strcpy(prnPort, token);
HDC prnDC;
if(prnDC)
StartDoc(prnDC, NULL);
StartPage(prnDC);
EndPage(prnDC);
EndDoc(prnDC);
DeleteDC(prnDC);
Trang 175
NGN NG LP TRNH LP TRNH C TRN WINDOWS
PRINTDLG pd;
ZeroMemory(&pd, sizeof(PRINTDLG));
pd.lStructSize = sizeof(PRINTDLG);
pd.hwndOwner = GetFocus();
pd.Flags = PD_RETURNDC|PD_NOSELECTION;
if(PrintDlg(&pd))
StartDoc(pd.hDC, NULL);
Trang 176
NGN NG LP TRNH LP TRNH C TRN WINDOWS
StartPage(pd.hDC);
EndPage(pd.hDC);
EndDoc(pd.hDC);
DeleteDC(pd.hDC);
6.4.2. Cc hm iu khin in n
Hm ngha
Trang 177
NGN NG LP TRNH LP TRNH C TRN WINDOWS
6.4.3. X l li khi in
Chng 7
QUN L B NH V TP TIN
7.1. M U
Mt tin trnh thng thng c hiu l mt chng trnh my tnh ang c thi hnh.
Qu trnh thc thi cc tin trnh gn lin vi vic qun l v s dng cc ti nguyn trong my
tnh, trong ng k nht l qun l b nh chnh v x l h thng lu tr ph.
Trong sut qu trnh thi hnh, cc chng trnh vi d liu truy xut ca chng lun c
t trong b nh chnh. Nhng b nh chnh th kh nh c th lu gi mi d liu v chng
trnh, ngoi ra d liu s mt khi khng cn c cung cp nng lng. Do , cn phi s dng
h thng lu tr ph.
Chng ny trnh by cc vn trn qua hai phn sau : phn 7.2 - Qun l b nh - trnh
by cch thc Microsoft Win32 API qun l cc vng nh thng qua cc hm cp pht, s
dng, v gii phng chng; cch thc thao tc trn a ch vng nh o v cc trang nh. Phn
7.3 - X l tp tin - trnh by cc hm thc hin cc thao tc to, x l v hy tp tin, cng nh
tm hiu mt s vn lin quan n tp tin.
7.2. QUN L B NH
Trang 178
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Hai hm ny cp pht mt vng nh theo kch thc nBytes trong heap. C prototype
nh sau :
Trang 179
NGN NG LP TRNH LP TRNH C TRN WINDOWS
GPTR GMEM_FIXED |
GMEM_ZEROINIT
GHND GMEM_MOVEABLE |
GMEM_ZEROINIT
LPTR LMEM_FIXED |
LMEM_ZEROINIT
LHND LMEM_MOVEABLE |
LMEM_ZEROINIT
Trang 180
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Nu thnh cng hm tr v con tr tr n byte u tin trong khi nh. Ngc li, gi tr
tr v l NULL.
Khi kho (lock) vng nh, cc khi nh khng th dch chuyn trong b nh my tnh.
Sau khi s dng con tr vng nh, cn m kho (unlock) chng, h thng c th di chuyn v
s dng cc vng nh linh ng cho cc tin trnh khc. Ta dng hai hm tng ng l
GlobalUnlock v LocalUnlock.
Trng nBytes xc nh kch thc cp pht li cho vng nh hMem. Tuy nhin, khi
nFlags cha GMEM_MODIFY (hoc LMEM_MODIFY), h thng b qua gi tr ny. Khi ,
hm thay i cc thuc tnh ca vng nh.
Trang 181
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Sau khi s dng xong, ta dng hm GlobalFree v LocalFree gii phng cc vng
nh c cp pht.
on chng trnh sau minh ha cch h thng cp pht mt vng nh vi kch thc
yu cu l 3500 bytes. Sau gn cc gi tr vng nh bng 0x3C.
HANDLE hMem;
LPBYTE lpAddress;
int i, nSizeMem;
if(hMem != NULL)
/* Vng nh c th ln hn 3500 */
nSizeMem = GlobalSize(hMem);
lpAddress = (LPBYTE)GlobalLock(hMem);
if(Address != NULL)
lpAddress[i] = 0x3C;
GlobalUnlock(hMem);
/* */
Trang 182
NGN NG LP TRNH LP TRNH C TRN WINDOWS
/* Nu khng dng na th gi hm
GlobalFree(hMem); */
on chng trnh tip theo cp pht li vng nh trn vi kch thc l 5000 bytes, khi
gn cc gi tr l 0x00 :
HANDLE hMemTmp;
GMEM_MOVEABLE|GMEM_ZEROINIT);
if(hMemTmp != NULL)
hMem = hMemTmp;
nSizeMem = GlobalSize(hMem);
/* */
GlobalFree(hMem); */
7.2.2 Cc hm Heap
Cc hm heap cho php cc tin trnh to mt vng heap ring cho mt hoc mt s trang
trong vng a ch ca tin trnh ang thc hin. Sau tin trnh c th s dng mt tp cc
hm khc nhau qun l vng nh trong heap ny. y khng c s phn bit gia vng nh
c cp pht bi hm heap ring hay dng cc hm cp pht khc.
Trang 183
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trng flOptions xc nh cc thuc tnh c chn cho vng heap mi c khi to.
C th l HEAP_GENERATE_ EXCEPTIONS v HEAP_NO_SERIALIZE. Trng
dwInitialSize xc nh kch thc khi to ca heap, c lm trn cho cc trang vng nh.
Trng dwMaximumSize xc nh vng nh ti a c th cp pht cho tin trnh bng hm
HeapAlloc hoc HeapReAlloc. Hm tr v handle ca i tng heap nu thnh cng, ngc li
tr v NULL.
Sau khi s dng, ta gii phng vng nh v hy i tng heap bng hm HeapFree v
HeapDestroy.
Trang 184
NGN NG LP TRNH LP TRNH C TRN WINDOWS
7.2.3 Cc hm Virtual
dnh vng khng gian a ch o cho mt tin trnh. Vng khng gian dnh
khng cp pht vng lu tr vt l tht s, nhng ngn khng cho cc thao tc cp pht
khc s dng vng nh ny. N khng nh hng n cc tin trnh khc. Khi cn s
dng, tin trnh s cp pht vng lu tr vt l cho khng gian ny.
Cp pht xc nhn chui cc trang dnh trong khng gian a ch o ca tin
trnh c th s dng vng lu tr vt l (trong RAM hoc a).
Nhn thng tin v chui cc trang trong vng a ch o ca tin trnh ang gi
hoc ca mt tin trnh xc nh khc.
Trang 185
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trng dwSize xc nh s byte kch thc vng nh. Nu lpAddress bng NULL, gi tr
ny s c lm trn n bin trang k. Nu khng, cc trang cp pht l cc trang cha mt hay
nhiu byte nm trong khong t lpAddress n lpAddress+dwSize. Ngha l, nu hai byte nm
hai trang th c hai trang u nm trong vng cp pht.
C ngha
Trang 186
NGN NG LP TRNH LP TRNH C TRN WINDOWS
th.
C ngha
PAGE_EXECUTE Cho php thc thi cc tin trnh, nhng khng c v ghi.
Trang 187
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Lu gii phng cc trang, cc trang phi cng tnh trng (cp pht hay dnh), v
tt c cc trang dnh bng hm cp pht VirtualAlloc cn gii phng ng thi. Nu mt s
trang dnh ban u c xc nhn cp pht, chng cn c kh cp pht trc khi gi
hm VirtualFree gii phng.
union
DWORD dwOemId;
Trang 188
NGN NG LP TRNH LP TRNH C TRN WINDOWS
struct
WORD wProcessorArchitecture;
WORD wReserved;
};
DWORD dwPageSize;
LPVOID lpMinimumApplicationAddress;
LPVOID lpMaximumApplicationAddress;
DWORD dwActiveProcessorMask;
DWORD dwNumberOfProcessors;
DWORD dwProcessorType;
DWORD dwAllocationGranularity;
WORD wProcessorLevel;
WORD wProcessorRevision;
}SYSTEM_INFO;
Tin trnh c th kho mt hay nhiu trang c cp pht (xc nhn) vo vng nh vt
l (RAM), ngn chn vic h thng hon chuyn cc trang vo (ra) tp tin trang bng cch dng
hm VirtualLock.
Trang 189
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trong phn ny, chng ta minh ha bng v d thc hin thao tc dnh v xc nhn
vng nh, v v d to trang "lnh canh".
Nh mt thay th cho cp pht ng, tin trnh c th n gin cp pht xc nhn vng
cn li thay v ch dnh chng. Tuy nhin vic cp pht xc nhn nh vy li to nn cc khi
nh khng cn thit ng ra c s dng cho cc tin trnh khc.
#define PAGELIMIT 80
INT PageFaultExceptionFilter(DWORD);
Trang 190
NGN NG LP TRNH LP TRNH C TRN WINDOWS
VOID MyErrorExit(LPTSTR);
LPTSTR lpNxtPage;
DWORD dwPages = 0;
VOID UseDynamicVirtualAlloc(VOID)
LPVOID lpvBase;
LPTSTR lpPtr;
BOOL bSuccess;
DWORD i;
lpvBase = VirtualAlloc(
NULL, // h thng t xc nh a ch
if (lpvBase == NULL )
MyErrorExit("VirtualAlloc reserve");
try
Trang 191
NGN NG LP TRNH LP TRNH C TRN WINDOWS
except ( PageFaultExceptionFilter(GetExceptionCode() ) )
ExitProcess( GetLastError() );
/* Gii phng cc trang sau khi s dng. u tin l cc trang c cp pht xc nhn */
bSuccess = VirtualFree(
lpvBase, // a ch c s ca khi nh
if (bSuccess)
bSuccess = VirtualFree(
lpvBase, // a ch c s ca khi nh
LPVOID lpvResult;
if (dwCode != EXCEPTION_ACCESS_VIOLATION)
Trang 192
NGN NG LP TRNH LP TRNH C TRN WINDOWS
return EXCEPTION_EXECUTE_HANDLER;
printf("page fault\n");
printf("out of pages\n");
return EXCEPTION_EXECUTE_HANDLER;
lpvResult = VirtualAlloc(
if (lpvResult == NULL )
printf("VirtualAlloc failed\n");
return EXCEPTION_EXECUTE_HANDLER;
dwPages++;
lpNxtPage += PAGESIZE;
return EXCEPTION_CONTINUE_EXECUTION;
Trang 193
NGN NG LP TRNH LP TRNH C TRN WINDOWS
on chng trnh tip theo thc hin thao tc to trang "lnh canh". Trang ny cung cp
cnh bo khi truy cp cc trang vng nh. iu ny rt hu ch cho cc ng dng cn qun l s
m rng ca cu trc d liu ng.
Nu chng trnh truy cp trang "lnh canh", h thng s pht sinh li ngoi l
STATUS_GUARD_PAGE (0x80000001). H thng cng xo c PAGE_GUARD, loi b tnh
trng "lnh canh" ca trang vng nh. H thng s khng ngng truy cp trang vng nh vi li
ngoi l STATUS_GUARD_PAGE.
Chng trnh sau minh ha cch thc hin ca mt trang lnh canh, v hin tng xut
hin li dch v h thng :
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
int main()
LPVOID lpvAddr;
DWORD cbSize;
BOOL vLock;
LPVOID commit;
/* Gi hm cp pht */
lpvAddr=VirtualAlloc(NULL,cbSize,MEM_RESERVE, PAGE_NOACCESS);
if(lpvAddr == NULL)
fprintf(stdout,"VirtualAlloc failed on
Trang 194
NGN NG LP TRNH LP TRNH C TRN WINDOWS
commit = VirtualAlloc(NULL,cbSize,MEM_COMMIT,
PAGE_READONLY|PAGE_GUARD);
if(commit == NULL)
fprintf(stderr,"VirtualAlloc failed on
else
%lp\n", cbSize,commit);
vLock = VirtualLock(commit,cbSize);
if(!vLock)
/* Kho vng nh ln na */
vLock = VirtualLock(commit,cbSize);
if(!vLock)
Trang 195
NGN NG LP TRNH LP TRNH C TRN WINDOWS
7.3 X L TP TIN
Trong phn ny, chng ta s tm hiu cc hm thao tc trn tp tin ca Win32 cho php
cc ng dng to, m, cp nht v xo cc tp tin, cng nh tm hiu cc thng s h thng v
tp tin.
7.3.1 To v m tp tin
Trang 196
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Gi tr ngha
0 Xc nh truy vn thit b n
mt i tng. Mt ng dng c th
truy vn thuc tnh thit b m khng
cn phi truy cp thit b.
Trang 197
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 198
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 199
NGN NG LP TRNH LP TRNH C TRN WINDOWS
HANDLE hFile;
GENERIC_READ, // m c
FILE_SHARE_READ, // chia s c
NULL, // khng bo mt
OPEN_EXISTING, // ch m tp tin c
if (hFile == INVALID_HANDLE_VALUE)
CloseHandle(hFile);
DeleteFile("MYFILE.TXT");
HANDLE hFile;
Trang 200
NGN NG LP TRNH LP TRNH C TRN WINDOWS
GENERIC_WRITE, // to ghi
0, // khng chia s
NULL, // khng bo mt
if (hFile == INVALID_HANDLE_VALUE)
7.3.2 To tp tin tm
Cc ng dng c th nhn mt tp tin duy nht cho tp tin tm bng cch s dng hm
GetTempFileName. xc nh ng dn n th mc cha tp tin tm c to, ta dng
hm GetTempPath.
Trang 201
NGN NG LP TRNH LP TRNH C TRN WINDOWS
path\preuuuu.TMP
Nu thc hin thnh cng, hm tr v con s duy nht xc nh trong trng uUnique.
Ngc li, gi tr tr v l 0.
Trang 202
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Hai trng trn ln lt tr n tn tp tin (th mc) hin c v tn tp tin (th mc) mi.
Tn tp tin (th mc) mi cn phi cha c trong ng dn ca n. Tn tp tin mi c th trn
mt h thng hay a khc, trong khi tn th mc mi phi cng a vi th mc c.
HANDLE hFile;
HANDLE hTempFile;
char szTempName[MAX_PATH];
char buffer[4096];
/* M tp tin c sn */
GENERIC_READ, // m c
0, // khng chia s
NULL, // khng bo mt
OPEN_EXISTING, // tp tin c sn
Trang 203
NGN NG LP TRNH LP TRNH C TRN WINDOWS
if (hFile == INVALID_HANDLE_VALUE)
/* To tp tin tm */
0, // to tn duy nht
szTempName); // vng m tn
0, // khng chia s
NULL, // khng bo mt
if (hTempFile == INVALID_HANDLE_VALUE)
/* c khi 4K vo vng m. Chuyn tt c cc k t trong vng m sang dng ch hoa. Vit vng m
vo tp tin tm. */
do
CharUpperBuff(buffer, dwBytesRead);
Trang 204
NGN NG LP TRNH LP TRNH C TRN WINDOWS
/* ng c hai tp tin */
CloseHandle(hFile);
CloseHandle(hTempFile);
if (!MoveFile(szTempName, "ALLCAPS.TXT"))
Trang 205
NGN NG LP TRNH LP TRNH C TRN WINDOWS
. . . // X l li
} // Cui phn x l li
if (dwPtrLow==0xFFFFFFFF&&(dwError=GetLastError())!=NO_ERROR)
// X l li
// . . .
} // Cui phn x l li
Trang 206
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 207
NGN NG LP TRNH LP TRNH C TRN WINDOWS
HANDLE hFile;
HANDLE hAppend;
char buff[4096];
/* M mt tp tin c */
GENERIC_READ, // m c
0, // khng chia s
Trang 208
NGN NG LP TRNH LP TRNH C TRN WINDOWS
NULL, // khng bo mt
OPEN_EXISTING, // ch m tp tin tn ti
if (hFile == INVALID_HANDLE_VALUE)
GENERIC_WRITE, // m ghi
0, // khng chia s
NULL, // khng bo mt
if (hAppend == INVALID_HANDLE_VALUE)
/* Ni tp tin th nht vo cui tp tin th hai. Kho tp tin th hai ngn chn cc tin trnh khc truy
cp khi ang ghi. M kho sau khi ghi xong */
do
Trang 209
NGN NG LP TRNH LP TRNH C TRN WINDOWS
/* ng c hai tp tin */
CloseHandle(hFile);
CloseHandle(hAppend);
7.3.6 ng v xo tp tin
7.3.7 X l th mc
Trang 210
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 211