Professional Documents
Culture Documents
NGN NG LP TRNH
WINDOWS
LP TRNH c TRN
WINDOWS
Trang 1
NGN NG LP TRNH
WINDOWS
LP TRNH c TRN
Chng 1
TNG QUAN LP TRNH c TRN WINDOWS
1.1. M U
lp trnh trn Microsoft Windows, chng ta cn nm c cc c im c bn
nht ca h iu hnh ny. Chng ny s gii thiu khi qut cc c im h iu hnh
Microsoft Windows, cc vn lin quan n lp nh bng ngn ng c, ng thi a ra
mt chng trnh mu lm sn cho cc chng trnh c vit sau ny.
Trong phn u, chng ta tm hiu s lc lch s pht trin ca h iu hnh
Microsoft Windows v nhng c im nn tng ca Windows.
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 in 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 nh ng dng in hnh, v
hu ht cc on chng trnh c vit minh ha trong sch u ly chng nh 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.
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Trong s pht in 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).
H iu hnh Windows 95 c cng b nm 1995 cng l mt h iu hnh 32-bit
cho Intel 386 tr v sau. Tuy thiu tnh bo m t nh Windows NT v vic thch nghi vi my
trm cng ngh RISC, nhng b li h iu hnh ny yu cu phn ctig khng cao.
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 eifrig tt hn, v cui cng l vic tch hp cht ch vi
Internet v Word Wide Web.
Windows 2000 l h iu hnh c xem l n nh v tt ca dng Windows, phin
bn ny tng cng cc tnh nng bo m t thch hp trong mi trng mng v giao din
p.
Trang 3
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
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 ong thc n gim thi gian cho ngi dng phi m thc
n v chn. Thng thng khi cn ly thng tin hay cung cp thng tn cho ngi dng thi
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.
Windows l mt h iu hnh a nhim, ty thuc vo b nh m ta c th chy
nhiu ng dng cng mt lc, v cng c th ng thi chuyn qua li gia cc ng dng v
thc thi chng. Trong cc phin bn ca Windows 98 v NT tr v sau, cc chng trnh
ng dng t bn thn chng chia thnh nhiu tiu trnh (thread) x l v vi tc x l
nhanh to cm gic nhng chng trnh Lftig dng ny chy ng thi vi nhau.
Trong Windows, chng trnh ng dng khi thc thi c chia s nhhg th tc m
Windows cung cp sn, cc tp tn cung cp nhTag th tc n 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 nhhg 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 qnan trng ra
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. Nhhg
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.
Trong cc phin bn sau ny, h thng lin kt ng c to ra rt nhiu, tuy nhin,
hu ht cc hm c gi trong th vin ny phn thnh 3 n v sau: Kernel, User, v GDI.
Kernel cung cp cc hm v th tc m mt ht nhn h iu hnh truyn thng qun
l, nh qun l b nh, xut nhp tp tin v tc v. Th vin ny c ci t trong tp tin
KRNL386.EXE 16 bit v KERNEL32.DLL 32 bit!
User qun l giao din ngi dng, ci t tt c khung ca s mc lun l. Th
vin User c ci t trong tp n USER.EXE 16 bit v USER32.DLL 32 bit.
Trang 4
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
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.
Trong Windows 98, th vin lin kt ng cha khong vi ngn hm, mi hm c tn
c t, v d CreateWindow, hm ny dng to mt ca s cho ng dng. Khi s dng
cc hm m Windows cung cp cho th cc ng dng phi khai bo trong cc tp tn tiu .h
hay .hpp (header file).
Trong mt chng trnh Windows, c s khc bit khi ta gi mt hm ca th vin c
v mt hm ca Windows hay th vin lin kt ng cung cp. l khi bin dch m my,
cc hm th vin c s c lin kt thnh m chng trnh. Trong khi cc hm Windows s
c gi khi chng trnh cn dng n ch khng lin kt vo chng nh. thc hin
c cc li gi ny th mt chng nh Windows *.EXE lun cha mt tham chiu n th
vin lin kt ng khc m n cn dng. Khi , mt chng trnh Windows c np vo b
nh s to con tr tham chiu n nhng hm th vin DLL m chng nh dng, nu th
vin ny cha c np vo b nh trc th by gi s c np.
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
c gng pht huy cc sc mnh ti nguyn ca Windows s lm cho nhng ng dng cng
mnh m, a dng, thn thin, v d s dng.
1.3.3. M t s yu c u i vi n g i l p trnh
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.
c th lp trnh n nn Windows ngoi yu cu v vic s dng cng c lp
trnh, ngi hc cn cn phi c cn bn v Windows, ti thiu th cng dng qua mt s
ng dng trong Windows. Tht s yu cu ny khng qu kh khn i vi ngi hc v hin
ti hu nh Windows qu quen thuc vi mi ngi, nhng ngi m s dng my tnh.
Ngoi nhng yu cu n, i khi ngi lp trnh n 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 c h thng ip
Khng ging nh cc ng dng chy trn MS-DOS, cc ng dng Win32 th x l
theo cc s kin (event - driven), theo c ch ny cc ng dng khi c vit s lin tc ch
cho h iu hnh truyn cc d liu nhp vo. H thng s m nhim vic truyn tt c
cc d liu nhp ca ng dng vo cc ca s khc nhau ca ng dng . Mi mt ca s
s c ring mt hm gi l hm x l ca s thng c t tn l WndProc, h thng s
gi hm ny khi c bt c d liu nhp no c truyn n ca s, hm ny s x l cc d
liu nhp v tr quyn iu khin v cho h thng.
H thng truyn cc d liu nhp vo th tc x l ca ca s thng qua mt hinh
thc gi l thng ip (message). Thng ip ny c pht sinh t ng dng v h thng.
Trang 6
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
H thng s pht sinh mt thng ip khi c mt s kin nhp vo (input even), v d nh khi
ngi dng nhn mt phm, di chuyn thit b chut, hay kch vo cc iu khin (control)
nh thanh cun,... Ngoi ra h thng cng pht sinh ra thng ip phn 1ng li mt s
thay i ca h thng do mt ng dng mang n, iu ny xy ra khi ng dng lm cn
kit ti nguyn hay ng dng t thay i kch thc ca ca s.
Mt ng dng c th pht sinh ra thng ip khi cn yu cu cc ca s ca n thc
hin mt nhim v no hay dng thng tin gia cc ca s.
H thng gi thng ip vo th tc x l ca s vi bn tham s: nh danh ca ca
s, nh danh ca thng ip, v hai tham s cn li c gi l tham s ca thng ip
(message parameters). nh danh ca ca s xc nh ca s m thng ip c ch nh. H
thng s dng nh danh ny xc nh cn phi gi thng ip n th tc x l ca ca
s.
nh danh thng ip l mt hng s th hin mc ch ca thng ip. Khi th tc
x l ca s nhn thng ip th n s dng nh danh ny bit hnh thc cn thc hin.
V d, khi mt thng ip c truyn n th tc ca s c nh danh l WM_PAINT th
c ngha rng ca s vng lm vic thay i v cn phi v li vng ny.
Tham s thng ip lu gi hay v ca d liu, c dng bi th tc ca s khi
x l thng ip. Tham s ny ph thuc vo loi thng ip c truyn n, n c th l
s nguyn, mt tp cc bit dng lm c hiu, hay mt con n mt cu trc d liu no
,...
Khi mt thng ip khng cn dng n tham s th h thng s thit lp cc tham s
ny c gi tr NULL. Mt th tc ca s phi kim tra xem vi loi thng ip no cn dng
tham s quyt nh rch s dng rc tham s ny.
C hai loi thng ip :
Thng ip c nh ngha bi h thng (system-defined messages):
Dng thng ip ny c h thng nh ngha cho cc ca s, cc iu khin, v cc
ti nguyn khc ong h thng. Thng c bt u vi cc tin t sau : WM_XXX,
LB xxx, CB xxx,...
Thng ip c nh ngha bi ng dng (application-defined message) :
Mt ng dng c th to ring cc thng ip s dng bi nhhg ca s ca n
hay truyn thng tin gia cc ca s trong ng dng.
Nu mt ng dng nh ngha cc thng ip ring th th tc ca s nhn c
thng ip ny phi cung cp cc hm x l tng ng.
i vi thng ip h thng, th c cung cp gi tr nh danh t 0x0000 n
0x03FF, nhng ng dng khng c nh ngha thng ip c gi trong khong ny.
Trang 7
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Thng ip c ng dng nh ngha c gi tr nh danh t 0x0400 n 0x7FFF.
L trnh ca thng ip t lc gi i n lc x l c hai dng sau:
Thng ip c gi vo hng i thng ip ch x l (queue message): bao gm
cc kiu thng ip c pht sinh t bn phm, chut nh thng ip :
WM_MOUSEMOVE, WM_LBUTTONDOWN, WMJKEYDOWN, v WM CHAR.
Thng ip c gi trc tip n th tc x l khng qua hng i (nonqueue
message), bao gm cc thng ip thi gian, thng ip v, v thng ip thot nh
WM_TIMER, WMJPAINT, va WMLQUIT.
x l thng ip : Mt ng dng phi xa v x l nhng thng ip c gi ti
hng i ca ng dng . i vi mt ng dng n tiu tn h th s dng mt vng lp
thng ip (message Innp) trong hm WinMain nhn thng ip t hng i v gi ti th
tc x l ca s tng ng. v i nhng ng dng nhiu tiu trnh th mi mt tiu trnh c
to ca s th s c mt vng lp thng ip x l thng ip ca nhng ca s trong
tiu trnh .
Trang 8
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
> Nt bm (button): gm c Push Button dng kch hot mt thao tc, Check
Box dng chn mt ong 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): dmg cha cc ghi ch trong hp thoi, ngoi ra ni dung
c th thay i trong qu trinh s dng hp thoi.
> H p li t 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).
> nhp vn b n (edit text): Dng nhp vn bn, nu c nhiu dng th
thng km theo thanh cun.
> 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...
> Thc n (menu): l mt danh sch cha cc thao tc vi mt nh danh m
ngi dng c th chn. Hu ht cc ng dng c ca s th khng th thiu thc n.
> Thanh cng c (toolbar): y l mt dng menu nhng ch cha cc thao tc
cn thit di dng cc biu tng c trng.
Ngoi ra cn rt nhiu cc iu khin m cc cng c lp nh cung cp cho ngi
lp trnh hay t h to ra da n nhng thnh phn c cung cp sn.
1.4.1.3. ng dng in hnh trn Windows
1.4.1.4. Cc kiu tp tn xy dng m t ng dng trn Windows
Chng trnh ngun
Tng t nh cc chng trnh c chun, bao gm cc tp tin tiu (header) cha
trong tp tn *.h, *.hpp. Cn m ngun (source code) cha trong tp tin *.c hay *.cpp.
Tp tin nh ngha
Tp tn ny c phn m rng l *.def, dng nh ngha cc iu khin do chng trnh
to ra khi vit ng dng to DLL, ngoi ra cn dng khai bo vng nh heap khi chy
chng trnh. Lc trc do vn tng thch vi Windows 3.1 nn tp tin ny thng c
dng, cn ngy nay chng t c dng n.
Cc file cha ti nguyn ca ng dng
Cc file *.ico l cc biu tng (icon) c dng trong chng trnh. Thng
thng cc cng c lp nh n 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 n a vi dng file *.cur.
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
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 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 n kin trc 32-bit.
Mt vi kiu d liu mi c tn vit tt rt d hiu nh UINT l mt d liu thng
c dng m n gin l kiu unsigned int, trong Windows 9x kiu ny c kch thc l 32bit. i vi kiu chui th c kiu PSTR kiu ny l mt con tr n mt chui tng t
nh char*.
Tuy nhin, cng c mt s kiu c khi bo tn thiu r rng nh WPARAM v
LPARAM. Tn ny c t v c ngun ngc lch s su xa. Khi cn h iu hnh Windows
16-bit th tham s th 3 ca hm WndProc c khai bo l kiu WORD, vi kch thc 16b it, cn tham s th 4 c kiu LONG l 32-bit. y l l do ngi ta thm tin t "W", "L"
vo t "PARAM". Tuy nhin, ong phin bn Windows 32-bit, th WPARAM c nh
ngha nh l UINT v LPARAM th c nh ngha nh mt kiu LONG, do c hai tham
s ny u c gi l 32-bit. iu ny l mt s nhm ln v WORD vn l gi tr 16-bit
trong Window 98.
Trong th tc x l ca s WndProc gi tr tr v l kiu LRESULT. Kiu ny n
gin c nh ngha nh l kiu LONG.
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 nhuhg nht thit tt c phi
c cng kch thc vi HANDLE.
Bng sau m t mt s kiu d liu mi:
Kiu
ngha
HANDLE
HWND
BYTE
WORD
DWORD
UINT
LONG
long 32-bit.
BOOL
Bool.
LPSTR
Con tr chui.
Trang 10
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
LPCSTR
WPARAM
32-bit.
LPARAM
32-bit.
BSTR
Gi tr 32-bit tr n k t.
LPVOID
LPTSTR
LPCTSTR
nh ngha lp ca s ng dng.
ng k lp ca s va nh ngha.
To ra th hin ca s ca lp cho.
Hin th ca s.
Khi ng chu nh x l thng ip.
1.4.3. Hm W inMain
Hm chnh ca mt ng dng chy trn Windows l hm WinMain, c khai bo
nh sau:
int WINAPI WinMain(HINSTANCE hlnstance, HINSTANCE hPrevInstance, PSTR
szCmdLine, int iCmdShow);
Chng ta s tm hiu mt hm WinMain mu sau y.
Trang 11
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
int WINAPI WinMain(HINSTANCE hlnstance, HINSTANCE hPrevInstance, PSTR
szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("HelloWin"); // tn ng dng
HWND hwnd;
MSG msg;
WNDCLASS wndclass; // bin nh ngha mt ca s
/* nh ngha kiu ca s */
wndclass.style = SC_HREDRAW I CS_VREDRAW;
wndclass.lpfnWndProc = WndProc; //Hm th tc ca s
wndclass.cbClsExtra = 0;
wndclass.cbWndExa = 0;
wndclass.hlnstance = hlnstance; //nh danh ng dng
wndclass.hlcon = Loadlcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCusor (NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL; //Khng c menu
wndclass.lpszClassName = szAppName; // tn ng dng
/* ng k lp ca s */
if (!RegisterClass(&wndclass)) return 0;
/* To lp ca s */
hwnd = Create Window (szAppName, // Tn ca s
"Hello Program", // Tiu
WS_OVERLAPPEDWINDOW, //K iu ca s
Trang 12
NGN NG LP TRNH
WINDOWS
CW_USEDEFAULT, // Ta X
LP TRNH c TRN
CW_USEDEFAULT, // Ta y
CW_USEDEFAULT, //C hiu rng
CW_USEDEFAULT, //C hiu di
NULL, //C a S cha
NULL, //Khng c menu
hlnstacne, //nh danh ng dng
NULL); // Tham s b sung
/* Hin th ca s */
ShowWindow (hwnd, iCmdShow);
UpdateWindow (hwnd);
/* Chu trnh x l cc thng ip*/
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
nh ngha m t lp ca s :
u tin ca vic xy dng mt ng dng Windows l phi nh ngha mt lp ca s
cho ng dng. Windows cung cp mt cu trc WNDCLASS gi l lp ca s, lp ny cha
nhng thuc tnh to thnh mt ca s.
typedef struct _WNDCLASS
{
Trang 13
NGN NG LP TRNH
WINDOWS
UINT style;
LP TRNH
c TRN
WNDPROC lpfnWndProc;
int cbClsExtra;
HINSTANCE hlnstance;
HICON hlcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCSTR IpszMenuName;
LPCSTR IpszClassName;
} WNDCLASS, *PWNDCLASS;
ngha thuc tnh ca cu trc WNDCLASS c m t trong bng sau :
Thuc tnh
ngha
ghi ch
style
Kiu lp
ipfnWndProc
Con tr n th tc window
cbClsExa
Mc nh
cbWndExtra
Mc nh
hlnstance
nh danh cha th tc ca s
ca lp window
hlcon
Dng hm Loadlcon
hCursor
Dng hm LoadCursor
hbrBackground
nh danh ca chi t nn
Dng hm GetStockObject
IpszMenuName
Tn thc n
Tn thc n gn vi ca s, thc
dn ny c khai bo trong tp tin
ti nguyn.
Trang 14
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
IpszClassName
Tn lp
Bng 1.2 M t thuc tnh ca lp ca s
ng k lp ca s :
Sau khi nh ngha mt lp ca s, phi ng k lp ca s bng hm
Register Class :
ATOM RegisterClass( CONST WNDCLASS * lpWndClass );
To ca s :
.p ca s nh ngha nhng r tnh rhnng ca ra s, rhn php to ra nhiu ra s
da trn mt lp. Khi to ra mt ca s ca hm CreateWindow, ta ch nh cc c tnh
ring ca ca s ny, v phn bit n vi cc ca s khc to ra cng mt lp.
Khai bo hm to ca s :
HWND CreateWindow(
LPCSTR lpClassName, // Tn lp ca s ng k
LPCSTR lpwindowName, //Tn ca ca s
DWORD dwStyle, //K iu ca ca s
int X, / / V tr ngang ban u
int y, // V tr dc ban u
int nWidth, // rng ban u
int nHeight, // cao ban u
HWND hVVndParent, //nh danh ca ca s cha
MENU hMenu, //nh dang ca thc n
INSTANCE hlnstance, // nh danh th hin ng dng
PVOID lpParam // Cc tham s ban u
);
Hin th ca s :
Trang 15
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Sau khi gi hm CreateWindow, mt ca s c to ra bn trong Windows, iu ny
c ngha l Windows cp pht mt vng nh lu gi tt c cc thng tin v ca s
c ch nh trong hm CreateWindow. Nhng thng s ny s c Windows tm li khi
cn thit da vo nh danh m hm to ca s tr v. Tuy nhin, lc ny ca s cha xut
hin trn mn hnh Windows, xut hin cn phi gi hm ShowWindow.
Hm ShowWindow c khai bo nh sau:
BOOL ShowWindow(
HWND hWnd, //nh danh ca ca s cn th hin
int nCmdShow // Trng thi hin th
);
Mt s trng thi ca tham s nCmdShow:
SW_HIDE : n ca s.
SW_MAXIMIZE : Phng ca s ra ton b mn hnh.
SW_MINIMIZE : thu nh thnh biu tng trn mn hnh.
SW_RESTORE : Hin th di dng chun.
1.4.4. Hm x l ca s WndProc
Mt chng trnh Windows c th cha nhiu hn mt hm x l ca s. Mt hm
x l ca s lun kt hp vi mt lp ca s c th. Hm x l ca s thng c t tn
VVndProc.
Hm WndProc c chc nng giao tip vi bn ngoi, tc l vi Windows, ton b cc
thng ip gi n ca s iu c x l qua hm ny.
Hm ny thng c khai bo nh sau :
LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM );
Trong tham s u tin l nh danh ca ca s, tham s th 2 l nh danh thng
ip, v cui cng l 2 tham s WPARAM v LPARAM b sung thng tin km theo thng
ip.
Chng ta s tm hiu mt hm x l ca s WndProc sau:
Trang 16
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
/*ca s b ng*/
PostQuitMessage (0);
return 0;
Trang 17
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
}
return DefWindowProc ( hwnd, msg, wParam, IParam);
}
1.4.5. x l thng ip
Sau khi ca s c hin th trn mn hnh, th chng trnh phi c cc thng n
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 tn 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.
Mt ng dng nhn cc thng ip t hng i thng ip bng cch thc thi mt
on m sau:
while ( GetMessage(&msg, NULL, 0 ,0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
Trong msg l mt bin cu trc kiu MSG c nh ngha trong tp tin tiu
WINUSER.H.
typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM IParam;
DWORD me;
Trang 18
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
POINT pt;
} MSG, *PMSG;
Kiu d liu POINT i mt kiu cu trc khc, c nh ngha trong tp tin tiu
WINDEF.H, v c m t :
typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT, *PPOINT;
ngha ca cc trng trong cu trc MSG
S hwnd : nh danh ca ca s m thng ip pht sinh.
S message : nh danh ca thng ip, v d nh thng ip pht sinh khi bm
nt chut tri l WMJLBUTTONDOWN c gi tr 0x0201.
'S wParam : Tham s 32-bit cha cc thng tin ph thuc vo tng thng ip c
th.
s lParam : Tham s 32-bit ph thuc vo thng ip.
s time : Thi gian t thng ip trong hng i.
s pt : Ta ca chut khi t thng ip vo hng i
Hm GetMessage s tr v 0 nu msg cha thng ip c nh danh WM_QUIT
(0x0012), khi vng lp thng ip nghg v ng dng kt thc. Ngc li th hm s tr
v mt gi tr khc 0 vi cc thng ip khc.
Khai bo lp ca s.
ng k lp ca s va khai bo.
To v hin th lp ca s trn.
Vng lp nhn thng ip.
Trang 19
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
WndProc : Hm x l thng ip gi n ca s.
/* HELLO WORLD.c */
#include <windows.h>
LRESULT CALLBACK WndProc ( IIWND. UINT, WPARAM, LPARAM );
int WINAPI WinMain (HINSTANCE hlnstance, HINSTANCE hPrevInstance, PSTR
szCmdLine, int iCmdShow)
{
static TCHAR szAppName [] = TEXT ("HelloWorld");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtta = 0;
wndclass.cbWndExtra = 0;
wndclass.hlnstance = hlnstance;
wndclass.hlcon = Loadicon ( NULL, IDI_APPLICATION );
wndclass.hCursor = LoadCursor ( NULL, IDC_ARROW );
wndclass.hbrBackground =
( HBRUSH ) GetStockObject ( WHITE_BRUSH );
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if ( RegisterClass ( &wndclass))
{
MessageBox(NULL, TEXT (" The program requires Windows"), szAppName,
MBJCONERROR);
Trang 20
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
return 0;
}
hwnd = CreateWindow ( szAppName, // Tn lp ca s
TEXT (" The Hello World Program"), // Tiu ca s
WS_OVERLAPPEDWINDOW, //Kiu ca s
CW JJSEDEFAULT, // Ta X
CWJJSEDEFAULT, // Ta y
CWJJSEDEFAULT, // Chiu ngang
CWJJSEDEFAULT, // Chiu dc
NULL, // ca s cha
NULL, //Thc n
hlnstance, //nh danh
NULL ); // Tham s
ShowWindow ( hwnd, iCmdShow);
UpdateWindow ( hwnd);
while ( GetMessage ( &msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (& m sg) ;
}
return msg.wParam;
} //End WinMain
LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam,
LPARAM IParam)
{
HDC hdc;
Trang 21
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
PAINTSTRUCT ps;
RECT rect;
switch ( msg)
{
case WM_CREATE:
return 0;
case WM_PAINT:
hdc = BeginPaint ( hwnd, &ps);
GetClientRect ( hwnd, &rect);
DrawText( hdc, TEXTfHello World"), -1, &rect,
DT_SINGLELINE I DT_CENTER I DT_VCENTER );
EndPaint ( hwnd, &ps);
return 0;
case WMJDESTROY:
PostQuitMessage (0);
return 0;
} //End switch
return DefWindowProc ( hwnd, msg, wParam, IParam);
}
ngha
Loadlcon
LoadCursor
Trang 22
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
GetStockObject
RegisterClass
ng k mt lp ca s cho ca s ng dng
trong chng trnh.
MessageBox
CreateWindow
To mt ca s da trn mt lp ca s.
ShowWindow
Hin th ca s ln mn hnh.
UpdateWindow
Yu cu ca s v li chnh bn thn n.
GetM esssage
T ranslateMessage
DispatchMessage
Gi thng ip n hm x l ca s.
BegnPaint
GetCIientRect
DrawText
EndPaint
Kt thc vic v ca s.
PostQuitMessage
DefWindowProc
1.4.7. M t s qui c t tn b i n
Khi vit mt chng trnh tig 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 rl 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 hlnstance v hPrevInstance, trong h vit
tt cho kiu handle, kiu d liu nguyn thng c khai bo dng tin t l ch i.
Trang 23
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
C php Hungary ny gip cho ngi lp trnh rt nhiu trong khu kim a 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.
Bng m t mt s tin t khi t tn bin ca cc kiu d liu :
Tin t
Kiu d liu
by
BYTE
short
illt
bin lu ta
X,
BOOL
WORD
long
dw
DWORD
string
sz
chui kt thc bi k t 0
handle
pointer
Lpsz
Trang 24
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
Chng 2
HP THOI V THANH TRNH N
2.1. M U
Hp thoi (dialog) v thanh nh 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 tn 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.
2.2. H P 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
tn 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.
Tng t nh cc thng ip gi n th tc WndProc ca ca s chnh.Windows s
gi cc thng ip x l hp thoi n th tc x l hp thoi DlgProc. Hai th tc
VVndProc v th tc DlgProc tuy cch lm vic ging nhau nhng gia chng c nhng im
khc bit cn lu . Bn trong th tc x l hp thoi bn cn khi to cc phn t iu
khin bn trong hp thoi bng thng ip WM_INITDIALOG, cui cng l ng hp thoi,
Trang 25
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
cn th tc x l WndProc th khng c. C ba loi hp thoi c bn. Hp thoi trng thi
(modal), hp thoi khng trng thi (modeless) v hp thoi thng dng (common dialog) m
chng ta s cp c th trong cc phn di.
2.2.1. H p th o i tr n g thi
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.
2.2.1.1. Cch to hp thoi n gin
Sau y l chng trnh to ra mt hp thoi n gin. Hp thoi c to ra c ni
dung nh sau.
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.
-J D J x j
. D idloj3_l
Dialog
HELLO WORLD
OK
{
static HINSTANCE hlnstance;
Trang 26
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
switch (message)
{
case WM_CREATE:
hlnstance = ((LPCREATESTRUCT) lParam)->hInstance ;
return 0 ;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDC_SHOW:
DialogBox (Mnstance, TEXT ("DIALOG1"),
hwnd, DialogProc);
break;
>
return 0 ;
case WM_DESTROY:
PostQuitMessage (0);
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, IParam);
}
/*------------------- hm
x l thng ip hp thoi---------------------------*/
BOOL CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM IParam)
{
switch (message)
{
case WM_INli DIALOG:
Trang 27
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
return TRUE;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDOK:
EndDialog (hDlg, 0 );
return TRUE;
}
b reak;
}
return FALSE;
>
DIALOG1.RC (trch dn)
/* ----------------------------------------------------------- dialog------------------------------------
Trang 28
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
BEGIN
MENUITEM "&Show", IDC_SHOW
END
END
R e s o u rc e Irtc lu d e s...
[+ ,D= R e s o u rc e S y m bols...
S a v e v i d u l_ l .r c
Checkout...
I
Im p o rt..
Docking View
Hide
ofj* P ro p e rtie s
3 ClassV iew ) m
R e so u rc e ...
=1 FileView~[
*J
Dialog Properties
-W
Geneial
ICaption:
Caption:
ID: fi M m i r i U i
Font name: MS Sans Serif
Font size:
Font...
Menu:
I
I------------------
9
I X Pos:
Trang 29
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Trong ca s Properties ny chn tab Styles, b mc chn Title Bar v khng cn to
tiu cho ca s. Sau ng ca s Properties ca hp thoi li.
By gi bt u thit k din mo cho hp thoi. Xa nt Cancel v khng cn n
nt ny. thm mt biu tng vo hp thoi ta nhn nt Picture ln thanh cng c v kch
chut vo hp thoi ri ko khung ch nht theo kch thc mong mun. y l ni m biu
tng c hin th. Nhn chut phi vo khung ch nht va to, chn Properties t tn h
n xut hin v nguyn nh danh ca biu tng l IDC_STATIC. nh danh ny s
c Windowns t khai bo trong file Resource.h vi gi tr -1. Gi tr -1 l gi tr ca tt c
cc nh danh m chng trnh khng cn tham chiu n. Tip n l chn i tng Icon
trong trong mc Type, ri g nh danh ca Icon cn thm vo trong mc Image. Nu to
ra biu tng Icon c th ch vic chn Icon t danh sch cc Icon trong mc Image.
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 :
DIALOG1 DIALOG DISCARDABLE 40, 20, 164, 90
STYLE DS_MODALFRAME I WS_POPUP
FONT 9, "MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK",IDOK,54,65,50,14
CTEXT "HELLO WORLD ",IDC_STATIC,53,38,72,10
ICON IDI_ICON1,IDC_STATIC,68,9,21,20
END
Dng u tin l tn ca hp thoi "DIALOG1" k tip l t kha DIALOG,
DISCARDABLE v tip sau l 4 s nguyn. Hai s nguyn u tin ch v tr dng, ct ca
hp thoi s c hin th trn ca s chnh. Hai s nguyn tip theo xc nh kch thc ca
hp thoi theo th t ct v dng.
Lu : Cc thng s nh ta v kch thc ca hp thoi khng tnh theo n v
Pixel m tnh theo kch c ca Font ch. s o ca ta X v chiu rng da trn 1/4 n v
rng trung bnh ca Font ch. s o ca ta y v chiu cao da trn 1/8 n v cao trung
bnh ca Font ch.
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 WSJPOPUP v DS_MODALFRAME ngoi ra
Trang 30
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
cn c cc hng WS_CAPTION, WS_MAXIMIZEBOX, WS_MINIMIZEBOX,
w s POPUP, WSJVSCROLL, w s HSCROLL, WS_SYSMENU..... Lnh BEGIN v lnh
END c th c thay bng { v }. Trong vi 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.
Control-type "text", id , xPos, yPos, xWidth, yHeight, iStyle.
Control-type l cc t kha khai bo kiu iu khin nh DEFPUSHBUTTON,
ICON, CTEXT, .... id l nh danh ca cc iu khin, thng thng mt iu khin c mt
nh danh ring c gi cng vi thng ip WM_COMMAND n cc th tc x l thng
ip ca ca s cha. xPos, yPos l v tr ct, dng him th ca iu khin trn ca s cha.
xWidth, yHeight l chiu rng v chiu cao ca iu khin . i s cui cng l iStyle,
i s ny ty chn dng nh ngha thm cc kiu ca s m iu khin cn th hin
chng thng l cc hng w s _ c khai bo trong tp tin .h" ca Windows.
2.2.1.3. Th tc x l thng ip ca hp thoi
Th tc x l thng ip ca hp thoi dng x l tt c cc thng ip t b
qun l hp thoi ca Windows gi n hp thoi. Th tc ny c Windows gi khi c s
tc ng ln cc phn t iu khin nm trong hp thoi.
Xt th tc x l hp thoi DialogProc trong v d 2.1. Th tc ny c 4 tham s nh
th tc WndProc, v th tc ny c nh ngha kiu tr v l CALLBACK.Tuy hai th
tc ny tng t ging nhau nhng thc s gia chng c mt vi s khc bit ng ch .
Th tc DialogProc tr v gi tr kiu BOOL, trong khi th tc WindProc th
tr v gi tr LRESULT.
Th tc DialogProc tr v gi tr TRUE (gi tr khc 0) nu n x l thng
ip v ngc li nu khng x l cc thng ip th thu tc tr v gi th l FALSE (tr 0).
Cn th tc WindProc th gi hm DefWindowProc vi cc thng ip khng cn x l.
Th tc DialogProc khng cn x l thng ip WM_DESTROY, cng khng
cn x l thng ip WM_PAINT v cng khng nhn c thng ip WM_CREATE m
l thng ip W M JN ITD IALO G dng e khi to hp thoi.
Ngoi x l thng ip WM_INITDIALOG, th tc x l thng ip hp thoi ch
x l mt thng ip duy nht khc l WM_COMMAND. y cng l thng ip c gi
n ca s cha khi ta kch hot (nt nhn ang nhn c focus) ln cc thnh phn iu
khin. Ch danh ID ca nt OK" l IDOK s c cha trong word thp ca i s
wParam. Khi nt ny c nhn, th tc DialogProc gi hm EndDialog kt thc x l
v ng hp thoi.
Cc thng ip gi n hp thoi khng i qua hng i m n c Windows gi
c tip hm DialogProc truyn cc thng ip vo cho th tc x l hp thoi.V vy,
khng phi bn tm v hiu ng ca cc phn tt c quy nh trong chng trnh chnh.
2.2.1.4. Gi hin th hp thoi v cc vn lin quan
Trang 31
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Trong th tc W ndProc khi x l thng ip WM_CREATE Windows ly v nh
danh hlnstance ca chng trnh v lui n trong bin nh hlnstance nh sau.
hlnstance = ((LPCREATESTRUCT) lParam)->hInstance;
Diaogl kim tra thng ip WM_COMMAND xem word thp ca i s wParam c
bng gi tr IDC_SHOW (ch danh ca thnh phn Show trong thc n). Nu phi, tc
chn mc Show n trnh n ca ca s chnh v yu cu hin th hp thoi, lc ny
chng trnh gi hin th hp thoi bng cch gi hm.
DialogBox (hlnstance, TEXT ("DIALOG1"), hwnd, DialogProc)
i s u tin ca hm ny phi l hlnstance ca chng trnh gi, i s th hai l
tn ca hp thoi cn hin th, i s th 3 l ca s cha m hp thoi thuc v, cui cng l
a rh ra th rr x l cc thng ip ra hp thoi.
Chng trnh khng th tr iu khin v hm WndProc cho n khi hp thoi c
ng li. Gi tr tr v ca hm DialogBox l gi tr ca i s th hai trong hm EndDialog
nm bn trong th tc x l thng ip hp thoi. Tuy nhin chng ta cng c th gi thng
ip n hm WndProc yu cu x l ngay c khi hp thoi ang m nh hm SendMessage
nh sau :
SendMessage(GetParent(hDlg), message, wParam, lParam)
Tuy Visual c++ Developer cung cp cho chng ta b son tho hp thoi c 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.
Thm hng WS_THINKFRAME vo mc STYLE co gin hp thoi (tng
ng vi trong boder ta chn mc Resizing).
t ni dung tiu cho hp thoi ta ch vic thm hng WS_CAPTION trong
STYLE.
STYLE DS_MODALFRAME I WS_POPUP I WS_CAPTION
CAPTION "Hello Dialogl"
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"));
Trang 32
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Khi hp thoi c tiu ri, c th thm cc chc nng phng to v thu nh hp thoi
bng hng w s_ MINIMIZEBOX, w s MAXIMIZEBOX.
C th thm trnh n vo hp thoi nu mun bng on lnh.
DIALOGl DIALOG DISCARDABLE 40, 20,164, 90
STYLE DS_MODALFRAME I WS_POPUP I WS_CAPTION
CAPTION "Hello Dialogl"
MENU MENU1
Dialog Properties
1?
General
I Caption:
Font name:
MS Sans Serif
Font size:
..
Menu:
YPos: [20
I hung dau
1=
B nam
----------------------------- 1
Lp ca s
Kiu ca s
PUSHBUTTON
Button
BS_BUSHBUTTON
DEFPUSHBUTTON
Button
CHECKBOX
Button
BS_CHECKBOX 1WS_TABSTOP
RADIOBUTTON
Button
BSJRADIOBUTTON 1WS_TABSTOP
GROUPBOX
Button
BS_GROUPBOX 1WS_TABSTOP
Trang 33
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
LTEXT
Static
SS_LEFT 1WS_GROUP
CTEXT
Static
SS_CENTER 1WS_GROUP
RTEXT
Static
SS_RIGHT 1WS_GROUP
ICON
Static
SSJCON
EDITTEXT
Edit
SCROLLBAR
Scrollbar
SBS_HORZ
LISTBOX
Listbox
COMBOBOX
Combobox
CBS_SIMPLE 1WS_TABSTOP
Bng 2.1 Cc kiu iu khin
Trang 34
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
minh ha cho vic trao i thng ip gia cc thnh phn iu khin bn trong
hp thoi (ng vai 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.
c a s hp thoi gm c ba nhm nt chn radio.Nhm th nht dng chn i
tng v l hnh ch nht hay hnh ellipse, nhm th hai dng chn mu t cho hnh v,
nhm th 3 dng chn kiu t cho hnh v. Khi thay i vic chn mu t, kiu t th mu
t v kiu t ca hnh v cnh bn s thay i theo mu t, v kiu t va mi chn. Khi
nhn nt OK th hp thoi ng li v mu t, kiu t cng hnh v va mi v s c hin
th ln ca s chnh. Nu nhn nt Cancel hoc nhn phm Esc th hp thoi c ng li
nhng hnh v, mu t v kiu t khng c hin th ln ca s chnh. Trong v d ny nt
OK v nt Cancel c ch danh ID ln lt l IDOK v IDCANCEL.Thng thng t ch
danh cho cc phn t iu khin nm ong hp thoi c bt u bng ch ID. Biu
tng chic xe p trn hp thoi l mt icon. Trn thanh tiu ca ca s chnh c mt
biu tng, biu tng cng l mt icon ( l mt ly tr). Khi t cc nt radio vo hp
thoi bng cng c Developer studio nh phi t cc nt theo th t nh hnh 2-5. Th khi
Windows mi pht sinh m cho cc nt theo th t tng dn, iu ny gip chng ta d
dng kim sot cc thao tc trn tp cc nt radio. Bn nh b lun mc chn Auto trong
phn thit lp Properties ca cc nt chn radio. Bi v cc nt radio mang thuc tnh Auto
yu cu vit t m lnh hn ngng chng thng kh hiu so vi cc nt khng c thuc tnh
Auto. Chn thuc nh Group, Tab stop trong phn thit k Properties ca nt OK, nt
Cancel, v hai nt radio u tin trong ba nhm radio c th chuyn focus (chn) bng
phm Tab trn bn phm.
JOJ*]
Biush
H5 _b L>IA b U N A L
HS.CROSS
H S _ D IA G C R O S S
HS_FDlAGONAL
HS_HORIZONTAL
HS_VERTICAL
OK
Trang 35
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
BOOL CALLBACK DialogProc (HWND, UINT, WPARAM, LPARAM);
in t iCurrentColor = IDC_BLACK, iCurrentFigure = IDC_RECT;
in t iCurrenBrush = IDC_HS_BDIAGONAL;
RECT rect;
hdc = GetDC (hwnd);
GetClientRect (hwnd, &rect);
if(iBrush==IDC_HS_BDIAGONAL)
hbrush=CreateHatchBrush(HS_BDIAGONAL,
crColor[iColor-IDC_BLACK]);
if(iBrush == IDC_HS_CROSS)
hbrush=CreateHatchBrush(HS_CROSS,
crColor[iColor - IDCJBLACK]);
if(iBrush == IDC_HS_DIAGCROSS)
hbrush=CreateHatchBrush(HS_DIAGCROSS,
crColor[iColor - IDCJBLACK]);
if(iBrash == IDC_HS_FDIAGONAL)
hbrush=CreateHatchBrush(HS_FDIAGONAL,
crColor[iColor - IDCJ3LACK]);
if(iBrash == IDC_HS_HORIZONTAL)
hbrush=CreateHatchBrush(HS_HORIZONTAL,
Trang 36
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
crColor[iColor - IDCJBLACK]);
if(iBrush == IDC_HS_VERTICAL)
hbrush=CreateHatchBrush(HS_BDIAGONAL,
crColor[iColor - IDCJBLACK]);
hBrush = (HBRUSH) SelectObject (hdc, hbrush);
if (iFigure == IDC_RECT)
Rectangle (hdc, rect.left, rect.top, rect.right, rect.bottom);
else
}
void PaintTheBlock(HWND hCl, int iColor, int iFigure, int iBrush)
{
InvalidateRect (hCtrl, NULL, TRUE);
U pdateW indow (hC trl);
{
static HINSTANCE hlnstance;
PAINTSTRUCT p s ;
switch (message)
{
case WM_CREATE:
Trang 37
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
hlnstance = ((LPCREATESTRUCT) lParam)->hInstance ;
return 0 ;
case WM_COMMAND:
switch (LOW ORD (wParam))
{
case IDC_SHOW:
return 0 ;
case WM_DESTROY:
PostQ uitM essage ( 0 ) ;
re tu rn 0 ;
}
re tu rn D efW indowProc (hwnd, message, wParam, IParam );
}
BOOL CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM wParam,
LPARAM IParam)
{
static HW ND hCtrlBlock;
Trang 38
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
static in t iColor, iFigure,iBrush;
switch (message)
{
case W M JN IT D IALOG :
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);
{
case IDOK:
iCurrentColor = iColor ;
iCurrentFigure = iFigure ;
iCurrenBrush = iBrush;
EndDialog (liDlg, TRUE) ;
return TRUE ;
case IDCANCEL:
Trang 39
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
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:
case IDC_ELLIPSE:
Trang 40
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
PaintTheB lock (hCtrlBlock, iColor, iFigure,iBrush);
re tu rn T R U E ;
}
break;
case WM_PAINT:
PaintTheBlock (hCtrlBlock, iColor, iFigure,iBrash);
break;
}
re tu rn FALSE ;
}
2.2.1.6. Lm vic vi cc thnh phn iu khin trong hp thoi
Cc thnh phn iu khin con u gi thng ip WM_COMMAND n ca s cha
ca n v ca s cha c th thay i trng thi ca cc thnh phn iu khin con nh kch
hot, nh du (check), b du check (uncheck) bng cch gi cc thng ip n cc thnh
phn iu khin con nm trong n. Tuy nhin trong Windows cung cp c ch trao i
thng ip gia cc thnh phn iu khin con vi ca s cha. Chng ta bt u tm hiu cc
c ch trao i thng ip .
Trong v d 2.2 mu template ca hp thoi Dialog2 c th hin trong tp tin ti
nguyn DIALOG2.RC gm c cc thnh phn. Thnh phn GROUPBOX c tiu do chng
ta g vo, thnh phn ny ch n gin l mt khung vin bao quanh hai nhm nt chn radio,
v hai nhm ny hon ton c lp vi nhau trong mi nhm.
Khi mt trong nhng nt radio c kch hot th ca s iu khin con gi thng
ip WM_COMMAND n ca s cha ( y l hp thoi) vi word thp ca i s
wParam cha thnh phn ID ca iu khin con, word cao ca i s wParam cho bit m
thng bo. Sau cng l i s lParam mang handle ca ca s iu khin con. M thng bo
ca nt chn radio lun lun l BN_CLICKED (mang gi tr 0). Windows s chuyn thng
ip WM_COMMAND cng vi cc i s wParam v IParam n th tc x l thng ip
ca hp thoi (DialogProc). Khi hp thoi nhn c thng ip WM_COMMAND cng
vi cc i s lParam v wParam, hp thoi kim tra nng thi ca t t c cc thnh phn
iu khin con nm trong n v thit lp cc trng thi cho cc thnh phn iu khin con
ny.
C th nh du mt nt chn bng cch gi thng ip
S en d M essag e (hw ndC trl ,M B _SETC H EC K , 1, 0);
Trang 41
NGN NG LP TRNH
LP TRNH
WINDOWS
V ngc li mun b chn mt nt no th dng hm.
c TRN
{
case IDCJBLACK:
case IDC_RED:
case IDC_GREEN:
case IDC_YELLOW:
case IDC BLUE:
case IDC_MAGENTA:
case IDC_CYAN:
case IDCJWHITE:
Trang 42
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
iColor = LOWORD (wParam) ;
for( i = IDC_BLACK, i < IDC_WHITE,i++)
}
Trong iColor dng lu gi 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 GetDlgltem dng
ly handle ca nt c chn v lu vo bin i. Hm SendMessage dng gi thng ip
MB_SETCHECK ti cc nit 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.
Ch .Trong cc v d trn thng dng hai nt OK v nt Cancel, hai nt ny c
Windows t nh danh mc nh theo th t l IDOK v IDCANCEL. Thng thng ng
hp thoi bng cch nhn chut vo mt trong hai nt OK hoc Cancel. Trong Windows, khi
nhn nt Enter th Windows lun pht sinh thng ip WM_COMMAND, bt k i tng
no ang nhn focus. LOWORD ca i s wParam mang gi tr ID ca nt nhn mc nh
(nt OK), ngoi tr c mt nt ang nhn focus (trong trng hp ny th LOWORD ca i
s wParam mang ch danh ca nt ang nhn focus). Nu nhn nt Esc hay nhn Ctrl+Break,
th Windows gi thng ip WM_COMMAND vi thnh phn LOWORD ca i s
wParam c gi IDCANCEL (nh danh mc nh ca nt Cancel). Do khng cn phi
x l thm cc phm g ng hp thoi.
Trong v d 2.2 x l hai trng hp khi nhn nt Cancel v nt OK ta dng on
chng trnh sau.
switch (LOWORD (wParam))
{
case IDOK:
iCurrentColor = iColor ;
iCurrentFigure = iFigure ;
EndODialog (hDlg, TRUE) ;
return TRUE ;
case IDCANCEL:
EndDialog (hDlg, FALSE) ;
return TRUE ;
Trang 43
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
>
{
case IDC_SHOW:
if(DialogBox(hInstance, TEXT("DIALOG"), hwnd, DialogProc))
InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ;
}
break;
NGN NG LP TRNH
WINDOWS
LTEXT "",IDC_PAINT, 5, 22, 92, 93
LP TRNH c TRN
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.
PaintTheBlock(hCtrBlock, iColor, iFigure);
Trong hCtrBlock l handle ca thnh phn iu khin c nh danh l IDC_PAINT.
Handle ca thnh phn iu khin ny c ly v bi hm.
hCtrBlock=GetDlgItem(hDlg, IDC_PAINT);
Ni dung ca hm PaintTheBlock nh sau.
void PaintTheBlock(HWND hCtrl, int iColor, int iFigure)
{
InvalidateRect(hCtrl, NULL, TRUE);
UpdateWinDow(hCtrl);
PaintWinDow(hCl, iColor, iFigure);
}
Hm InvalidateRect(hCl, NULL, TRUE) v UpdateWindow(hCtrl) c nhim v lm
cho ca s con cn phi v li. Hm PaintWindow dng v ra mn hnh ellipse hay ch
nht. u tin hm ny ly DC (device context) ca thit b c handle l hCl, v v ln thit
b ny dng hnh nh cng vi mu t c chn. Kch thc ca ca s con cn v c
ly bng hm GetCIientRect.Hm ny tr v kch thc ca vng client cn v theo n v
tnh l pixel.
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 IDCJPAINT c v li. Cch x ly 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.
Nu mun v hiu ha mt phn t iu kin, tc bin i nt sang trng thi v
hiu ha th dng hm.
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
Trang 45
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
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.
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
lm c iu ny chng ta dng handle ca hp thoi (la ong bin ton cc) c tr
v t li gi hm CreateDialog v chuyn hng chng bng on lnh nh sau.
while(GetMessage(&msg, NULL, 0, 0))
{
if (hDlgModeless==0 II IIsDialogMessage (hDlgModeless, &msg);
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Nu thng ip ly ra t hng i dnh cho hp thoi th hm IsDialogMessage kim
tra v gi n cc th tc x l hp thoi. V lc ny hm v gi tr TRUE, cn ngc li
th hm v gi tr FALSE. Nu dng thm chc nng phm tng tc th on chng nh
trn c vit li nh sau.
whUe(GetMessage(&msg, NULL, 0, 0))
{
if (hDlgModeless==0 II !IsDialogMessage(hDlgModeless, &msg);
{
if(TranslateAccelerator (hwnd, hAccel, Stmsg)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
>
}
>
Nn ch rng bin hDlgModeless lun mang gi tr 0 cho n lc c mt hp thoi
c khi to bng cu lnh CreateDialog th gi tr ca n mi c thay i. Khi ca s
hp thoi b hy nh t hDlgModeless v gi tr 0. iu ny gip Windows khng gi nhm
thng ip x l n cc ca s khc. kt thc v ng hp thoi dng Modeless bn
dng hm DestroyWindow ch khng phi dng hm EndDialog nh hp thoi dng Modal.
Trang 47
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
2.22.2. V d v hp thoi khng khng trng thi
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 nh 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.
Chng trnh minh ha (V d 2.3) :
*OMODELESS.CPP (trch dn)
void PaintWindow (HWND hwnd, int iColorQ, int iFigure)
{
HBRUSH hBrush ;
HDC hdc ;
RECT rect ;
hdc = GetDC(hwnd) ;
GetClientRect (hwnd, &rect) ;
hBrush = CreateSolidBrush(RGB(iColor[0], iColor[l], iColor[2]));
hBrush = (HBRUSH) SelectObject (hdc, hBrush) ;
if (iFigure == IDC_RECT)
Rectangle (hdc, rect.left, rect.top, rect.right, rect.bottom) ;
Trang 48
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
else
Ellipse(hdc, rect.left, rect.top, rect.right, rect.bottom);
DeleteObject (SelectObject (hdc, hBrush));
ReleaseDC (hwnd, hdc);
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
IParam)
{
switch (message)
{
case WM_PAINT:
PaintTheBlock(hwnd, iColor, iFigure);
return 0 ;
case WM_DESTROY:
DeleteObject((HGDIOBJ)SetClassLong(hwnd, GCL_HBRBACKGROUND,(LONG)GetStockObject
(WHITEJBRUSH)));
PostQuiiMessage (0);
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, IParam);
}
void PaintTheBlock (HWND hCtt], int iColor[], int iFigure)
{
InvalidateRect (hCl, NULL, TRUE);
UpdateWindow (hCl);
PaintWindow (hCl, iColor, iFigure);
Trang 49
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
BOOL CALLBACK ColorScrDlg (HWND hDlg, UINT message, WPARAM wParam, LPARAM
lParam)
{
HWND hwndParent, hC trl;
{
case WM_INli DIALOG:
hClBlock = GetDlgltem (hDlg, IDC_PAINT);
for (iClID = 10; iCtrllD < 13 ; iCtrlID++)
{
hCtrl = GetDlgltem (hDlg, iCtrllD);
PaintTheBlock (hClBlock, iColor, Figure);
PaintTheBlock (hwndParent, Color, iFigure);
SetScrolIRange (hCtrl, SB_CTL, 0,255, FALSE);
SetScrollPos(hQrl, SB_CTL, 0, FALSE);
}
return TRUE;
case WM_COMMAND:
{
switch( LOWORD(wParam))
{
case IDC_RECT:
case IDC_ELLIPSE:
iFigure = LOWORD(wParam);
Trang 50
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
CheckRadioButton(hDlg, IDCJRECT, IDC_ELLIPSE, LOWORD (wParam)) ;
PaintTheBlock(hCtrlBlock, iColor, iFigure);
PaintTheBlock (hwndParent, iColor, iFigure);
return TRUE;
}
break;
>
case WM_VSCROLL :
hCtrl = (HWND) IParam ;
{
case SB_PAGEDOWN:
iColorfilndexJ += 1 5;
case SBJLINEDOWN:
iColor[iIndex] = min (255, iColor[iIndex] + 1 );
break;
case SBJPAGEUP:
iColor[iIndex] -= 1 5 ;
case SBJLINEUP :
iColor[iIndex] = max (0, iColor[iIndex] - 1);
break;
Trang 51
NGN NG LP TRNH
WINDOWS
LP TRNH c TRN
case SB_TOP:
iColor[iIndex] = 0 ;
break;
case SB_BOTTOM :
iColorfilndex] = 255;
break;
case SBJTHUMBPOSITION:
case SB_THUMBTRACK:
iColor[iIndex] = HIWORD (wParam);
break;
default:
return FALSE;
>
SetScrollPos(hCtrl, SB_CTL, iColor[iIndex], TRUE);
SetDlgltemlnt (hDlg, CtrlID + 3, iColor[iIndex], FALSE);
InvalidateRect(hwndParent,NULL,TRUE);
DeleteObject ( (HGDIOBJ)SetClassLong( hwndParent, GCL_HBRBACKGROUND, (LONG)
CreateSoIidBrush( RGB(iColor[0], iColor[l], iColor[2])) ) ) ;
return TRUE;
case WM_PAINT:
>
return FALSE;
Trang 52
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
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 n 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 n 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), v i 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 ng thi mu xm, khi ngi dng s bit rng mc
lit k khng c hiu lc.
2.3.1. T h i t l p Menu
to mt menu v a vo chng trnh bao gm cc bc sau:
*To menu ong tp tin ti nguyn *.RC: to menu ong 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.
*Ci t menu vo ca s ca chng trnh ng dng: phn ny n gin l khi nh
ngha lp ca s ta thit lp thuc tnh IpszMenuName ca eau trc lp WNDCLASS bng
tn menu c khai bo trong tp tin ti nguyn.
V d : wndclass.lpszMenuName = "MENU1";
Ngoi ra, c th ci t menu vo ca s bng cch dng lnh :
hMenu = LoadMenu ( hlnstance, TEXT("MENU1") );
Lnh ny s tr v mt nh danh ca menu c np, khi c c nh danh menu
ny th khi a vo ca s c 2 cch sau:
*Trong hm to ca s CreateWindow, tham s th 9 ca hm l nh danh cho menu,
thit lp tham s ny l nh danh ca menu va to.
Trang 53
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
hwnd = CreateWindow ( TEXT("MyClass"), TEXT("Window Caption"),
w s _ 0 VERLAPPEDWINDOW, c w _ u SEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, NULL, hMenu, hlnstance, NULL );
*Khi gi hm to ca s CreateWindow, tham s th 9 c thit lp NULL, sau
trong chng trnh dng lnh: SetMenu(hWnd, hMenu); thit lp menu cho ca s.
*Thm cc on chng tnh x l menu: Windows pht sinh thng ip
WM_COMMAND v gi n chng trnh khi ngi dng chn mt mc lit k c hiu lc
trn thanh menu. Khi ch cn x l thng ip WM_COMMAND bng cch kim a 16
bit thp ca tham s wParam l xc nh c ID ca mc lit k no trn menu c chn.
MENUITEM SEPARATOR
MENUITEM "E&xit", IDM_APP_EXIT
END
POPUP "&Edit"
BEGIN
MENUITEM "&Undo", IDM_EDIT_UNDO
MENUITEM SEPARATOR
MENUITEM "C&ut", IDM_EDIT_CUT
MENUITEM "&Copy", IDM_EDIT_COPY
Trang 54
NGN NG LP TRNH
WINDOWS
MENUITEM "&Paste", IDM_EDIT_PASTE
LP TRNH c TRN
BEGIN
MENUITEM "&White", IDM_BKGND_WHITE, CHECKED
END
POPUP "&Help"
BEGIN
MENUTTEM "&Help...", IDM_APP_HELP
MENUITEM "&AboutIDM_APP_ABOUT
END
END
Trang 55
NGN NG LP TRNH
WINDOWS
LP TRNH c TRN
int WINAPI WinMain (HINSTANCE hlnstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int
iCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW I CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtta = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hlnstance = hlnstance;
wndclass.hlcon = LoadIcon(NULL, IDI_APPLICATION);
Trang 56
NGN NG LP TRNH
WINDOWS
LP TRNH c TRN
{
MessageBox(NULL, TEXT("This program reqmres Windows "), szAppName, MB_ICONERROR);
return 0 ;
}
hwnd = CreateWindow (szAppName, TEXT("Menu Demonsttation"),
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
IParam)
{
/*
Trang 57
NGN NG LP TRNH
WINDOWS
LP TRNH c TRN
{
case WM_COMMAND:
hMenu = GetMenu (liwnd); //L y nh danh ca menu
switch (LOWORD (wParam)) //K im tra nh danh mc chn
{
case IDM_FILE_NEW:
case IDM_FILE_OPEN:
case IDM_FILE_SAVE:
case IDM_FILE_SAVE_AS:
MessageBeep(O); //Pht ra ting ku bp
return 0 ;
case IDM_APP_EXIT:
/*Gi thng ip ng ng dng li*/
Trang 58
NGN NG LP TRNH
WINDOWS
LP TRNH c TRN
case IDM_BKGND_LTGRAY:
case IDM_BKGND_GRAY:
case IDM_BKGND_DKGRAY:
case IDM_BKGND_BLACK:
/* B check ca mc chn trc */
CheckMenuItem(hMenu,iSelection, MF_UNCHECKED);
iSelection = LOWORD (wParam); /*Ly ID mc mi*/
/* Check mc chn mi*/
}
break;
case WM_DESTROY:
PostQuitMessage(O) ;
return 0 ;
}
Trang 59
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
>
Chng 3
CC I TNG IU KHIN
3.1. M U
Cc i tng iu khin (control) l cc thnh phn tng tc c quan, th hin r
c ch giao tip ha gia ng dng v ngi dng. Nh cc i tng ny, cc chng
trnh ng dng trong Windows tr nn thn thin v d dng. V th, chng l cc thnh phn
c bn khng th thiu trong hu ht cc hg dng.
Trong chng ny, chng ta s tm hiu cc to lp v x l cho cc i tng iu
khin thng qua cc lp (class) sau :
NGN NG LP TRNH
WINDOWS
Lp Static (tnh).
Lp Edit Box (son tho).
Lp List Box danh sch.
Lp Combo Box.
Lp Scroll Bar (thanh cun).
LP TRNH c TRN
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
trng hp mun to mt lp c nh ngha sn th khng cn ng k cho lp ca s
con mun to.
s dng cc kiu iu khin trc tip trn ca s chnh i hi cc tc v cp thp
hn so vi dng cc kiu iu khin trn hp thoi. V cc kiu iu khin to ra trn ca s
chnh khng c h tr cc tin ch. V d nh chng ta khng th s dng phm bm tab
chuyn focus gia cc kiu iu khin vi nhau.
3.3. L P BUTTON
tm hiu cc kiu iu khin, xem xt v d 3.1 sau. Trong v d ny to ra 9
ca s con chun trn mt ca s cha nh hnh 3.1.
JaJxJ
n ie s > d u e
PUSHBUTTON
DEFPUSHBUTTON
CHECKBOX
AUTOCHECKBOX
RADIOBUTTON
3STATE
AUT03STATE
GROUPBOX
WH_COMMAND
0 0 00 -0 0 0 0
WM COMMAND
WM_COMMAND
0 0 00 -00 02
WM_COMMAND
0 000-0003
0000-0 004
0 000-0005
00 00-0006
00 00-0008
WM_COMMAND
WM_COMMAND
WM_COMMAND
UM COMMAND
0019-0288
0 0 3 ft-01A8
00200214
0 0 1 ft-0278
0019-0274
001A-028
0019-0272
0019-0276
Gi tr
BN_CLICKED
BN_PAINT
Trang 62
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
BN_DISABLE
BN_SETFOCUS
BN_KILLFOCUS
7
Bng 3.1 nh danh m thng bo Button
{
int iStyle;
TCHAR *szText;
}
button[ ] =
{
BSJPUSHBUTTON, TEXT ("PUSHBUTTON"),
BS_DEFPUSHBUTTON, TEXT ("DEFPUSHBUTTON"),
Trang 63
NGN NG LP TRNH
WINDOWS
};
LP TRNH c TRN
{
static HWND hwndButton[NUM];
static RECT rect;
static TCHAR szTopO = TEXT("message wParam IParam"),
szUnd[] = TEXT("___________________ "),
szFormat[] = TEXT("%-16s%04X-%04X %04X-%04X"),
szBuffer[50];
static int cxChar, cyChar;
HDC hdc;
PAINTSTRUCT p s;
int i ;
switch (message)
{
case WM_CREATE:
cxChar = LOWORD(GetDialogBaseUnitsQ);
cyChar = HrWORD(GetDialogBaseUnitsO);
for (i = 0 ; i < NUM ; i++)
hwndButton[i] = CreateWindow(TEXT("button"), button[i].szText, WS_CHILD|WS_VISIBLE|
bunon[i].iStyle, cxChar, cyChar*(l+2'i'i)>20*cxChar, 7*cyChar/4, hwnd, (HMENU)i,
((LPCREATESTRUCT)lParam)->Mnstance, NULL);
return 0 ;
case WM_SIZE :
rect.left = 24*cxChar;
Trang 64
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
rect.top = 2*cyChar ;
rect.right = LOWORD(lParam);
rect.bottom = HIWORD(lParam);
return 0 ;
case WM_PAINT:
InvalidateRect (hwnd, &rect, TRUE);
hdc = BeginPaint (hwnd, &ps);
SelectObject(hdc,GetStockObject(SYSTEM_FiXED_FONT));
case WM_DESTROY:
PostQuitMessage(O);
return 0 ;
}
Trang 65
NGN NG LP TRNH
WINDOWS
LP TRNH c TRN
}
to ra mt child window control bn dng cu trc CreateWindow vi cc thng
s nh sau.
Tn lp : TEXT ("button")
Text ca s : Button[i].szText
Kiu ca s : WS_CHILD I WS_VISIBLE I button[i].iStyle
DV tr X : cxChar
V tr y : cyChar*( l+2*i )
Chiu rng : 20*xChar
Chiu cao : 7*yChar*4
DHandle ca s cha : hwnd
Ch danh ca ca s con : (HMENU) i
Th qun Handle : ((LPCREATESTRUCT) lParam-> hlnstance, NULL) ;
Cc thng s thm : NULL
SendMessage(hwndButton, BM_SETSTASE, 0, 0 );
Trang 66
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
hwndButton l nh danh ca ca s con c v bi hm CreateWindow.
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Kh nhn thng ip WM_COMMAND t radio button, th chng ta )hi nh du
radio bng cch gi thng ip BM _SETCHECK vi thng s wParam bng 1 nh sau.
SendMessage(hwndButton, BM_SETCHECK, 1, 0);
Tt c cc radio button trong cng mt nhm, nu bn mun tt du check th bn gi
n chng thng ip BM_SETCHECK vi thng s wParam bng 0 nh sau.
SendMessage(hwndButton, BM_SETCHECK, 0, 0);
3.3.4. L p Group Box
Group box c kiu BS_GROUPBOX, y l loi button c bit. Mt group box ch
n gin l mt ng vin c dng tiu trn nh. Group box khng x l cc thng
ip bn phm, khng x l cc thng ip chut v cng khng gi thng ip
WM_COMMAND n ca s cha ca no. Cc group box thng c s dng bao quanh
cc kiu iu khin khc.
3.4. L P STATIC
To ra mt lp tnh bng cch s dng "static" khi to lp ca s trong hm
CreateWindow. Lp tnh khng nhn nhp d liu t bn phm cng nh t chut, v khng
gi thng ip WM_COMMAND n ca s cha.
Khi di chuyn hay nhn chut vo cc ca s con nh, ca s con ny by thng ip
WM_NCHITTEST v tr v gi HTTRANSPARENT n Windows. iu ny lm cho
Windows gi cng thng ip WM_NCHITTEST cho ca s cha. c a s cha thng gi
thng ip ny n th tc DefWlndowProc. Cc kiu ca s tnh sau y dng v mt
hnh ch nht hay mt khung ln vng client ca ca s con. Cc kiu FRAME l nhng
ng bao hnh ch nht, cc kiu RECT l nhng hnh ch nht :
SSJBLACKRECT, SS_GRAYRECT, s s _ WHITERECT.
SS_BLACKFRAME, SS_GRAYFAME, SS_WHITEFRAME.
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
*EDITTEXT.CPP
#indude <windows.h>
#define ID_EDIT 1
{
static HWND hwndEdit;
switch (message)
{
case WM_CREATE:
hwndEdit = CreateWindow (TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_HSCROLL |
WS_VSCROLL | WS_BORDER | ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0, 0,
0, 0, hwnd, (HMENU)IDJEDIT, ((LPCREATESTRUCT) IParam) -> hlnstance, NULL);
return 0 ;
case WM_SETFOCUS :
SetFocus (hwndEdit);
return 0 ;
case WM_SIZE :
MoveWindow (hwndEdit, 0, 0, LOWORD(lParam), HTWORD(lParam), TRUE);
return 0 ;
case WM_COMMAND :
if (LOWORD (wParam) == IDJEDIT)
if ( HIWORD(wParam)==EN_ERRSPACE || HIWORD(wParam)==EN_MAXTEXT)
MessageBox(hwnd, TEXT("Edit control out of space."), szAppName, MB_OK | MB_ICONSTOP);
return 0 ;
case WM_DESTROY:
Trang 69
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
PostQuitMessage(O) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, IParam) ;
}
Hn ch ca edit box c nh ngha sn l s k t ngi dng nhp vo phi
khng qu 30.000 k t ch.
ngha
EN_SETFORCUS
EN_KILLFORCUS
EN_CHANGE
ENJJPDATE
Trang 70
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
ENJERRSPACE
EN_MAXTEXT
EN_HSCROLL
EN_VSCROLL
Trang 71
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
iCount = SendMessage (hwndEdit, EM_GETLINECOUNT, 0, 0);
Cc dng trong edit control c nh s bt th t t 0. Ly chiu di ca mt dng
bng lnh.
iLength = SendMessage (hwndEdit, EM_LINELENGTH, iLine, 0).
Chp hng ny vo b m bng cch gi hm.
iLength = SendMessage ( hwdEdit, EM_GETLINE, iLine, (LPARAM)Buffer).
Trang 72
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Ngoi ra cn c cc thng s WS_SIZEBOX v WS_CAPTION dng thay i kch
thc v thm tiu cho list box. Nn to ra mt list box c chiu rng bng chiu di ca
chui di nht trong list box cng vi chiu di ca thanh cun dc. Chiu di ca thanh cun
dc c xc nh bng hm.
GetSystemMetrics(SM_CXVCROLL);
Trang 73
NGN NG LP TRNH
LP TRNH
WINDOWS
SendMessage(hwndList, WMSETREDRAW, TRUE, 0);
c TRN
Trang 74
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Tuy nhin, i vi list box chn kp th chng ta khng th dng cc ch th
LB SETCURSEL, LB_GETCURSEL, hoc LB SELECTSTRING. Thay vo phi dng
ch th LB_SETSEL chn mt mc m khng lm nh hng n cc mc chn khc.
SendMessage(hwndList, LB_SETSEL, wParam, ilndex);
Tham s wParam khc 0 chn v lm sng mc, bng 0 hy vic chn.
Xc nh trng thi ca mt mc no trong list box (loi list box chn kp) dng
hm.
iSelect = SendMessage(hwndList, LB_GETSEL, ilndex, 0);
Hm v gi tr khc 0 nu mc c v tr ilndex c chn, v bng 0 nu mc v
tr khng r chn.
Gi tr
ngla
LBNJERRSPACE
-2
LBNLSELCHANGE
LBN_DBLCLK
LBN_SELCANCEL
LBN_SETFOCU s
LBNJKILLFOCUS
Trang 75
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
{
int i;
static TCHAR *tc[]={TEXT("cam"), TEXT("quyt"), TEXT("buoi"), TEXT("tao"), TEXTCchanh"),
TEXT("xoai"), TEXT("nho )};
for(i=0; i<7; i++)
Trang 76
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
>
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
static HWND hwndList, hwndText;
int ilndex, Length, cxChar, cyChar;
TCHAR *pVarName;
switch (message)
{
case WM_CREATE:
cxChar = LOWORD (GetDialogBaseUnits 0 ) ;
cyChar = HIWORD (GetDialogBaseUnits 0 ) ;
// To mt listbox
hwndList = CreateWindow ( TEXT("listbox"), NULL, WS_CHILD I WS_VISIBLE I LBSJNOTIFY I
LBS_STANDARD, cxChar, cyChar * 3, cxChar * 16 + GetSystemMetrics (SM_CXVSCROLL), cyChar * 5, hwnd,
(HMENU) IDJLIST, (fflNSTANCE)GetWindowLong(hwnd, GWLJHINSTANCE), NULL ) ;
// to mt control "static"
hwndText = CreateWindow ( TEXTC'static"), NULL, WS_CHILD IWSJVISIBLE I SS_LEFT, cxChar,
cyChar, GetSystemMetrics (SM_CXSCREEN), cyChar, hwnd, (HMENU) ID_TEXT,
(HINSTANCE)GetWindowLong(hwnd, G\VL_HINSTANCE), NULL);
FillListBox (hwndList);
return 0 ;
case WM_SETFOCUS : //t focus nhp cho list box
SetFocus (hwndList);
return 0 ;
//x l cc thng ip khi chn mc trong list box
case WM_COMMAND :
Trang 77
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
{
// ly ch v tr ca mc c chn
iIndex=SendMessage(hwndList,LB_GETCURSEL, 0, 0);
}
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, IParam) ;
}
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 so cha x l. Khi th tc WndProc nhn
c thng ip WM_COMMAND, n kim a 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:
SendMessage (hwndList, LB_GETCURSEL, 0, 0) ;
V tip tc ly ni dung ca mc c chn thng qua hm.
SendMessage ( hwndList, LB_GETTEXT, ilndex, (LPARAM) pVarName);
Sau cng, hin th mc c chn ln control nh thng qua hm.
SetWindowText (hwndText, pVarName);
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Cng ging nh List box, Combo box cng l tp hp cc chui k t c gi gn
ong mt hnh ch nht. Mt chng trnh c th dim hoc xa cc chui trong Combo box
bng cch gi cc thng ip n th tc window ca Combo box. Combo box control gi
thng ip WM_COMMAND n ca s cha khi c mt mc ong Combo box c nh
du. c a s cha xc nhn mc c nh du trong Combox box.
Trong Combox box ch cho php chn mt mc trong danh sch cc mc c trong
Combo box.
Trang 79
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Tng t, ta c th xa mt mc ong Combo box bng thng ip
CBJDELETESTRING.
SendMessage (hWnd, CB_DELETESTRING, ilndex, 0);
Trang 80
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
^jnjxj
H V Du Combo Box
{
int i;
static TCHAR *tc[ ] = {TEXT("MAI XUAN HUNG"), TEXTC'LE HOAN VU"), TEXT("LE LU NHA"),
TEXTC'PHAM THANH PHONG"), TEXT( 'LE LUC"), TEXT("NGUYEN TIEN"), TEXT("DINH QUYEN")};
for(i=0; 1<7; i++)
SendMessage(hwndCombo,CB_ADDSTRING,0,(LPARAM)tc[i]);
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
IParam)
{
static HWND hwndCombo, hwndText;
int ilndex, ILength, cxChar, cyChar;
TCHAR *pVarName;
switch (message)
{
case WM_CREATE:
Trang 81
LP TRNH c TRN
NGN NG LP TRNH
WINDOW S
cxChar = LOWORD (GetDialogBaseUnits 0 ) ;
cyChar = HIWORD (GetDialogBaseUnits ());
{
iIndex=SendMessage(hwndCombo,CB_GETCURSEL,0,0);
iLength=SendMessage(hwndCombo,CB_GETLBTEXTLEN,iIndex, 0) 11;
pVarName =(char*) calloc (Length, sizeof (TCHAR));
SendMessage(hwndCombo, CB_GETLBTEXT, ilndex, (LPARAM)pVarName);
SetWindowText (hwndText, pVarName);
free (pVarName);
}
return 0 ;
case WM_DESTROY :
PostQuitMessage (0);
return 0 ;
Trang 82
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
return DefWindowProc (hwnd, message, wParam, lParam) ;
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
n control thanh cun.
Cc phm di chuyn
Home
SB_TOP
End
SBJBOTTOM
Page Up
SB_PAGEUP
Page Down
SB_PAGEDOWN
Left hay Up
SB_LINEUP
SB_LINEDOWN
Trang 84
N G N N G LP T R N H
L P T R N H c T R N
WINDOWS
Trong v d sau hm WinProc ta nh ngha mt mng gm c 3 phn t mi phn
t l mt handle chi t (brush) cho mt thanh cun.
static HBRUSH hBrush[3];
{
hBrush [i] = CreateSolidBrush (color [i]);
}
Trong color cha cc gi tr mu s cp RGB (Red, Green, Blue). Mt trong 3 chi
t (b ru sh ) c tr v khi x l thng i p W M _ C T L C O L O R C R O L L B A R ong th t c
3.8.3. T mu n n ca s
Trong v d di y to ra ca s v mt chi t mu en cho vng thao tc cho
ca s ny.
Wndclass.hbrBackground = CreateSolidBrush (0 );
Trang 85
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Khi thay i vic chn n cc thanh cun th chng trnh to ra mt chi t (brush)
mi v chn handle ca chi t mi ny vo ca s n. 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.
DeleteObject ( (HBRUSH)SetClassLong( hwnd, GCL_HBRBACKGROUND,
(LONG)CreateSolidBrush(RGB (icolor[0], icolor[l], icolor[2])))) ;
Windows s dng chi t mi ny t vng thao tc cho ln t k tip. Dng hm
sau xa 2/3 bn phi ca vng thao tc trc khi v li vng ny.
InvalidateRect (hwnd, &icolor, TRUE) ;
Hm InvalidateRect lm cho window t thng ip WM_PAINT vo trong hng i
rr thng ip ra th fr x l window. M thng ip WM_PATNT r U1 tin thp hn
cc thng ip x l bn phn hay chut nn n c x l sau. Nu mun vng ca s c
cp nht li mu ngay sau khi di chuyn con chy n thanh cun th dng hm.
UpdateWindow (hwnd) ;
Tuy nhin nu chng ta dng hm ny th lm cho tc x l thng ip chut v bn
phm chm li.
Hm WndProc khng x l thng ip WM_PAINT m a cho hm
DefWindowProc. Nh chng ta bit windows x l mc nh thng ip WM_PAINT ch
n gin l li gi hm BeginPaint v EndPaint. Nhng trn chng ta ch nh
InvalidateRect l phn nn cn phi xa, chnh iu ny hm BeginPaint s khin cho
Windows t ng pht sinh thng ip xa nn WM_ERASEBKGND.
Ch : phi dn dp cc chi t trc khi chng trnh kt thc bng hm
DeleteOject trong khi x l thng ip WM_DESTROY.
Trang 86
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
lParam)
{
static COLORJREF crPrim[3] = { RGB (255, 0, 0), RGB (0, 255, 0),
RGB (0, 0, 255) };
static HBRUSH hBrush[3], hBrushStatic;
static HWND hwndScroll[3], hwndLabel[3], hwndValue[3], hwndRect;
static int color[3], cyChar;
static RECT rcColor;
static TCHAR *szColorLabel[] = { TEXT("Red"),
TEXT("Green"), TEXT("Blue") } ;
HINSTANCE hlnstance;
int i, cxClient, cyClient;
TCHAR szBuffer[10];
switch (message)
{
case WM_CREATE:
hlnstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE);
hwndRect = CreateWindow (TEXT("static"), NULL, WS_CHILD I WS_VISIBLE I SSJWHITERECT, 0,
0, 0, 0, hwnd, (HMEN) 9, hlnstance, NULL);
Trang 87
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
{
hwndScroll[i] = CreateWindow (TEXT ("scrollbar"), NULL, WS_CHILD IWSJVTSIBLE I WS_TABSTOP
I SBS_VERT, 0, 0, 0, 0, hwnd, (HMENU) i, hlnstance, NULL);
SetScrollRange(hwndScroll[i], SB_CTL, 0, 255, FALSE);
SetScrollPos (hwndScrolI[i], SB_CTL, 0, FALSE);
hwndLabel[i] = CreateWindow ( TEXT("static"), szColorLabel[i], WS_CHILD|WS_VISIBLE|
SS_CENTER, 0, 0, 0, 0, hwnd, (HMENU) (i + 3), hlnstance, NULL);
hwndValue [i] = CreateWindow (TEXT ("static"), TEXT ("0"), WS_CHILD IWS_VISIBLE I
SS_CENTER, 0, 0, 0, 0, hwnd, (HMENU) (i + 6), hlnstance, NULL);
01dScroll[i] = (WNDPROC) SetWindowLong ( hwndScrollfi], GWL_WNDPROC, (LONG) ScrollProc);
hBrush[i] = CreateSolidBnish (crPrim[i]);
>
hBrushStatic = CreateSolidBrush ( GetSysColor (COLOR_BTNHIGHLIGHT));
cyChar = HIWORD (GetDialogBaseUnits 0 ) ;
return 0 ;
case WM_SIZE :
cxClient = LOWORD (IParam);
cyClient = HI WORD (lParam);
SetRect (&rcColor, 0, 0, cxClient/1.5, cyClient);
MoveWindow (hwndRect, cxClient/1.5, 0, cxCliem/2, cyClient, TRUE);
for (i = 0 ; i < 3 ; i++)
{
MoveWindow (hwndScroll[i], ((int)(1.2 * i + 1) * cxClient) / 13 + (int)cxClienl.5, 2*cyChar, cxClient / 1 7 ,
cyClient - 4 * cyChar, TRUE) ;
MoveWindow (hwndLabel[i], (2.3 * i + 1) * cxClient / 28+ cxClienl.5, cyChar/ 2, cxClient / 8, cyChar,
TRUE);
MoveWindow (hwndValue[i], (2.3 * i + 1) * cxClient / 28+ cxClient/1.5, cyClient - 3 * cyChar / 2,
cxClient / 8, cyChar, TRUE);
Trang 88
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
}
SetFocus (hwnd);
return 0 ;
case WM_SETFOCUS :
SetFocus (hwndScroll[idFocus]);
return 0 ;
case WM_VSCROLL :
i = GetWindowLong ((HWND) lParam, GWL_ID);
switch (LOWORD (wParam))
{
case SBJPAGEDOWN:
color[i] += 15;
case SBJLINEDOWN:
color[i] = nun (255, color[i] + 1 );
break;
case SB_PAGEUP:
color[i] -= 15;
case SBJLINEUP :
color[i] = max (0, color[i] - 1 );
break;
case SB_TOP:
color[i] = 0 ;
b reak;
case SB_BOTTOM :
color[i] = 255;
b reak;
Trang 89
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
case SBJTHUMBPOSITION:
case SB_THUMBTRACK:
color[i] = HIWORD (wParam);
b reak;
default:
b reak;
>
SetScrolIPos (hwndScrolI[i], SB_CTL, color[i], TRUE);
wsprintf (szBuffer, TEXT
color[i]);
{
SetTextColor ((HDC) wParam, crPrim[i % 3 ]);
SetBkColor ( (HDC) wParam, GetSysColor ( COLOR_BTNHIGHLIGHT) );
return (LRESULT) hBrushStatic;
}
b reak;
case WM_SYSCOLORCHANGE:
Trang 90
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
DeleteObject (hBrushStatic);
hBrushStatic = CreateSolidBrush ( GetSysColor (COLOR_BTNHIGHLIGHT));
return 0 ;
case WM_DESTROY:
DeleteObject ((HBRUSH) SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG) GetStockObject
(WHITEJBRUSH)));
for (i = 0 ; i < 3 ; i++)
DeleteObject (hBrush[i]);
DeleteObject (hBrushStatic);
PostQuitMessage (0);
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, IParam);
}
LRESULT CALLBACK ScroIlProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
int id = GetWindowLong (hwnd, GWL_ID);
switch (message)
{
case WM_KEYDOWN:
if (wParam == VK_TAB)
SetFocus (GetDlgltem (GetParent (hwnd), (id + (GetKeyState (VK_SHIFT) < 0 ? 2 : 1)) % 3));
b reak;
case WM_SETFOCUS :
idFocus = id ;
b reak;
Trang 91
LP TRNHc TRN
NGN NG LP TRNH
WINDOWS
}
return CallWindowProc(01dScroll[id],hwnd,message,wParam,lParam);
Chng 4
X L BN PHM, THIT B CHUT, V B NH
THI GAN
4.1. M U
Cc chng c trnh by cc thnh phn iu khin chung v hp thoi. Trong
cc thnh phn ny, vic giao tip vi ngi dng c cc hp thoi hay cc iu khin
x l, thng khng cn quan tm lm vic giao tip vi cc thit b . Tuy nhin, lp trnh
trn Windows cng cn phi hiu vic x l cc thit b nhp nh bn phm v thit b chut.
Trang 92
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Mt s ng dng nh ha hay thao tc vn bn t nhiu cng phi vit cc x l lin quan
ti bn phm v thit b chut.
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 nh by mt thnh phn cng khng km quan trng l b nh
thi gian. Windows cung cp c ch ny truyn thng vi tig dng theo nh k. v i 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 tig dng theo
tng khong thi gian nh k c khai bo.
Tm li vic tm hiu bn phm, thit b chut, v b nh thi gian s em li s hiu
bit su sc v thnh phn nhp liu cn bn ca mt ng dng trn Windows.
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.
Trong phn ny chng ta s tm hiu cc thng ip c pht sinh t bn phm v
cch can thip x l chng.
4.2.1. N n t n g c S v bn phm
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 W ndProc 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, ong 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 lAi tin, ng dng
Trang 93
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
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 ttong 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 li thng
bo ca cc phn 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 ieu khn ny.
Tm li trong cc ng dng c cu thnh t cc thnh phn iu khin c bn ny
th chng ta khng quan tm n vic x l cc thng ip t bn phm.
Trang 94
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
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 nh. 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, v i 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 hg.
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
chng ta giao ph hon ton cho Windows x l cc thng ip h thng ca ng dng, m
Windows s x l cc thng ip h thng ny v a ra cc thng ip bnh thng khc
n ng dng. V d khi nhn phm Alt+Tab th Windows s to mt thng ip h thng
gi vo hng i ca ng dng v khi khng x l thng ip ny d theo mc nh hm
DefWindowProc s x l v tr v thng ip WMJKILLFOCUS cho ng dng, khi ng
dng ca chng ta s d dng x l hn.
Tm li thng ip WMJKEYDOWN v WMJKEYUP thng c sinh ra bi cc
phm nhn thng thng khng kt hp vi phm Alt. Nu chng trnh ca chng ta b qua
khng x l cc thng ip ny th Windows cng khng to ra cc thng ip hay x l g
c bit.
4.2.4.2. Cc thng ip pht sinh t bn phm
Sau y l bng m t cc thng ip pht sinh t bn phm (theo th t Alphabet).
Thng ip
WM_ACTIVATE
WM_APPCOMMAND
WM_CHAR
Thng ip ny c gi ti ca s c s quan tm
khi thng ip WM_KEYDOWN c dch t hm
TranslateMessage. Thng ip WM_CHAR c cha m k t
ca phm c nhn.
WMJDEADCHAR
Thng ip ny c gi ti ca s c s quan tm
khi thng ip WM_KEYUP c x l t hm
TranslateMessage. Thng ip ny xc nhn m k t khi mt
plm dead key c nhn. Phn dead key l phm kt hp
to ra k t ngn ng khng c trong ting anh (xut hin
trong bn phm h tr ngn ng khc ting Anh).
WM_GETHOTKEY
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
WM_HOTKEY
WM_KEYDOWN
W MKEYUP
WMJKILLFOCUS
WM_SETFOCUS
WM_SETHOTKEY
WM_SYSCHAR
Thng ip ny s c gi ti ca s nhn c s
quan tm khi hm TranslateMesage x l xong thng ip
WM_SYSKEYDOWN. Thng ip WM_SYSCHAR cha m
ca phm h thng. Phm h thng l phm c cha phm Alt
v t hp phm khc.
WM_SYSDEADCHAR
Thng ip ny c gi ti ca s nhn c s
quan tm khi mt thng ip WM SYSKEYDOWN c
bin dch trong hm TranslateMessage. Thng ip ny xc
nhn m k t ca phn h thng deadkey c nhn.
WM_SYSKEYDOWN
Thng ip ny c gi ti ca s nhn c s
quan tm khi ngi dng nhn phm FIO hay nhn Alt trc
khi nhn phm khc. Thng ip ny cng c gi khi khng
c ca s no nhn c s quan tm v lc ny th ca s
nhn c l ca s ang c kch hot (Active).
w m _s y s k e y u p
Thng ip ny c gi ti ca s nhn c s
quan tm khi ngi dng nhn mt phm m trc gi
phm Alt. Cng tng t nu khng c ca s no nhn c
s quan tm th thng ip ny s c gi cho ca s ang
c kch hot.
Bng 4.1 M t thng ip pht sinh t bn phm
Trang 97
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
4.2.4.3 M phm o (Virtual key code)
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 till 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 nhlihg c th
tm thy chng trong bn phn 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 b t u vi cc tip u ng VK_XXXXX. sau y l bng m t cc
phn o thng dng ong Windows giao tip vi bn phm IBM tng thch.
Thp phn
Thp lc
phn
Windows dng
01
VKJLBUTTON
Nt chut tri
02
VK_RBUTTON
Nt chut phi
03
VK_CANCEL
04
VK_MBUTTON
C trl - B r e a k
Nt chut gia
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 Ctrl-Break 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
phn
Windows
dng
08
VK_BACK
B ack sp a ce
09
VK_TAB
T ab
12
oc
VK_CLEAR
Phm s 5 trong N u m P a d
vi n N u m lo c k tt.
Trang 98
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
13
0D
VK_RETURN
16
10
VK_SHIFT
17
11
VK_CONTROL
18
12
VK_MEN
19
13
VKJPAUSE
Pause
20
14
VK_CAPITAL
Caps Lock
27
1B
VK_ESCAPE
Esc
32
20
VK_SPACE
Spacebar
Thp lc
phn
Windows
dng
33
21
VK_PRIOR
Page Up
34
22
VK_NEXT
Page Down
35
23
VKJEND
End
36
24
VK_HOME
Home
37
25
VK_LEFT
Phm tri
38
26
VK_UP
Phm mi tn ln
39
27
VK_RIGHT
Phm phi
40
28
VK_DOWN
Phm xung
41
29
VK_SELECT
42
2A
VK_PRINT
43
2B
VK_EXECUTE
44
2C
VK_SNAPHOT
Print Screen
Trang 99
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
45
2D
VKJNSERT
Insert
46
2E
VK_DELETE
Delete
47
2F
VK_HELP
Bng 4.4 M t cc phm o (tip theo)
Thp lc
phn
Windows
dng
48-57
30-39
Khng
T phm 0 n phm 9 n
bn phm chnh
65-90
41-5A
Khng
T phm A n phm z.
Thp lc
phn
96-105
60-69
VK_NUMPAD0 n
VK_NUMPAD9
Phm 0 - 9 khi n
N u m L o c k c bt
106
6A
VK_MULTIPLY
Phm *
107
6B
VK_ADD
Phm +
108
6C
VK_SEPARATOR
109
6D
VK_SUBTRACT
Phm -
110
6E
VK_DECIMAL
Phm.
Trang 100
Windows
dng
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
111
6F
VK_DIVIDE
Phm/
112121
70-79
VK_F1 n VK_F10
122135
7A-87
VK_F11 n VK_F24
144
90
VK_NUMLOCK
Num Lock
145
91
VK_SCROLL
Scroll Lock
Phm F1 n F10
Ni dung
0-15
16-23
24
29
30
Trang 101
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
{
HDC hdc; // Thit b ng cnh
TEXTMETRIC tm; // c u trc metric ca vn bn
static DWORD dwCharX; //B ngang ca k t
static DWORD dwCharY; // Chiu di ca k t
static DWORD dwClientX; //B ngang ca vng lm vic
static DWORD dwClientY; //C hiu di ca vng lm vic
static DWORD dwLineLen; // Chiu di ca mt dng
static DWORD dwLines; // s dng vn bn trong vng lm vic
static int nCaretPosX = 0; //T a X ca caret
static int nCaretPosY = 0; //T a y ca caret
static int nCharWidth = 0; //B dy ca k t
static int cch = 0; // S k t trong buffer
static int nCurChar = 0; // Ch n k t hin thi trong buffer
static PTCHAR pchlnputBuf; //K t tm a vo buffer
Trang 102
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
int i, j; //Bin p
int cCR = 0; //S k t xung dng
int nCRIndex = 0; //C h n k t xung dng cui cng
int nVirtKey; //M phm o
TCHAR szBuf [128]; //Buffer tm
TCHAR ch; //K t
PAINTSTRUCT ps; //Dng cho hm BeginPaint
RECT rc; //Hnh ch nht trong hm DrawText
SIZE sz; //Kch thc ca chui
COLORREF crPrevText; //M u ca vn bn
COLORREF crPrevBk; //M u nn
switch ( message )
{
case WM_CREATE:
/* Ly thng tin font hin thi */
hdc = GetDC ( hWnd );
return 0;
case WM_SIZE:
/*
Trang 103
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
dwClientY = HIWORD ( IParam );
break;
case WM_SETFOCUS:
/* To v hin th caret khi ca s nhn c s quan tm */
CreateCaret ( hWnd, ( HBITMAP ) 1, 0, dwCharY );
SetCaretPos ( nCaretPosX, nCaretPosY * dwCharY );
ShowCaret ( hWnd );
break;
case WMJKILLFOCUS:
/*n caret v hy khi ca s khng cn nhn c s quan tm */
HideCaret ( hWnd );
DestroyCaret ( );
break;
case WM_CHAR:
switch ( wParam )
{
case 0x08: // Backspace
case 0x0A: //Linefeed
case OxlB: //Escape
MessageBeep( ( UINT ) -1 );
return 0;
case 0x09: // tab
Trang 104
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
/* Chuyn phm tab thnh 4 k t trng lin tc nhau */
for ( i = 0; i < 4; i ++ )
SendMessage (hWnd, WM_CHAR, 0x20, 0);
return 0;
case OxOD: //Xung dng
/* Lu k t xung dng v to dng mi a caret
xung v t r mi * /
HideCaret ( hWnd );
/* Ly b dy ca k t v xut ra */
hdc = GetDC ( hWnd );
nCaretPosX += nCharWidth;
{
Trang 105
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
nCaretPosX = 0;
pchlnputBuf [ cch++ ] = OxOD;
++nCaretPosY;
}
nCurChar = cch;
ShowCaret ( hWnd);
break;
}
SetCaretPos ( nCaretPosX, nCaretPosY * dwCharY);
break;
case WM_KEYDOWN:
switch ( wParam)
{
case VKJLEFT: //LEFTarrow
/* Caret di chuyn qua tri v ch n u dng */
if ( nCaretPosX > 0 )
{
HideCaret ( hWnd);
/* Tnh ton li v tr ca caret khi qua tri */
ch = pchlnputBuf [nCurChar ];
hdc = GetDC ( hWnd);
GetCharWidth32 ( hdc, ch, ch, &nCharWidth);
ReleaseDC ( hWnd, hdc );
nCaretPosX=max(nCaretPosX-nCharWidth,0);
ShowCaret ( hWnd);
>
Trang 106
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
break;
case VKJRIGHT: //RIGHT arrow
/* Di chuyn caret sang phi */
{
HideCaret ( hWnd);
/* Tnh ton li v tr ca caret khi sang phi */
ch = pchlnputBuf [ nCurChar ];
if ( ch == OxOD)
{
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
{
{
crPrevText=SetTextColor( hdc,RGB (255, 255, 255));
crPrevBk= SetBkColor(hdc,RGB(0,0,0));
TextOut(hdc,nCaretPosX,nCaretPo5Y*dwCharY,
& ch,l);
Trang 107
NGN NG LP TRNH
WINDOWS
}
LP TRNH
GetCharWidth32(hdc,ch,ch,&nCharWidth);
ReleaseDC ( hWnd, hdc );
nCaretPosX = nCaretPosX + nCharWidth;
}
nCurChar++;
ShowCaret ( hWnd);
break;
}
break;
{
if ( pchlnputBuf [ i ] == OxOD)
{
cCR++;
Trang 108
c TRN
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
nCRIndex = i + l ;
}
>
nCaretPosY = cCR;
/* Chp tt c cc k t t k t xung dng cui n k t hin thi va nhp t bn phm vo b nh
m. */
& S Z );
nCaretPosX = sz.cx;
ReleaseDC ( hWnd, hdc );
nCurChar = cch;
break;
default:
break;
}
SetCaretPos( nCaretPosX, nCaretPosY*dwCharY);
break;
case WM_PAINT:
if ( cch == 0 )
break;
hdc = BeginPaint ( hWnd, &ps );
HideCaret ( hWnd );
SetRect ( &TC, 0, 0, dwLineLen, dwClientY);
Trang 109
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
DrawText ( hdc, pchlnputBuf, -1, &rc, DT_LEFT );
ShowCaret ( hWnd );
EndPaint ( hWnd, &ps );
break;
case WM_DESTROY:
PostQuitMessage ( 0 );
/* Gii phng buffer */
GlobalFree ( ( HGLOBAL) pchlnputBuf );
UnregisterHotKey ( hWnd, O x A A A A );
break;
default:
return DefWindowProc ( hWnd, message, wParam, IParam );
>
return NULL;
4.3. TH IT B CHUT
Trong mt mi trng giao tip ha, vic s dng thit b nh v chut l ht sc
cn thit. Nh thit b chut ta c th di chuyn n mt im bt k trn khung mn hnh v
thc hin thao tc kch cc nt chut. i vi mt s Lftig dng ha khng qu phc tp
th cng c thc hin ch yu l chut, ring i vi cc Lftig dng i hi s phc tp
khi v th ngi ta dng bt v.
v i Windows th thit b chut l mt thnh phn quan trng, nu chng ta b thit b
chut th vn khi ng bnh thng v cc chng trnh vn c th chy c. Tuy nhin
khi ta s lng tng nhiu khi x l cc ng dng trc quan tng tc vi ngi dng theo
ta hay nh v.
Cng tng t nh bn phn, thit b chut cng c dng nhp d liu t ngi
dng vo ig 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.
Trang 110
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
v c bn Windows h tr cc loi thit b chut c mt nt, hai v ba nt, ngoi ra
Windows cn c th dng thit b khc nh joystick hay bt v bt chc thit b chut.
Cc ng dng trong Windows thng n vic dng cc nt th hai v nt th ba, c th s
dng tt trn cc thit b chut ch c mt nt. Thng thng nt th hai ca thit b chut
phi c dng cho chc nng gi thc n ng cnh (context menu).
Theo nguyn tc, ta c th kim a xem c tn ti thit b chut hay khng bng cch
dng hm GetSystemMetrics.
fMouse = GetSystemMetrics( SM_MOUSEPRESENT );
Gi tr tr v fMouse l TRUE (1) nu c thit b chut c ci t, v ngc li
bng FALSE (0) nu thit b chut khng c ci t vo my.
Ta rng c th kim tra s nt ra thit h rhnt hng crh dng hm trn thpo cn
lnh sau:
nButton = GetSystemMetrics( SM_CMOUSEBUTTONS );
Gi tr tr v l 0 nu khng ci t thit b chut, tuy nhin di Windows 98 gi tr
tr v l 2 nu cha ci t thit b chut.
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 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 chut th
chnh l chng ta ang dng ta ca im nng ny.
Windows h tr mt s cc con tr chut chun, m ngi lp trnh ch cn gi ra v
dng ch khng cn phi to cc tp tin *.cur. trng thi bnh thng th mt ng dng
trong Windows thng dng con tr chut IDC_ARROW c nh ngha trong
WINUSER.H, im nng chnh l im trn cng ca mi tn. Ngoi ra con tr chut cn cho
bit trng thi ca ng dng, v d mt tig dng ang x l cn mt khong thi gian th
con chut xut hin hnh ng h ct (IDC_WAIT). Khi hu nh cc chc nng giao
tip vi ngi dng iu phi hon n khi x l hon thnh.
Trong lp ca s ta c trng nh ngha con tr chut cho ng dng nh sau
wndclass.hCursor = LoadCursor ( NULL, DC_ARROR);
v i thit b chut ta c th c cc hnh ng nh sau:
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Cc thng ip c to t chut rt khc vi thng ip ca bn phm, mt th tc
ca s s nhn thng ip chut bt c khi no thit b chut di chuyn qua ca s hay kch
vo trong ca s, thm ch c trong trng hp ca s khng c kch hot hay khng nhn
c s quan tm. Windows nh ngha 21 thng ip c pht sinh t thit b chut. Trong
s c n 11 thng ip khng lin quan n vng lm vic (client area). Nhng thng
ip khng phi vng lm vic (nonclient-area messages) thng c cc ig dng b qua
khng x l.
4.3.2.I. Thng ip chut trong vng lm vic
Khi con tr chut di chuyn vo vng lm vic ca mt ca s, th tc ca s ca n
s nhn c thng ip WM_MOUSEMOVE. Bng sau m t cc thao tc lm vic vi
thit b chut v cc thng ip pht sinh t n.
Nt
Nhn
Th
Nhn p
Tri
WMJLBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
Gia
WMJMBUTTONDOWN
WMLMBUTTONUP
WM_MBUTTONDBLCLK
Phi
WM RBUTTONDOWN
WM MBUTTONUP
WM RBUTTONDBLCLK
M K L B U T TO N
M K _ M B rrO N
MK_RBUTTON
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
M K_SHIFT
MK_CONTROL
{
/* C g i phm control */
}
else
{
/* Khng gi phm control */
}
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 n 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 WMJLBUTTONDOWN vo th tc W ndProc 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
WMJLBUTTONDOWN v ca s th hai s nhn c thng ip nh thit b chut
WMJLBUTTONUP. Tuy nhin tnh hung trn s khng xut hin vi hai trng hp ngoi
l sa u :
Trang 113
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
ng thng di v ko ra ngoi vng lm vic ca ca s, th khi ca s v s bt
gi to ca thit b chut to ng thng v c th cho thanh cun cun theo.
Nhn
Th
Nhn p
X x i
WM_NCLBUTTONDOWN
WM_NCLBUTTONUI'
WM_NCLBUTTONDBLCLK
Gia
WM_NCMBUTTONDOWN
WM_NCMBUTTONUP
WM_NCMBUTTC)NDBLCLK
Phi
WMJRBUTTONDOWN
W MNCRBUTTONDOWN
WM_NCRBLTTTONDBLCLK
Trang 114
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
0
TI 8u- h
Giang
Microsoft
Visual c...
J a l X|
rFe Help
My tnh
7
Mngnib
s
Outock
Express
ti
Recycle Bn
&
J start
{
HDC hdc;
Trang 115
NGN NG LP TRNH
WINDOWS
LP TRNH
{
case WMJLBUTTONDOWN:
/* V ng thng t v tr trc n v tr chut hin ti*/
hdc = GetDC ( hWnd );
pen = CreatePen ( PS_SOLID,WIDTH_PEN,Col [ C] );
oPen = ( HPEN ) SelectObject ( hdc.pen );
point.x = LOWORD ( lParam );
point.y = HIWORD ( lParam );
MoveToEx ( hdc, oldPoint.x, oldPoint.y, NULL );
LineTo ( hdc, point.x, point.y );
oldPoint = point;
/* Chn li bt v trc v hy bt v va to*/
SelectObject ( hdc, oPen );
DeleteObject ( pen );
Trang 116
c TRN
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
case WMJRBUTTONDOWN:
/* Chuyn index ca bng mu sang v tr tip theo, nu cui bng mu th quay li mu u tin*/
C = ( iC+1) % ( sizeof ( Col) / sizeof ( COLORREF ));
break;
case WMLMOUSEMOVE:
/* Xut to chut hin thi ln thanh tiu */
sprintf ( str,"Toa do chuot X = %d, To do y = %d", LOWORD(lParam), HIWORD(l Param));
SetWindowText ( hWnd, S);
/* Kim tra xem c gi phm chut tri hay khng*/
{
hdc = GetDC ( hWnd);
pen = CreatePen ( PS_SOLID,WIDTH_PEN,Col [ C ]);
oPen = ( HPEN ) SelectObject ( hdc, pen);
point.x = LOWORD ( lParam);
poit.y = HIWORD ( lParam);
MoveToEx ( hdc, oldPoit.x, oldPoint.y, NULL );
LineTo ( hdc, point.x, point.y);
oldPoint = point;
SelectObject ( hdc, oPen );
DeleteObject ( pen);
ReleaseDC ( hWnd, hdc );
}
break;
Trang 117
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc ( hWnd, message, wParam, lParam);
}
return 0;
4.4. B NH T H I GIAN
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 ch u t. 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.
4.4.1. B nh th i gian v v n n g b
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 118
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
UINTJPTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse,
TIMERPROC lpTimerFunc);
Trong ngha cc tham s c m t:
hWnd : nh danh ca ca s khai bo dng b nh thi gian.
nlDEvent: nh danh ca b nh thi gian.
nElapse : L khong thi gian ngh gia hai ln gi thng ip
lpTimerFunc : Hm s x l khi thng ip WM_TIMER pht sinh, nu chng
ta khai bo l NULL th Windows s gi thng ip WM_TIMER vo hng i thng
ip ca ca s tng ng.
Khi khng cn dng b nh thi gian na hay kt thc Lftig dng ta gi hm
KillTimer, hm ny c khai bo :
BOOL KiUTimer( HWND hWnd, INT_PTR uIDEvent);
{
PAINTSTRUCT ps;
HDC hdc;
static int NumCir = 0;
static POINT point [ MAX_POINT ];
int r = 5, i;
Trang 119
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
x lthng ip*/
switch ( message )
{
case WM_CREATE:
/* Khai bo dng b nh thi gian trong ng dng*/
SetTimer(hWnd, IDTTIMER1, 500, ( TIMERPROC )NULL);
/* Khi ng hm ngu nhin*/
srand ( (unsigned) time( NULL ) );
break;
case WM_PAINT:
hdc = BeginPaint ( hWnd, &ps );
pen = CreatePen ( PS_SOLID, 2, RGB (255,0,0) );
oldPen = (HPEN) SelectObject ( hdc, pen );
/* V cc vng trn vi tm l cc im lu ong point v bn knh l r */
for( i=0; i < NumC; i++ )
Arc ( hdc, point[i].x-r, point[i].y-r, point[i].x+r, point[i].y+r, point[i].x+r, point[i].y,point[i]jc+r,point[i].y);
/* Ly li bt v trc v hy bt v va to*/
SelectObject ( hdc, oldPen );
DeleteObject ( pen );
EndPaint ( hWnd, &ps );
break;
case WM_TIMER:
/* Ly thng tin ca vng lm vic*/
Trang 120
NGN NG LP TRNH
WINDOWS
LP TRNH c TRN
>
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.
Chng trnh khi thc thi s xut ra mt dng ng h in t theo dng : gi :
pht :giy.
Trang 121
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
#indude <time.h>
#indude "stdio.h"
#define IDT_TIMER11
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
PAINTSTRUCT ps;
HDC hdc;
/* Khai bo bin u cc gi tr khng gian*/
struct tm *newtime;
time_t CurTime;
TCHAR s [255];
RECT rc;
/* Bin LOGFONT to font mi*/
LOGFONT lf;
HFONT oldFont, font;
COLORJREF color = RGB (255, 0 ,0), oldColor;
switch ( message)
{
case WM_CREATE:
/* khi to b nh thi gian, v khai bo hm x l Timer*/
SetTimer ( hWnd, IDT_TIMER1, 1000, ( TIMERPROC ) TimerProc);
break;
case WM_PAINT:
hdc = BeginPaint ( hWnd, &ps);
/* Ly gi ng h h thng*/
time( &CurTime);
Trang 122
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
}
Trang 123
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
return 0;
>
/* Hm x l ca Timer*/
VOID CALLBACK TimerProc( HWND hwnd, UINT uMsg, UINTJPTR idEvent, DWORD dwTime)
{
/* Hm ny n gin yu cu t li vng lm vic*/
RECT rc;
GetClientRect ( hwnd, &rc);
InvalidateRect ( hwnd, &rc, TRUE);
Trang 124
LP TRNH c TRN
NGN NG LP TRNH
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 nh 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
x l vn bn l cng vic ph bin nht trong cc thao tc ha. Chng c s
dng theo cc nh dng v cch thc khc nhau trong cc ng dng x l ti liu, bng biu,
c s d liu v h tr thit k bng my tnh (CAD - Computer Aided Design).
Tp hp cc hm Win32 API x l vn bn c phn thnh hai nhm chnh: Nhm
cc hm nh dng chun b cho thao tc xut d liu, v nhm cc hm thc hin thao
tc hin th. Chng ta s bt u vi vic tm hiu cc hm hin th.
5.2.1. H i n th vn b n
hin th ni dung vn bn trn cc thit b xut, da vo tng trng hp th hin
khc nhau, ta dng cc hm Win32 API khc nhau. Cc hm ny ph thuc vo font ch, thuc
tnh ca thit b ng cnh DC (Device Context ) v khong cch k t th hin.
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);
Hm ny thc hin thao tc xut chui k t xc nh bi con IpString ra DC, vi
chiu di c xc nh bi cbString (khng ph thuc vo k t NULL nh du kt thc
chui).
Trang 125
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Hai ng nXStart v nYStart l v tr gc ca chui hin th, xc nh theo ta
logic ca vng lm vic ca s, v thng l im gc trn bn tri ca vng hin th chui.
Chng ta s bn k hn khi tm hiu v canh l vn bn trong phn 5.2.2.
Nu thao tc xut chui thc hin thnh cng, hm tr v gi tr khc 0. Ngc li, gi
tr tr v bng 0.
Khi cn trnh by vn bn theo tun t tng ct, ta dng hm TabbedTextOut sau :
LONG TabbedTextOut(HDC hDC, int nX, int nY, LPCTSTR lpString, int nCount,
int nNumTabs, LPINT lpnTabStopPositions, int nTabOrigin);
Nu trong chui k t c cc k t tab (\t hoc 0x09), hm TabbedTextOut s
chuyn cc k t tab vo dy cc v tr "dng" tng ng. s lng cc tab dng c xc
nh bi nNumTabs, v lpnTabStopPositions l dy v tr cc tab dng theo n v tnh pixels.
V d, nu rng trang bnh ca mi k t l 8 pixels, v mi tab dng cn t cch nhau 5
k t, dy cc tab dng s phi ln lt c gi tr 40, 80, 120....... Tuy nhin, cc gi tr ny
khng nht thit phi l bi s ca nhau.
Nu bin nNumTabs hoc lpnTabStopPositons c gi l 0 v NULL, cc tab dng
c t cch nhau tng 8 k t. Nu nNumTabs bng 1, lpnTabStopPositions tr n gi tr
xc nh mt dy tng tun hon l bi s ca dy ny. V d, nu nNumTabs bng 1, v
lpnTabStopPositions bng 30, ta s c dy tab dng ti v tr 30, 60, 90, ... pixels.
Trng nTabOrigin xc nh ta theo trc X ca im bt u tnh khong cch ti
cc tab. Gi tr ny khng nht thit phi l v tr u tin ca chui, c th chn trng hoc
khng.
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.
Mt hm xut vn bn khc tng t hm TextOut l hm ExtTextOut :
BOOL ExtTextOut(HDC hDC, int X, int Y, UINT fuOptions, CONST RECT *lprc,
LPCTSTR lpString, UINT cbCount CONST INT *lpDx);
Bin lprc l mt con tr n cu trc RECT, trong ni dung vn bn hin th s b
ct vo vng hnh ch nht tng ng nu fuOpons c thit lp l ETO_CLIPPED, hoc
l vng nn hnh ch nht s c t bi mu nn nu fuOptions ia ETO_OPAQUE.
Trng lpDx l mt dy s nguyn xc nh khong cch gia cc k t lin tip trong
chui. N cho php mt chng trnh to khong cch rng hoc hp gia cc k t, iu m
i lc cn thit trong vic iu chnh cc t trong vn bn theo rng ct. Gi tr lpDx c
th l NULL tng ng vi ch mc nh cho khong cch ny.
Tng t hm TextOut, hm ExtTextOut v gi tr khc 0 nu thnh cng. Ngc
li, gi tr tr v bng 0.
Trang 126
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Mt hm mc mc cao hn xut vn bn l hm DrawText :
int DrawText(HDC hDC, LPCTSTR lpString, int nCount, LPRECT IpRect, UINT
uFormat);
Cng nh cc hm xut vn bn khc, hm DrawText xut chui xc nh bi con tr
lpString c di nCount. Tuy nhin, vi chui c k t kt thc l NULL, nu nCount bng
-1, hm s t ng tnh ton chiu di ca chui.
Bin lpRect tr n cu trc RECT ca hinh ch nht (theo to logic) m trong
vn bn th hin theo nh dng c thit lp trong uFormat.
Nu uFormat bng 0, ni dung vn bn s c hin th theo tng dng t trn xung
di. Mi dng mi c xc nh thng qua k t v u dng CR (carriage return, bng
\r hoc OxOD) hoc k t xung dng LF (linefeed, bng \n hoc OxOA) co trong vn bn.
Phn vn bn bn ngoi hnh ch nht lpRect s b ct b.
Gi tr uFormat bng 0 cng chnh l gi tr c canh l tri (DT_LEFT). Ngoi ra, ta c
th thit lp cc c canh l phi (DT_RIGHT), v canh l gia (DT_CENTER) cho vn bn.
loi b chc nng iu khin ca cc k t CR v LF, cn thm vo c
DT_SINGLELINE. Nu thit lp DT_SINGLELINE, ta cng c th ch nh v tr ca dng
hin th pha trn (DT_TOP), pha di (DT_BOTTOM), hoc chnh gia
(DT_VCENTER) trong vng hnh ch nht.
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_WORDRRRAK. Neu khng mnn Windows r t h cc phn rlra khi v rh v t 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 d n g vn b n
Da vo c trng cc thnh phn hin th, cc hm nh dng vn bn phn lm ba
nhm lin quan n thuc tnh ca DC, rng k t v kch iuc chui k t hin th.
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 :
COLORREF SetTextColor(HDC hDC, COLOREF crColor);
Trang 127
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
COLORREF SetBkColor(HDC hDC, COLORREF crColor);
Bin crColor xc nh mu cn thit lp. Nu thnh cng, hm tr v mu ch (mu
nn) trc khi c thit lp. Nu khng, hm tr v gi tr c CLR_INVALID. Ngoi ra,
xc nh mu ch v mu nn hin hnh, ta dng hai hm sau :
COLORREF GetTextColor(HDC hDC);
COLORREF GetBkColor(HDC hDC);
Nu hm thc hin thnh cng, ta xc nh c mu hin hnh. Nu khng, gi tr tr
v l CLRJNVALID.
Khi v ch, Windows s dng hai ch : ch trong sut (TRANSPARENT) v
rh m (OPAQUF,). rh trong sut, mu nn s khng r s dng n, rh v
ra ln nn hin hnh. ch m, trc khi v ch, nn s c xo i vi mu nn
c thit lp bi hm SetBkColor:
int SetBkColor(HDC hDC, int iBkMode);
v i iBkMode l ch nn TRANSPARENT hoc OPAQUE (ch mc nh ca
Windows l OPAQUE). Nu thnh cng, hm tr v ch nn trc khi c thit lp.
Ngc li, gi tr tx v l zero. bit ch nn hin ti, ta dng hm :
int GetBkMode(HDC hDC);
Hm tr v gi tr TRANSPARENT hoc OPAQUE, nu thnh cng. Ngc li, gi tr
tr v l zero.
xc lp v tr chui vn bn hin th da trn im gc nXStart, nYStart (xem phn
5.2.1) ta dng hm SetTextAlign :
UINT SetTextAlign(HDC hDC, UINT fMode);
Khi , im gc nXStart cnh bn tri khung ch nht nu fMode l TA_LEFT. K
t u chui s hin th t im gc ny. y cng l gi tt mc nh ca Windows. Nu
fMode bng TA_RIGHT, v chui c tnh t bn phi, tc k t cui chui hin th ti
im gc, v ngc li cho n k t u tin. Nu fMode bng TA_CENTER, v tr gia
chui chnh l im gc.
Tng t, thit lp v tr hin th chui theo phng ng, cc c TA_TOP,
TA_BOTTOM, v TA_BASELINE c dng tng ng im gc nYStart trn, gia v
di dng vn bn hin th. i vi Windows th gi tr mc nh theo phng ng l
TA_TOP.
Nu gi hm SetTextAlign vi c TA_UPDATE, Windows s khng s dng im
gc nXStart, nYStart trong hm xut vn bn TextOut, thay vo l v t c thit lp
trc bi hm MoveToEx hoc LineTo, hoc mt hm thay i v khc, c
Trang 128
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
TA_UPDATE cng cp nht im gc v u chui (nu dng TA_LEFT) v v cui chui
(nu dng TA_RIGHT) cho ln gi k tip. iu ny cn thit cho vic hin th nhiu dng
vn bn vi hm Textut. Nu c TA_CENTER c thit lp, v tr ca nXStart vn nh
c sau khi hm TextOut c gi.
bit ch canh l vn bn hin ti, ta dng hm :
UINT GetTextAIign(HDC hDC);
Nu thnh cng, hm tr v c tng ng ca canh l vn bn hin hnh. Ngc li,
gi tr tr v l GDI_ERROR.
V d sau y trnh by cch thc xc nh cc dng canh l theo phng ngang:
switch ( (TA LEFT I TA RIGHT I TA CENTER) & GetTextAlign(hDC) )
{
case TA_LEFT:
case TA_RIGHT:
case TA_CENTER:
}
V d tip theo s dng hm SetTextAlign cp nht v tr hin th hin thi khi
hm TextOut c gi. Trong v d ny, bin cArial l mt s nguyn cho bit s font Arial.
UINT uAlignPrev;
char szCount[8];
Trang 129
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
uAlignPrev = SetTextAlign(hdc, TA_UPDATECP);
MoveToEx(hdc, 10, 50, (LPPOINT) NULL);
TextOut(hdc, 0, 0, "Number of Arial fonts: ", 23);
itoa(cArial, szCount, 10);
TextOut(hdc, 0, 0, (LPSTR) szCount, strlen(szCount));
SetTextAlign(hdc, uAlignPrev);
5.3. FONT CH
Trong Windows, khi trnh bv 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.
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Loi ch xc nh m nht (trng lng) v nghing ca dng font th hin.
Chia lm ba loi sau : roman, opaque, v Italie. Font roman l dng font ch c trng lng
trung 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.
Kch thc font ch c tnh nh l khong cch t chn di ca mt k t c
chn n chn trn ca mt k t hoa, v c tnh theo n v im (khong 0,013817 ca 1
inch).
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 h xut tng ng, v d my in. Khng nh font GD, khi in hng font thit h,
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 n pixel, c li im l hin th nhanh, nhulng 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 m i cho lm.
Font TnipTypp l dng font r s d n g ph hin nht hin nay, c llrti tTrli
FONT
ANSIJFIXEDJFONT
Trang 131
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
ANSI_VAR_FONT
DEVTCE_DEFAULT_FONT
DEFAULT_GUI_FONT
OEMJFIXEDJFONT
SYSTEM_FONT
SYSTEM_FIXED_FONT
Trang 132
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
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). Lull , 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.
BOOL GetTextMetrics(HDc hDC, LPTEXTMETRIC lpTM);
Bin lpTM l con tr n cu trc TEXTMETRIC m nu hm thc hin thnh cng
(tr v gi tr nonzero) s cha cc tham s ca font.
on chng nh sau minh ha vic chn font nh sn vo mt DC, sau vit mt
rhtii k t s dng font ny.
HFONT hfnt, hOldFont;
hfnt = GetStockObject(ANSI_VAR_FONT);
if (hOldFont = SelectObject(hdc, hfnt))
{
TextOut(hdc, 10, 50, "Sample ANSI_VAR_FONT text.", 26);
SelectObject(hdc, hOldFont);
}
Tuy nhin, font ch h thng kh ngho nn, khng p ng nhu cu trnh by vn
bn. V th, Windows h tt cc hm s dng cc font ch t to. Phn tip theo s bn k
hn v cc hm x l cc font ny.
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Chn font trong hp thoi Font, hm ChooseFont s khi gn cc gi tr trong
cu trc LOGFONT theo thuc tnh font c chn.
s dng font ny trong cc thao tc xut vn bn, trc ht ng dng cn khi to
font logic, ri chuyn cho DC. Vic to font logic c thc hin bng cch gi hm
CreateFont hoc hm CreateFontlndirect. Tuy nhin, hm CreateFont t c s dng hn
do hm cn gi cc bin trong cu trc LOGFONT, trong khi hm CreateFontlndirect ch
cn bin con tr LOGFONT. c hai hm u tr v handle ca font logic HFONT.
Trc khi ng dng c th xut vn bn, font logic cn c nh x tng hg vi
mt font vt l ong thit b xut, hoc font np vo h iu hnh. Tin trnh ny c thc
hin khi ng dng gi hm SelectObject. Khi , ta c th dng hm GetTextMetrics (hoc
cc hm tng ng) xc nh kch thc v c truhg ca font thc tnh v tr v xut
vn bn ra thit b xut.
Sau khi dng font, ta cn loi b font dng hm DeleteObject. Ch khng c xo
font trong DC ang thc thi, hoc font h thng.
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;
lstrcpy(plf->lfFaceName, "Arial");
plf->lfWeight = FW_NORMAL;
Trang 135
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
{
plf->lfEscapement = angle;
hfnt = CreateFontlndirect(plf);
hfntPrev = SelectObject(hdc, hfnt);
TextOut(hdc, rc.right/2, rc.bottom/2, IpszRotate, Lstrlen(lpszRotate));
SelectObject(hdc, hfntPrev);
DeleteObject(hfnt);
}
// Chuyn ch hin th v li dng OPAQUE.
SetBkMode(hdc, OPAQUE);
// Gii phng vng nh cp ph cho cu trc LOGFONT.
LocalFree((LOCALHANDLE) plf);
Gi tr
FW_DONTCAKE
FWJTHIN
100
FW EXTRALICHT
200
FW_ULTRALIGHT
200
FW LIG H T
300
Trang 136
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
FW.NORMAL
400
FW REG U LA R
400
FW_MEDIUM
500
FW_SEMIBOLD
600
FW_DEMIBOLD
600
FW_BOLD
700
FW EXTRABOLD
800
FW_ULTRABOLD
800
FW H EA V Y
900
FW_BLACK
900
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
LONG tmExtemalLeading;
LONG tmAveCharWidth;
LONG tmMaxCharWidth;
LONG tmWeight;
LONG tmOverhang;
LONG tmDigitizedAspectX;
LONG tmDigitizedAspectY;
BCHAR tmFirstChar;
BCHAR tmLastChar;
BCHAR tmDefaultChar;
BCHAR tmBreakChar;
BYTE tmltalic;
BYTE tmUnderlined;
BYTE tmStruckOut;
BYTE tmPitchAndFamily;
BYTE tmCharSet;
} TEXTMETRIC;
Trang 138
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
trng hp ch m, Windows s m rng tng k t. Khi , tmAveCharVVidth ca k t
bnh thng bng tmAveCharWidth tr i ln tmOverhang ca k t m.
Trng tmDigitizedAspectX v tmDigitizedAspectY xc nh t l co ca font. Chng
ta cng c th xc nh chng bng hm GetDeviceCaps (xc nh cc thng tin thit b) vi
cc thong s ca nlndex l LOGPIXELSX v LOGPIXELSY.
int GetDeviceCaps(HDC hDC, int nlndex);
Trng tmFirstChar xc nh gi tr k t u tin ong font, tmLastChar xc nh gi
tr k t cui cng. Nu gi hm GetTextMetricsW, gi tr ny s ln hn 255. Trng
tmDefaultChar cha gi tr Windows dng hin th cc k t khng tn ti trong b font,
thng l hnh ch nht. Trng tmBreakChar c dng ngt t khi canh chnh vn bn.
Nu khng dng cc font c bit, v d font EBCDIC, gi tr ny chnh l gi tr k t
khong trng (m hng 32).
Cc trng tmWeight, tmltalic, tmUnderlined, tmStruckOut, tmCharSet v
tmPitchAndFamily ging cc trng lfWeight, lfitalic, lfUnderline, IfStrikeOut, lfCharSet v
lfPitchAndFamily trong cu trc LOGFONT.
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
LP ARAM ICustData;
LPCFHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
HINSTANCE hlnstance;
LPTSTR IpszStyle;
WORD nFontType;
W O RD ___MISSING_ALIGNMENT__;
I NT nSizeMin;
INT nSizeMax;
} CHOOSEFONT;
Trang 140
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
CF_BOTH
CF_TTONLY
Xc nh hm ChooseFont ch qun l
v chn la trn font dng TrueType.
CFJEFFECT
CF_ENABLEHOOK
CFJENABLETEMPLATE
Ch ra trng hlnstance v
lpTemplateName xc nh hp thoi mu s
dng mc nh.
CF_ENABLETEMPLATEHANDLE
CF_FORCEFONTEXIST
Xc nh hm ChooseFont s ch ra li
nu ngi dng c chn font hoc kiu khng
tn t i
CFJNITTOLOGFONTSTRUCT
Xc nh hm ChooseFont phi s
dng cu trc LOGFONT qua trng
lpLogFont khi to hp thoi.
CF_LIMITSIZE
CFJNOOEMFONTS
Ging c CF_NOVECTORFONTS.
Trang 141
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
CF_NOFACESEL
CF_NOSCRIPTSEL
CF_NOSTYLESEL
CF_NOSIZESEL
CF_NOVECTORFONTS
CF_NOVERTFONTS
CF_PRINTERFONTS
CF_SCALABLEONLY
CF_SCREENFONTS
CF_SHOWHELP
CF_USESTYLE
Trang 142
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
Font ch m. Gi tr ny c lp
li trong trng lfWeight ca cu trc
LOGFONT, va bng FWJBOLD.
ITALIC_FONTTYPE
Font ch nghing. Gi tr ny c
lp li trong trng lfitalic ca cu trc
LOGFONT.
PRINTERJFONTTYPE
REGULAR_FONTTYPE
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
SIMULATED FONTTYPE
{
CHOOSEFONT cf;
LOGFONT lf;
HFONT hfont;
//K hi to cc trng trong cu trc CHOOSEFONT.
cf.IStructSize = sizeof(CHOOSEFONT);
cf.hwndOwner = (HWND)NULL;
cf.hDC = (HDC)NULL;
cf.lpLogFont = 8df;
cf.iPointSize = 0;
cf.Flags = CF_SCREENFONTS;
Trang 144
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
cf.rgbColors = RGB(0,0,0);
cf.lCustData = OL;
cf.lpfnHook = (LPCFHOOKPROC)NULL;
cf.lpTemplateName = (LPSTR)NULL;
cf.hlnstance = (HINSTANCE) NULL;
cf.lpszStyle = (LPSTR)NULL;
cf.nFontType = SCREENJFONTTYPE;
cf.nSizeMin = 0;
cf.nSizeMax = 0;
//H in th hp thoi font.
ChooseF ont(&cf);
/* To font logic da trn cc chn la ca ngi dng v tr v handle ca font logic */
hfont = CreateFontlndkect(cf.lpLogFont);
return (hfont);
Trang 145
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
Trang 146
NGN NG LP TRNH
WINDOWS
LP TRNH c TRN
Trang 147
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
Chng 6
HA V CC I TNG GDI
6.1. M U
Windows cung cp mt tnh nng rt c sc, l kh nng ha c lp thit b
c xy dng trn k thut GDI (giao din giao tip vi cc thit b ha khc nhau). GDI
l th vin ha ca Windows, cung cp tt c hm phc v cho cc thao tc kt xut hnh
nh v vn bn ra thit b.
GDI c th v ra nhiu loi thit b khc nhau:
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.
Chng ny s trnh by cc khi nim c s v GDI nh device context, cc hm GDI
c s v v t, cc hm np v zoom nh bitmap. Phn cui chng s trnh by cch
ly v handle device context ca my in v mt s hm c s s dng cho vic iu khin in
n.
Trang 148
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Tm li, Windows cung cp kh nng s dng cng mt hm kt xut ra nhiu
thit b khc nhau. iu ny lm cho chng trnh c lp vi thit b.
V d 2 : v hnh ch nht
HDC hDC;
HPEN hPen, oldHPen;
/* Ly v device context ca ca s */
hDC=GetDC(hWnd);
/* To bt v mi vi nt lin, dy 5, mu xanh */
hPen=CreatePen(PS_SOLID, 5, RGB(0, 0, 255;
/* Chn bt v hin hnh l bt v mi v lu li bt v c */
oldHPen=(HPEN)SelectObject(hDC, hPen);
/* V hnh ch nht */
Rectangle(hDC, 20, 2 0 ,100, 100);
/* Restore li bt v c */
Trang 149
NGN NG LP TRNH
WINDOWS
LP TRNH c TRN
SelectObject(hDC, oldHPen);
/* Gii phng bt v to ra */
DeleteObject(hPen);
/* Gii phng device context */
ReleaseDC(hWnd, hDC);
//X l...........
EndPaint(hWnd, &ps);
//X l...........
ReleaseDC(hWnd, hDC);
//X l...........
ReleaseDC(hWnd, hDC);
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Memory device context(MDC)l mt device context o khng gn vi mt thit b
xut c th no. Mun kt qu kt xut ra thit b vt l ta phi chp MDC ln mt device
context tht s(device context c lin kt vi thit b vt l). MDC thng c dng nh
mt device context trung gian v trc khi thc s xut ra thit b, nhm gim s chp
git nu thit b xut l window hay mn hnh.
to MDC tng thch vi mt hDC c th, s dng hm CreateCompatibleDC:
HDC hMemDC;
hMemDC = CreateCompatibleDC(hDC);
n gin hn, c th t NULL vo v tr hDC, Windows s to mt device context
tng thch vi mn hnh.
Hy MDC bng hm DeleteDC.
MDC c b m t hin th nh mt thit b tht. Tuy nhin, b mt hin th ny lc u
rt nh, ch l mt pixel n sc. Khng th lm g vi mt b m t hin th ch gm 1 bt nh
vy. Do cn lm cho b m t hin th ny rng hn bng cch chn mt i tng bitmap
GDI vo MDC:
SeIectObject(hMemDC, hBitmap);
Ch c th chn i tng bitmap vo MDC, khng th chn vo mt device context
c th c.
Sau khi chn mt i tng bitmap cho MDC, c th dng MDC nh mt device
context tht s.
Sau khi c hon tt trong MDC, nh c a ra device context tht s bng hm
BitBIt:
BitBIt(hDC, xDest, yDest, nWidth, nHeight, hMemDC, xSource, 3'Source);
V' d : Chun b nh trc khi a ra mn hnh, trnh gy chp mn hnh trong thng
ip WM_PAINT.
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
//L y v kch thc vng client ca ca s hin hnh
RECT rect;
GetClientRect(hWnd, &rect);
Trang 151
NGN NG LP TRNH
WINDOWS
LP TRNH
SetPixel(hMemDC, 0, 0, RGB(255,0,0));
MoveToEx(hMemDC, 50, 50, NULL);
LineTo(hMemDC, 100,100);
Rectangle(hMemDC, 10,10,100,100);
TextOut(hMemDC, 15,15, "Testing MDC", 11);
If (!BitBlt(hdc, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0, SRCCOPY))
MessageBox(hWnd, "Failed to transfer bit block", "Error",MB_OK);
//P hc hi li bitmap c cho MDC
SelectObject(hMemDC, oBitmap);
// Gii phng MDC, bitmap to
DeleteD c (liMemDC);
DeleteObject (bitmap);
EndPaint(hWnd, &ps);
break;
6.3. M T S HM HA c S
Trang 152
c TRN
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
s dng cc hm ha c s, ta c th nh by cc i tng vn bn, hnh nh ...
trn ng dng. Gm cc nhm hm v vn bn (text), bt v, min t, v nh bitmap.
Cc hm v vn bn c trnh by ong chng trc. y s trnh by cc
nhm hm cn li.
6.3.1. Nhm hm v
ODCOLORREF GetPixel(HDC hDC, int nXPos, int nYPos);
Ly v gi tr mu ti v tr (nXPos, nYPos) ca hDC, tr v -1 nu im ny nm
ngoi vng hin th.
COLORREF SetPixel(HDC hDC, int nXPos, nt nYPos, COLORREF clrRef);
V mt im mu clrRef ti v tr (nXPos, nYPos) ln hDC. Gi tr tr v l mu ca
im (nXPos, nYPos) hoc -1 nu im ny nm ngoi vng hin th.
DWORD MoveToEx(HDC hDC, int X, int y);
Di chuyn bt v n ta (x, y) n hDC. Gi tr tr v l ta c ca bt v, X =
LOWORD, y = HIWORD.
BOOL LineTo(HDC hDC, int xEnd, int yEnd);
V on thng t v tr hin hnh n v tr (xEnd, yEnd) trn hDC. Hm tr v TRUE
nu thnh cng, FALSE nu tht bi.
BOOL Polyline(HDC hDC, const POINT FAR *lpPoints, int nPoints);
V ng gp khc ln hDC bng cc on thng lin tip, s nh l nPoints vi ta
cc nh c xc nh trong lpPoints. Hm tr v TRUE nu thnh cng, FALSE nu tht
bi.
BOOL Polygon(HDC hDC, const POINT FAR *lpPoints, int nPoints);
V a gic c nPoints nh, ta cc nh c xc nh bi lpPoints. Hm tr v
TRUE nu thnh cng, FALSE nu tht bi.
BOOL Rectangle(HDC hDC, int left, int top, int right, int bottom);
V hnh ch nht c ta l left, top, right, bottom ln hDC.
HPEN CreatePen(int penStyle, int penWidth, COLORREF penColor);
Trang 153
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
To bt v c kiu penStyle, dy nt v l penWidth, mu penColor. Hm tr v
handle ca bt v nu thnh cng v tr v NULL nu tht bi. Cc gi tr ca penStyle nh
sa u :
Gi tr
Gii thch
PS_SOLID
PSJDASH
PSJDOT
PS_DASHDOT
PS_DASHDOTDOT
PS_NULL
Khng hin th
PSJNSIDEFRAME
V' d : To bt v mi v dng bt v ny v mt s ng c s.
HDC hDC;
POINT PointArr[3];
HPEN hPen, hOldPen;
hDC = GetDC(hWnd);
PointArr[0].x = 50;
PointArr[0].y = 10;
PointArr[l].x = 250;
PointArr[l].y = 50;
PointArr[2].x = 125;
PointArr[2].y = 130;
// V mt ng gp khc bng Pen hin hnh
Polyline(hDC, PointArr, 3);
//To Pen mi c nt in, dy 1, mu xanh
Trang 154
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
hPen = (HPEN)CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
//Chn bt v mi cho hDC ca window
SelectObject(hDC, hOldPen);
//Xo bt v mi to v gii phng hDC
DeleteObject(hPen);
ReleaseDC(hWnd, hDC);
6.3.2. Nhm hm m in
HBRUSH CreateSolidBrush(COLORREF cRef);
To mu t c vi mu cRef.
HBRUSH CreateHatchBrush(int bStyle, COLORREF cRef);
To mu t dng li kiu bStyle vi mu cRef.
Cc kiu bstyle :
HS_HORIZONTAL
HS_VERTICAL
HS_FDIAGONAL
HS_BDIAGONAL
HS_CROSS
HS_DIAGCROSS
BOOL FloodFill(HDC hDC. int xStart, int yStart, COLORREF cRef);
T mu mt vng kn, mu ng bin l cRef.
Trang 155
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
BOOL ExtFloodFiU(HDC hDC, int xStart, int yStart, COLORREF cRef, UINT
ffflStyle);
T mu mt vng kn, fillStyle quyt nh cch t :
o FLOODFILLBORDER : T mu vng c mu ng bin l cRef.
o FLOODFILLSURFACE : T vng c mu cRef.
V' d : s dng cc mu c sn v to cc mu t mi t.
HDC hDC;
HPEN hPen;
HBRUSH hBrush, hOldBrush;
hDC = GetDC(hWnd);
//V hai hnh ch nht vi bt v Black
hPen = (HPEN)GetStockObject(BLACKJPEN);
SelectObject(hDC, hPen);
Rectangle(hDC, 10,10, 50, 50);
Rectangle(hDC, 100,100, 200, 200);
//Dng mt trong cc mu t c sn t hnh
hBrush = (HBRUSH)GetStockObject(GRAY_BRUSH);
SelectObject(hDC, hBrush);
FlooFilI(hDC, 30, 30, RGB(0,0,255));
//T o mu t mi t hnh th hai
DeleteObject(hBrush);
Trang 156
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
ReleaseDC(hWnd, hDC);
RECT rect;
GetCIientRect(hWnd, &rect);
//L y v handle device context ca ca s
HDC hdc;
hdc = GetDC(hWnd);
//To MDC tng thch vi hDC ca ca s
HDC hMemDC;
hMemDC = CreateCompatibleDChdc);
HBITMAP hNewBmp.hOldBmp;
//N p bitmap resource c ID l IDB_CUB
{
//Gn bitmap mi cho MDC
Trang 157
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
hOldBmp = (HBITMAP)SelectObject(hMemDC,hNewBmp);
//Copy bitmap t MDC sang DC
}
//Phc hi li bitmap c cho MDC
SelectObject(hMemDC, hOldBmp);
//Gii phng bitmap va to v MDC, hdc
DeleteObject(hNewBmp);
DeleteDC(hMemDC);
ReleaseDC(hdc);
Trang 158
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
0 Bng mu 1 dng cho ca s 1. c a s 1 ang active nn cc mu ca bng mu 1
c nh x trc tip vo bng mu h thng.
0 Bng mu 2 dng cho ca s 2. c a s 2 khng active nn cc mu 0,2,4,5,6 c
nh x vo cc v tr cn trng trn bng mu h thng; cc mu cn li c nh x vo
nhng mu gn ging nht ca bng mu h thng.
c u trc BITMAPFILEHEADER
Tn trng
Kch thc
bfType
2 bytes(WORD)
bfSize
4 bytes(DWORD)
bfReservedl
2 bytes(WORD)
Khng dng(=0)
bfReserved2
2 bytes(WORD)
Khng dng(=0)
bfOffBits
4 bytes(DWORD)
ngha
Loi file(=BM)
Kch thc ile(bytes)
Cu trc BITMAPINFO
Tn trng
Kiu
ngha
bmiHeader
Cc thng s nh bitmap
bmiColors
RGBQUAD*
Bng mu ca nh.
Cu trc BITMAPINFOHEADER
Tn trng
Kiu
ngha
biSize
DWORD
biWidth
LONG
Trang 159
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
biHeight
LONG
biPlanes
WORD
s plane. Lun = 1.
biBitCount
WORD
biCompression
DWORD
biSizelmage
DWORD
biXPelsPerMeter
LONG
biYPelsPerMeter
LONG
biClrUsed
DWORD
biClrlmportant
DWORD
Cu trc RGBQUAD
Trang 160
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
bmiColors l mt mng kiu RGBQUAD, cha cc gi tr mu dng cho nh, y
chnh l bng mu ca nh. s lng phn t ca bmiColors bng s mu ca nh.
bmiColors ch dng cho nh en trng, 16 mu v 256 mu; khi phn d liu nh cho mi
pixel ch l cc index n 1 v tr trong bng mu ny. i vi nh 16 bits v 24 bits mu, gi
tr bmiColors=NULL, bng mu khng c s dng na. Trong trng hp ny, nu nh l
16 bits th mi pixel s c biu din bng 1 WORD trong phn d liu nh, 5 bits thp
nht s lu gi tr mu Blue, 5 bits k s lu gi tr mu Green, v 5 bits sau cng lu gi tr
mu Red, bit cao nht khng c s dng (L do l nh dng 16 bits biu din RGB, ta
chia u cho 3 sc nn mi sc R, G, B s c 5 bits biu din v d ra 1 bit). nh
24 bits th dng 3 bytes biu din cho 3 sc RGB cho mi pixel trong phn d liu nh.
Tn trng
Kiu
ngha
rgbRed
BYTE
rgbGreen
BYTE
rgbBlue
BYTE
rgbReserved
BYTE
Khng dng
Trang 161
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
0 i palette mu cho thit b xut, s dng cc hm SelectPalette, RealizePalette.
0
V d : Np nh bitmap t file.
void LoadBmp(char *bmpFN, HDC hdc, RECT rect)
{
try
{
int FHandle;
BITMAPFILEHEADER bmpfh;
HANDLE hBmp, hBuff;
BITMAPINFO *BmpInfo;
unsigned char *Buff;
int Count,NumColor;
long n, BytesPerLine;
Count=0;
SetCursor(LoadCursor(NULL, IDC_WAIT));
//Aid file binap c
tf ((FHandle=open(bmpFN, 0_BINARY|0_RD0NLY))==-1)
tlirow "Cannot open the file.";
// c header file bitmap
Trang 162
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
if (Bmpnfo->bmiHeader.biCompression != BI_RGB)
throw "Program don't support compressed bitmap file.";
//X c nh s mu ca palette
NumColor=(int)pow(2,BmpInfo->bmiHeader.biBitCount);
if(NumColor>256)
throw "The program supports 256 colors bitmap file only.";
//X c nh s byte cho 1 scanline
BytesPerLine=(bmpfti.bfSize-bmpfh.bfOffBits)/
BmpInfo->bmiHeader.biHeight;
/* Cp nht thng tin kch thc nh trn BITMAPINFO (hin ti = 0 nu nh khng nn) */
BmpInfo->bmiHeader.biSizeImage=bmpfh.bfSize-bmpfli.bfOfBits;
// c ni dung file bitmap
hBuff=GlobalAlloc(GMEM_MOVEABLE,
BmpInfo->bmiHeader.biSizeImage);
Buff=(unsigned char *)GlobalLock(hBuff);
If (!Buff) throw "Cannot read the bitmap data.";
// c tng dng trn file
do
{
n = read(FHandle,Buff,BytesPerLme);
Buff+=n;
Count++;
}while (Count<BmpInfo->bmiHeader.bLHeight);
dose(FHandle);
GlobalUnlock(hBuff);
GlobalUnlock(hBmp);
Trang 163
NGN NG LP TRNH
WINDOWS
LP TRNH
SetCursor(LoadCursor(NULL, IDC_ARROW));
/*---------------- To palette mu cho nh Bitmap-------------------- */
HANDLE hMemPal;
LOGPALETTE far *logPal;
HPALETTE hPal;
int i;
hMemPal=GlobalAlloc(LMEM_MOVEABLE, sizeof(LOGPALETTE)
+NumColor*sizeof(PALETTEENTRY));
logPal=(LOGPALETTE far *)GlobalLock(hMemPal);
//S mc trong Palette
logPal->palNumEntries=NumColor;
logPal->palVersion=0x300;
//Gn cc gi tr mu RGB cho nhng Entty trong Palette
{
logPal->palPalEntry[i].peRed=Bmplnfo->bmiColors[i].rgbRed;
logPal->palPalEntry[i].peGreen =
BmpInfo->bmiColors[i].rgbGreen;
logPal->palPalEntiy[i].peBlue =
BmpInfo->bmiColors[i] .rgbBlue;
logPal->palPalEntry[i].peFlags = PC_RESERVED;
}
// To handle cho Palette
hPal=CreatePalette(logPal);
GlobalUnlock(hMemPal);
GlobalFree(hMemPal);
If (!hPal) throw "Cannot create palette.";
Trang 164
c TRN
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
SelectPalette(hdc,hPal, FALSE);
RealizePalette(hdc);
BmpInfo=(BITMAPINFO *)LocalLock(hBmp);
Buff=(unsigned char *)GlobalLock(hBuff);
//To bitmap
hBmp=CreateDIBitmap(hdc,(BITMAPINFOHEADER *)BmpInfo, CBMJNIT, Buff, (BITMAPEVFO
*)BrnpInfo,DIB_RGB_COLORS);
GlobalUnlock(hBuff);
GlobalUnlock(hBmp);
GlobalFree(hBuff);
GIobalFree(hBmp);
SetCursor(LoadCursor(NULL, IDC_ARROW));
if(!hBmp) throw "Cannot create bitmap.";
/*---------------------- Hin th bitmap ln ca s- -------------------------*/
HDC hMemDC;
HANDLE OldBmp;
//T o MDC
hMemDC=CreateCompatibIeDC(hdc);
SelectPalette(hMemDC, hPal, FALSE);
// Tr v palette h thng
UnrealizeObject(hPal);
//M ap li palette
RealizePalette(hdc);
SelectPalette(hMemDC, hPal, FALSE);
Trang 165
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
//L in k t hMemDC vi nh bitmap
01dBmp=Select0bject(hMemDC, hBmp);
//
Select0bject(hMemDC,01dBmp);
DeleteD c (hMemDC);
}
catch(char *e)
{
MessageBox(NULL, e, "Error", MB_OK|MB_ICONERROR);
>
>
6.3.3.2. Zoom nh
Thao tc zoom nh i hi phi c hai MDC, mt MDC ngun copy nh vo, mt
MDC ch lu nh c zoom t MDC ngun.
Hnh 6.4 S tng qut quy trnh zoom nh bitmap
RECT rect;
GetCIientRect(hWnd, &rect);
//L y v handle device context ca ca s
HDC hdc;
hdc = GetDC(hWnd);
//
Trang 166
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
hSourceMemDC = CreateCompatibleDC(hdc);
hDestMemDC = CreateCompatibleDC(hdc);
//N p bitmap cn load va to m t bitmap rng tng thch hdc
HBITMAP hBmp,h01dBmp,hBlankBmp,h01dBlankBmp;
hBmp = LoadBitmap(hInst, MAKEBNTRESOURCE(IDB_CUB));
hBlankBmp = CreateCompatbleBittnap(hdc,rect.right,rect.bottom);
if(hBmp && hBlankBmp && hSourceMemDC && hDestMemDC)
{
//
hOldBlankBmp =(HBITMAP)SelectObject(hDestMemDC,hBlankBmp);
//L y v thng tin ca nh
BITMAP bmplnfo;
GetObject(hBmp, sizeof(BITMAP),(BITMAP *)&bmpInfo);
//Z oom nh t M D C ngun sang MDC ch
}
//
SelectObject(hSourceMemDC, hOldBmp);
DeleteObject(hBmp);
SelectObject(hDestMemDC, hOldBlankBmp);
DeleteObject(hBlankBmp);
DeleteDC(hSourceMemDC);
Trang 167
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
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 nn n gin,
tng t vic v ra cc hp thoi trn mn hnh.
v i c ch ny, ngi lp trnh khng cn quan tm n vic my in ang s dng l
my in hiu g, loi no... Cc Windows printer device driver s m nhn vic chuyn d
liu cn in sang dng ph hp vi my in hin hnh.
Tin trnh in n trn Windows bao gm cc bc sau:
Trang 168
NGN NG LP TRNH
WINDOWS
LP TRNH
{
char pmlnfo[200];
GetProfileStringC'windows", "device", "NoPrinter", prnlnfo, 200);
If ( stranp(pmInfo, "NoPrinter") )
{
char pmName[100], pmDriver[100], pmPort[100];
char seps[10];
char *token;
strcpy(seps,",");
token = strtok(prnInfo, seps);
strcpy(pmName, token);
token=strtok(NULL, seps);
strq)y(pmDriver, token);
token=strtok(NULL, seps);
strq)y(prnPort, token);
HDC pmDC;
pmDC=CreateDC(pmDriver, pmName, prnPort, NULL);
if(pmDC)
{
StartDoc(pmDC, NULL);
StartPage(prnDC);
TextOut(pmDC, 100,100, "Your message here:", 18);
TextOut(pmDC, 100, 200, msg, strlen(msg));
TextOut(pmDC, 100, 300, "End of printing", 15);
EndPage(pmDC);
Trang 169
c TRN
NGN NG LP TRNH
WINDOWS
LP TRNH c TRN
EndDoc(pmDC);
DeleteDC(pmDC);
}
}
}
6.4.1.2. s dng hp thoi Print
Mt cch khc n gin hn ly v handle device context ca mt my in bt k
thay v my in mc nh l s dng hp thoi in chun ca Windows.
Hp thoi in chun c kch hot bng hm PrintDlg (hm ny c nh ngha
trong module COMMDLG.DLL), hp thoi ny cho php ngi dng thit lp cc thng s in
n.
_ ? Jx ]
P rint
General Layout I Paper/Quality I
- Select Printer
A dd P rin te r
Status:
HP LaserJet
1100 (MS) on
Noel
r Print to file
Ready
Location:
~ ____ .
Comment:
I
Fmd Printer...
______
I
Page Range
(* All
f
Selection
Pages:
Number of copies
|l
c Current Page
Cancel
PRINTDLG pd;
ZeroMemory(&pd, sizeof(PRINTDLG));
Trang 170
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
pd.lStructSize = sizeof(PRENTDLG);
pd.hwndOwner = GetFocus();
pd.Flags = PD_RETURNDC|PD_NOSELECTION;
if(PrintDlg(&pd))
{
StartDoc(pd.hDC, NULL);
StartPage(pd.hDC);
TextOut(pd.hDC, 100,100, "Your message here:", 18);
TextOut(pd.hDC, 100, 200, msg, strlen(msg));
TextOut(pd.hDC, 100, 300, "End of printing", 15);
EndPage(pd.hDC);
EndDoc(pd.hDC);
DeleteDC(pd.hDC);
}
}
6.4.2. Cc hm i u khin in n
Hm
int StartDoc(hDC, lpDocInfo)
ngha
int EndDoc(hDC)
Kt thc tc v in n.
int AbortDoc(hDC)
Hy tc v in hin hnh.
int StartPage(hDC)
Bt u trang mi.
int EndPage(hDC)
Kt thc 1 trang.
Ch nh hm (MyAProc) x l trng
Trang 171
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
6.4.3. x l l i khi in
Trong qu nh in bng vic s dng cc hm iu khin in n, nu cc thao tc thnh
cng th lun tr v gi tr ln hn 0.
Nu c li, dng hm DWORD GetLastError(VOID) ly v m li (ch WinNT
v Win2000 mi h tr hm ny).
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 cc h thng my tnh hin i, b nh chnh l trung tm ca cc thao tc, x
l. B nh chnh c th xem nh mt mng cc phn t kiu BYTE hoc WORD, c xc
nh thng qua a ch ca chng. Mi chng trnh c nh x vo b nh chnh trc khi
c thi hnh v c h iu hnh qun l thng qua tp lnh xc nh.
Trong sut qu trnh thi hnh, cc chng trnh vi d liu truy xut ca chng lun
c t ong 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 m t 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.
Trang 172
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
7.2. QUN L B NH
Mi tin trnh trong Win32 u c mt vng a ch o 32-bit cho php nh v vng
nh n 4 GB. a ch o ny khng phi l vng nh vt l thc t. Windows s dng mt
cu trc d liu nh x chuyn i a ch o thnh vng nh vt l.
Vng a ch o ca mi tin trnh thng ln hn rt nhiu so vi vng nh vt l
thc s trn my tnh. Do , tng vng nh cho cc tin trnh ang thc hin, h thng s
dng vng nh trng trn a. Vng nh vt l v vng a ch o ca mi tin trnh c t
chc thnh cc trang, ph thuc vo h my tnh. V d, i vi my tnh h x86, mi trang c
kch thc l 4 KB.
tng kh nng linh ng trong vic qun l b nh, h thng c th di chuyn cc
trang t b nh chnh vo a v ngc li. Cc thao tc ny c thc hin ch bi h thng,
cc ng dng ch vic gi cc hm cp pht v s dng vng a ch o.
Th vin c chun h tr cc hm cp pht v gii phng vng nh nh malloc, free,
hoc ong C++ l new, delete, .... Th nhng ong Windows 16 bits, cc hm ny c th
gy li h thng. Trong Win32, ta c th s dng chng an ton do h thng ch qun l b
nh qua cc ang vt l m khng nh hng n a ch o. Hn na, Win32 cng khng
phn bit gia con tr gn v con tr xa. Mc d vy, cc hm trn khng th hin cc
kh nng h tr ca vic qun l b nh trong Win32. Chng ta s lm quen vi cc hm
Global v Local - s dng t Windows 16 bits, v cc hm qun l vng nh o khc.
Trang 173
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Trong uFlags xc nh cch thc cp pht vng nh. Ta c bng sau :
Ton cc
a phng
ngha
GMEMJFIXED
LMEMJFIXED
Cp pht vng nh c
nh. Gi tr tr v l mt
con tr.
GMEMLMOVEABLE
LMEM_MOVEABLE
Cp pht vng nh
khng c nh. Trong Win32,
khi nh khng bao gi di
chuyn trong vng nh vt
l, nhng trong heap mc
nh. Hm tr v handle ca
mt i tng b nh. Ta
dng hm GlobalLock h o c
LocaLLock chuyn handle
sang con tr vng nh.
GMEM_ZEROINIT
LMEM_ZEROINIT
Khi to ni dung
vng nh vi gi tr 0.
GPTR
GMEMJFIXED 1
GMEM_ZEROINIT
GHND
GMEM_MOVEABLE 1
GMEM_ZEROINIT
LPTR
LMEM_FIXED 1
LMEM_ZEROINIT
LHND
LMEM_MOVEABLE 1
LMEM_ZEROINIT
Trang 174
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Khi dng cch thc cp pht GMEM_MOVEABLE hoc LMEM_MOVEABLE, ta
nhn c handle vng nh. s dng vng nh, ta dng hm GlobalLock hoc
LocalLock :
LPVOID GlobalLock(HGLOBAL hMem);
LPVOID LocalLock(HLOCAL hMem);
Nu thnh cng hm tt v con tr tr n byte u n 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
G ln h a lU n ln rk v T .nralU nlnrk.
Trang 175
NGN NG LP TRNH
WINDOWS
HGLOBAL GlobalHandle(LPCVOID pMem);
LP TRNH c TRN
{
/* Vng nh c th ln hn 3500 */
nSizeMem = GlobalSize(hMem);
lpAddress = (LPBYTE)GlobalLock(hMem);
(Address != NULL)
{
for(i-0; KuSizeMem; i++)
lpAddress[i] = 0x3C;
GlobalUnlock(hMem);
/*
*/
Trang 176
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
}
/* Nu khng dng na th gi hm
GlobalFree(hMem); */
}
on chng nh tip theo cp pht li vng nh trn vi kch thc l 5000 bytes,
khi gn cc gi tr l 0x00 :
HANDLE hMemTmp;
hMemTmp = GlobalReAlloc(hMem, 5000,
GMEM_MOVEABLE|GMEM_ZEROINIT);
if(hMemTmp != NULL)
{
hMem = hMemTmp;
nSizeMem = GlobalSize(hMem);
/*
*/
7.2.2 Cc hm Heap
Cc hm heap cho php cc tin nh to mt vng heap ring cho mt hoc mt s
trang trong vng a ch ca tin tnh 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.
u tin hm HeapCreate to i tng heap cho mt tin nh. Vng nh heap ny
ch c dng cho tin trnh ny m thi, v khng chia s cho cc tin trnh khc, ngay c cc
tin trnh trong th vin lin kt ng DLL (dynamic-link library).
HANDLE HeapCreate(DWORD flOptions, DWORD dwInialSize, DWORD
dwMaximumSize);
Trang 177
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 ttnh bng hm
HeapAlloc hoc HeapReAlloc. Hm tr v handle ca i tng heap nu thnh cng, ngc
li tr v NULL.
cp pht vng nh ln u, ta gi hm HeapAlloc. Nu mun cp pht li, dng
hm HeapReAlloc.
LPVOID HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes);
Trng dwFlags c th l HEAP_GENERATE_ EXCEPTIONS,
HEAP_NO_SERIALIZE, v HEAP_ZERO_ MEMORY. Trng dwBytes xc nh s bytes
vng heap c cp pht. Nu thnh cng, hm v con tr n vng nh. Nu tht bi,
hm tr v NULL nu dwFlags khng thit lp HEAP_ GENERATE_EXCEPTIONS. Nu c
thit lp, gi tr tr v l STATUS_NO_MEMORY (khng c sn vng nh hoc li vng
heap), hoc STATUS_ACCESS_VIOLATION (Do li vng heap hoc bin khng chnh xc).
LPVOID HeapReAlloc(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem,
DWORD dwBytes);
Trng lpMem tr n vng nh cn cp pht li. Vng nh ny c to bng
hm HeapAlloc hoc HeapReAlloc.
Trng dwBytes xc nh kch thc vng nh cn cp pht. Gi tr ny phi nh hn
0x7FFF8.
kho v m kho vng nh heap, ta dng hm HeapLock v HeapUnlock.
BOOL HeapLock(HANDLE hHeap);
BOOL HeapUnlock(HANDLE hHeap);
Nu thnh cng, gi tr tr v khc 0. Ngc li, hm tr v 0.
xc nh kch thc vng heap, ta dng hm HeapSize.
DWORD HeapSize(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem);
Trong hm ny, dwFlags ch dng vi HEAP_NO_ SERIALIZE. Cc trng khc
tng t cc hm khc. Nu thnh cng, hm tr v kch thc vng nh. Nu tht bi, hm
tr v gi tr l OxFFFFFFFF.
Sau khi s dng, ta gii phng vng nh v hy i tng heap bng hm HeapFree
v HeapDestroy.
BOOL HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem);
Trang 178
NGN NG LP TRNH
WINDOWS
BOOL HeapDestroy(HANDLE hHeap);
LP TRNH c TRN
7.2.3 Cc hm Virtual
Microsoft Win32 API cung cp mt tp cc hm qun l b nh o cho php mt
tin trnh thao tc v xc nh cc trang trong vng a ch khng gian o, gm cc chc nng
sau :
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 ia).
Thit lp cc thuc tnh c-ghi, ch c, hoc khng c truy cp cho cc
trang xc nhn. iu ny khc vi cc hm cp pht chun lun cp pht cp pht
cc trang vi thuc tnh l c-ghi.
Gii phng chui cc trang dnh, sn vng a ch o cho cc thao tc
cp pht ca tin trnh ang gi.
Kh xc nhn cc trang xc nhn bng cch gii phng vng lu tr vt l,
sn cho cc thao tc cp pht ca cc tin trnh khc.
Kho mt hoc mt vi trang vng nh xc nhn vo vng nh vt l
(RAM) h thng c th hon chuyn cc trang vo tp tin trang.
Nhn thng tin v chui cc trang ong vng a ch o ca tin trnh ang gi
hoc ca mt tin trnh xc nh khc.
Thay i cc chc nng bo v truy cp cho chui xcnh cc trang xc
nhn trong vng a ch o ca tin tn h ang gi hoc tin trnh xc nhkhc.
7.2.3.1 C p pht vng n h o
Cc hm qun l b nh o thc hin cc thao tc trn cc trang vng nh. cp
pht cc trang vng nh o, ta dng hm VirtualAlloc, vi cc chc nng sau y :
dnh mt hay nhiu trang trng.
Cp pht xc nhn mt hay nhiu trang dnh.
dnh v cp pht xc nhn mt hay nhiu trang trng.
Chng ta c th ch nh a ch u ca cc trang dnh hay cp pht, hoc cho
h thng t xc nhn a ch. Hm s lm trn a ch ch nh vi bin trang thch hp. Vng
nh c cp pht c khi gn bng 0, nu ta khng thit lp c MEM_RESET.
Trang 179
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
LPVOID VirtualAlloc(LPVOID lpAddress, DWORD dwSize, DWORD
flAllocatonType, DWORD flProtecc);
Trng lpAddress xc nh a ch bt u ca vng cp pht. Nu vng nh ang
dnh, a ch ch nh c lm trn n bin 64 KB k tip. Nu vng nh dnh v
ang c xc nhn, a ch s c lm trn n bin trang k. xc nh kch thc ca
trang, ta s dng hm GetSystemlnfo. Nu bin ny bng NULL, h thng t xc nhn a
ch vng nh cp pht.
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 ang cha
mt hay nhiu byte nm trong khong t lpAddress n IpAddress+dwSize. Ngha l, nu hai
byte nm hai trang th c hai trang u nm trong vng cp pht.
Trng flAllocationType xc nh dng cp pht, c th kt hp t cc c :
C
ngha
MEM_COMMIT
MEMJRESERVE
MEMJRESET
MEM_TOPDOWN
Trang 180
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
C
ngha
PAGE_READONLY
PAGE_READWRITE
PAGEJEXECUTE
PAGE_EXECUTE_READ
PAGE_EXECUTE_READWRITE
PAGE_GUARD
PAGE_NOACCESS
PAGE_NOCACHE
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
pht). Nu cc trang cha c cp pht, ta vn c th kh cp pht (decommit) m khng
gy ra li. v i gi tr sau, hm gii phng vng nh dnh. Trong ng hp ny, dwSize
phi bng 0, nu khng hm thc hin tht bi.
Nu thnh cng, hm tr v gi tr khc 0. Ngc li, gi tr tr v l 0.
Lu gii phng cc ang, 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.
7.2.3.3 Thao tc trn cc trang vng n h
xc nh kch thc cc trang n my tnh, ta s dng hm GetSystemlnfo.
VOID GetSystemInfo(LPSYSTEM_INFO IpSystemlnfo);
Trng IpSystemlnfo tr n cu trc SYSTEM_INFO cha cc thng tin h thng,
typedef struct _SYSTEM_INFO // sinf
{
union
{
DWORD dwOemld;
struct
{
WORD wProcessorArchitecture;
WORD wReserved;
}
};
DWORD dwPageSize;
LPVOED lpMinimumApplicationAddress;
LPVOID lpMaximumApplicationAddress;
DWORD dwActiveProcessorMask;
DWORD dwNmnberOfProcessors;
Trang 182
NGN NG LP TRNH
WINDOWS
LP TRNH c TRN
DWORD dwProcessorType;
DWORD dwAIlocationGranularity;
WORD wProcessorLevel;
WORD wProcessorRevision;
}SYSTEM_INFO;
Trang 183
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".
Trong v d u tin, ta s dng hm VirtualAlloc v VirtualFree cp pht
dnh v xc nhn vng nh o. u tin, hm VirtuaiAlloc c gi cp pht dnh
mt khi cc trang. Ta s dng gi tr NULL cho a ch c s, ng ngha vi vic cho h
thng t xc nh v tr vng cp pht. Sau s dng li hm VirtualAlloc cp pht xc
nhn cc trang trong vng dnh. Khi , ta cn ch nh a ch c s cho cc trang ny.
Trong v d ny, ta s dng cu trc try-except xc nhn cc trang trong vng
dnh. Mi khi c li ang xut hin trong qu trnh thc hin khi try, hm lc trc khi
except s c thc hin. Nu hm lc c th cp pht mt trang khc, phn thc thi s tip
tc trong khi try ti ci im xut hin li ngoi l. Ngc li, cc handler ngoi l trong
khi except c thc thi.
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 tn h khc.
Trong v d ny, ta s dng hm VirtualFree gii phng vng nh xc nhn ln
vng nh dnh sau khi hon tt cng vic. Hm ny c gi hai ln : ln u kh cp
pht cc trang c cp pht xc nhn, v ln sau gii phng ton b cc trang di
dng dnh.
#define PAGELIMIT 80
#define PAGESIZE 0x1000
ENT PageFaultExceptionFilter (DWORD);
VOID MyErrorExit(LPTSTR);
LPTSTR lpNxtPage;
DWORD dwPages = 0;
VOID UseDynamicVirtualAlloc(VOID)
{
LPVOED lpvBase;
LPTSTR IpPtr;
BOOL bSuccess;
DWORD i;
/* dnh cc trang trong khng gian a ch o ca tin trnh */
Trang 184
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
lpvBase = VirtualAlloc(
NULL, //h thng t xc nh a ch
p AGELIMIT*P AGESIZE,// kch thc vng cp pht
MEM_RESERVE, //c p pht di dng dnh
PAGE_NOACCESS); //cch thc bo v = khng truy cp
if (lpvBase == NULL )
MyErrorExit("VirtualAlloc reserve");
lpP = lpNxtPage = (LPTSTR) lpvBase;
/* s dng cu trc x l ngoi l tty-exception truy cp cc trang. Nu li trang xut hin, b lc
ngoi l s thc thi cp pht xc nhn cc trang k tip trong khi dnh */
for (i=0; i < PAGELIMIT*PAGESZE; i++)
{
try
{
IpPtrft] = 'a'; // Ghi vo b nh
>
/* Nu xut hin li trang, c gng cp pht xc nhn trang khc */
except ( PageFaultExceptionFlter(GetExceptionCodeO ) )
{
/* on ny ch thc hin khi hm lc khng th xc nhn trang k tip */
ExitProcess( GetLastErrorQ );
}
>
/* 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
dwPages*PAGESIZE, / / s byte cc ang cp pht
Trang 185
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
MEM_DECOMMIT); //hnh thc l kh xc nhn
/* Cui cng, gii phng ton vng nh ( dnh) */
if (bSuccess)
{
bSuccess = VirtualFree(
lpvBase, // a ch c s ca khi nh
0, //g i i phng ton khi nh
}
}
INT PageFaultExceptionFilter(DWORD dwCode)
{
LPVOED lpvResult;
/* Nu xut hin li ngoi l, thot chng trnh */
if (dwCode != EXCEPTION_ACCESS_VIOLATION)
{
printf("exception code = %d\n", dwCode);
return EXCEPTION_EXECUTE_HANDLER;
>
printf("page fault\n");
/* Nu cc trang dnh c dng th thot */
{
printf("out of pages\n");
return EXCEPTION_EXECUTE_HANDLER;
>
Trang 186
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
/* Ngc li, cp pht xc nhn mt trang khc */
lpvResult = VirtualAlloc(
(LPVOID) lpNxtPage, //c p pht trang tip theo
PAGESIZE, // s byte kch thuc trang
MEM_COMMIT, // cp pht xc nhn cc trang
PAGE_READWRITE); // try cp c-ghi
if (lpvResult == NULL )
{
printf("VirtualAlloc failed\n");
return EXCEPTIONJEXECUTEJHANDLER;
}
/* Tng trang m, v chuyn IpNxtPage n trang tip */
dwPages++;
lpNxtPage += PAGESIZE;
/* Tip tc thc hin ni li trang xut hin */
return EXCEPTION_CONTINUE_EXECUTION;
}
on chng nh p 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.
to trang lnh canh, ta thit lp c PAGE_GUARD ong hm VirtualAlloc. c
ny c th dung kt hp vi tt c cc c khc, tr c PAGE_NOACCESS.
Nu chng trnh truy cp trang "lnh canh", h thng s pht sinh li ngoi l
STATUS_GUARD_PAGE (0x80000001). H thng cung xoa c PAGE_GUARD, 'loi b tnh
ng "lnh canh" ca trang vng nh. H thng s khng ngng truy cp trang vng nh vi
li ngoi l STATUS_GUARD_PAGE.
Nu mt li ngoi l xut hin ong sut dch v h thng, dch v s tr v gi tr
xc nh li. Nu sau ta truy cp li trang ny (m cha thit lp li tnh trng "lnh
canh"), th s khng xy ra li ngoi l na.
Trang 187
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Chng trnh sau minh ha cch thc hin ca mt ang lnh canh, v hin tng
xut hin li dch v h thng :
#indude <windows.h>
#indude <stdio.h>
#indude <stdlib.h>
int main()
{
LPVOID lpvAddr;
DWORD cbSize;
BOOL vLock;
LPVOID commit;
cbSize = 512; // Vng nh cn cp pht.
/* Gi hm cp pht */
lpvAddr=VirtualAUoc(NULL,cbSize,MEM_RESERVE, PAGE_NOACCESS);
if(lpvAddr == NULL)
{
fprintf(stdout,"VirtualAlloc failed on
RESERVE with %ld\n", GetLastErrorO);
}
/* Cp pht xc nhr vng nh */
commit = VtualAlloc(NULL,cbSize,MEM_COMMIT,
PAGE_READONLY|PAGE_GUARD);
iffcommit == NULL)
{
fprintf(stderr,"VirtualAlloc failed on
COMMIT with %ld\n", GetLastErrorQ);
Trang 188
NGN NG LP TRNH
WINDOWS
}
LP TRNH
else
{
fprintf(stde,"Committed %lu bytes at address
%lp\n", cbSize,commit);
}
/* Kho vng nh xc nhn */
vLock = VirtualLock(cominit,cbSize);
if(!vLock)
{
fprintf(stderr,"Cannot lock at %lp,
eor = %lu\n", commit, GetLastErrorO);
>
else fprintf(stderr,"Lock Achieved at %lp\n",commit);
/* Kho vng nh /n na */
vLock = VirtualLock(commit,cbSize);
if(!vLock)
{
fprintf(stderr,"Cannot get 2nd lock at %lp,
eor = %lu\n", commit, GetLastErrorO);
>
else fprintf(stderr,"2nd Lock Achieved at %lp\n",commit);
}
Chng trnh trn cho kt qu tng t kt qu sau :
Committed 512 bytes at address 003F0000
Cannot lock at 003F0000, error = 0x80000001
Trang 189
c TRN
NGN NG LP TRNH
WINDOWS
2nd Lock Achieved at 003FOOOO
LP TRNH c TRN
7.3 X L TP TIN
Tp tin l mt n v lu tr c bn my tnh phn bit cc khi thng tin khc
nhau, c lu tr trn cc thit b lu ph nh l a, bng t, v c t chc theo cc
nhm gi l th mc.
x l tp tin, ta c th dng cc hm trong c chun nh fopen, fclose, fread,
fwrite, fseek, ... trong mi trng Windows. Cc hm ny c h tr ong th vin stdio.h.
Chng ta s khng bn v cc hm ny y.
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
T o v m t p tin
ngha
Xc nh truy vn thit b n
mt i tng. Mt tig dng c th
truy vn thuc tnh thit b m khng
cn phi truy cp thit b.
GENERICJREAD
Trang 190
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
GENERIC_WRITE
FILE_SHARE_READ
FILE_SHARE_WRITE
To mi mt tp tin. Hm ny tht bi nu
tp tin c.
CREATE_ALWAYs
OPENJEXISTING
OPEN_ALWAYS
Trang 191
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
TRUNCATEJEXISTING
FILE_ATTRIBUTE_HIDDEN
FILE_ATTRIBUTE_NORMAL
FILE_ATTRIBUTE_OFFLINE
FILE_ATTRIBUTE_READONLY
FILE_ATTRIBUTE_SYSTEM
FILE_ATTRIBUTE_TEMPORARY
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Khi to mt tp tin, hm CreateFile thc hin cc chc nng sau:
Kt hp cc c v thuc tnh tp tin c xc nh bi c
dwFlagsAnd Attributes vi gi tr l FILE_ATTRIBUTE_ARCHIVE.
Thit lp kch thc tp tin bng 0.
Chp cc thuc tnh m rng ca tp tin tm vo tp tin mi nu bin
hTemplateFile xc nh.
Khi m mt tp tin c sn, hm CreateFile thc hin cc chc nng sau :
Kt hp cc c xc nh bi dwFlagsAndAttributes vi cc thuc tnh ca tp
tin hin c. Hm CreateFile s b qua cc thuc tnh ca tp tin xc nh bi c
dwFlagsAndAttributes.
Thit lp kch thc tp tin da vo gi tr ca dwCreationDisposition.
B qua gi tr ca bin hTemplateFile.
Nu hm to mt tp tin trn a mm khng c a mm, hoc trn CD-ROM
khng c a CD, h thng s a ra mt hp thoi thng ip (message box) yu cu ngi
dng a a mm hoc a CD vo. h thng khng thc hin thao tc trn, cn thit lp
gi tr uMode trong hm SetErrorMode l SEM_FAILCRITICALERRORS.
UINT SetErrorMode(UINT uMode);
Trong v d sau, hm CreateFile m mt tp tin c c :
HANDLE hFile;
hFile = CreateFile("MYFILE.TXT", //m tp tin MYFILE.TXT
GENERIC_READ, // m c
FILE_SHARE_READ, //chia s c
NULL, //khng bo mt
OPENJEXISTING, // ch m tp tin c
FILE_ATTRIBUTE_NORMAL, //Tp tin thng
NULL); // khng c thc tnh tm
if (hTile == INVALID_IIANDLE_VALUE)
{
ErrorHandler("Could not open file."); //l i x
Trang 193
NGN NG LP TRNH
WINDOWS
xo tp tin n, trc ht ta ng tp tin li.
LP TRNH c TRN
CloseHandle(hFile);
DeleteFile("MYFILE.TXT);
{
ErrorHandler("Could not open file."); // i x l
>
7.3.2 T o t p tin t m
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.
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Trng IpPrefixString tr n mt chui k t (kt thc bng k t NULL). Hm s
dng 3 k t u tin ca chui nh phn tin t ca tp tn. Cc k t s dng phi l ky t
ANSI.
Trng uUnique xc nh mt s nguyn khng du (m) hm chuyn thnh chui k
t thp lc phn s dng trong vic to tp tin tm.
Trng IpTempFileName tr n vng nh m cha tn tp tin tm. Trng ny l
mt chui k t kt thc NULL cc k t ANSI. di vng nh m c xc nh bi gi
tr MAX_PATH ca th mc tng ng.
Tp tin to c s c dng nh sau :
path\preuuuu.TMP
Trong path l ng dn, xc nh bi gi lpPathName; pre l 3 k t u ca
chui lpPrefixString; v uuuu l gi tr thp lc phn ca uUnique.
Khi thot khi h iu hnh (tt my chng hn), cc tp tn tm to bng hm ny s
t ng b xo.
trnh cc li khi chuyn chui ANSI, ng dng cn gi hm CreateFile trc
to tp tin tm.
Nu gi tr uUnique bng 0, hm GetTempFileName xc lp mt con s duy nht da
trn thi im hin ti ca h thng. N u tp tin c, h thng t tng ln m t s mi cho
n khi c mt tn duy nht.
Nu thc hin thnh cng, hm tr v con s duy nht xc nh ttong trng uUnique.
Ngc li, gi tr tr v l 0.
thu nhn ng dn tp tin tm, ta dng hm GetTempPath.
DWORD GetTempPath(DwORD nBufferLength, LPTSTR IpBuffer);
Trng nBufferlength xc nh kch thc vng m chui k t xc nh bi lpBuffer.
Trng lpBuffer tr n vng m nhn chui k t xc nh ng dn tp tin tm. Chui
k t kt thc bng k t V, v d : C:\TEMPV
Nu thnh cng, hm tr v ln xc nh kch thc chui zero. Nu gi tr tr v
ln hn nBufferLength, gi tr tr v s l kch thc vng m cn cha ng dn.
Ngc li, gi tr tr v l 0 nu hm tht bi.
NGN NG LP TRNH
L P TRN H c TRN
WINDOWS
BOOL CopyFile(LPCTSTR IpExistingFileName, LPCTSTR lpNewFileName, BOOL
bFaillfExists);
khng chia s
Trang 196
LP TRNH
NGN NG LP TRNH
WINDOWS
NULL, // khng bo mt
c TRN
OPEN_EXISTING, // tp tn c sn
FILE_ATTRIBUTE_NORMAL, // tp tin thng thng
NULL); // khng thuc tnh tm
if (hFile == INVALID_HANDLE_VALUE)
{
ErrorHandler("Could not open file."); //x l li
}
/* To tp tin tm */
GetTempFileName("\\TEMP", // th mc cha tp tin tm
"NEW", //phn u tp tin tm
0, // to tn duy nht
szTempName); //vng m tn
hTempFile = CreateFile((LPTSTR) szTempName, // tn tp tin
GENERICJREAD I GENERIC_WRITE, //m d n g c-ghi
0, // khng chia s
NULL, // khng bo mt
CREATE_ALWAYS, // to chng nu tp tin c
FILE_ATTRIBUTE_NORMAL, // tp tin thng thng
NULL); //khng thuc tnh tm
(hTempFile == INVALID_HANDLE_VALUE)
{
ErrorHandler("Could not create temporary file.");
}
/* 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
Trang 197
NGN NG LP TRNH
WINDOWS
{
LP TRNH
c TRN
{
CharUpperBuff(buffer, dwBytesRead);
WriteFile(hTempFile, buffer, dwBytesRead, &dwBytesWritten, NULL);
}
} while (dwBytesRead == 4096);
/*
ng c hai tp tin */
CloseHandIe(hFile);
CloseHandle(hTempFile);
/* Chuyn tp tn tm vo tp tin mi ALLCAPS.TXT */
tf (!MoveFile(szTempName, "ALLCAPS.TXT"))
{
ErrorHandler("Could not move temp, file.");
}
Hm CloseHandle ng m t tp tin ang m. Xem phn 7.3.6.
Trang 198
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
Trng dwMoveMethod xc nh im gc m con tr cn di di. N u trng ny
bng FILE BEGIN, im gc l im u tin (byte th 0) ca tp tin. Nu l
FILE_CURRENT, im gc l v tr hin ti ca con tr. V FILE_END xc nh im gc l
v tr cui hin ti ca tp tin.
/*
tin c a
*/
hFile m t on */
{
dwError = GetLastErrorO ; //N hn m li
. . . / / X l li
} // Cui phn x l li
tr
tp
tn
hFile m t on di */
{
/ / X l li
//...
} // Cui phn x l li
Trang 199
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
di chuyn tin, ta thit lp dch chuyn mt gi tr dng. Ngc li, thit lp
gi tr m di chuyn li con tr tp Un. Nu gi tr con tr tp tin sau khi dch chuyn m,
hm tht bi, v m li m hm GetlastError tr v l ERROR_NEGATIVE_SEEK.
Nu mun di chuyn con tr n cui tp tin ghi tip, ta cng c th dng hm
SetEndOfFile.
BOOL SetEndOfFUe(HANDLE hFe);
Trng hFile l handle ca tp tin cn di chuyn con tr n cui tp tn cn c
to vi dng truy cp GENERAL_WRITE. Nu thnh cng, hm tr v gi tr khc 0. Ngc
li, gi tr tra v l 0.
Hm ReadFile c d liu t mt tp tin, t im xc nh bi con tr tp tin. Sau khi
pr, rnn tr tp tin rlrh rhnyn mr on ng vi s hytp tht s r r. Tng t,
ghi vo tp tin ta dng hm WriteFile.
BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD
nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED
lpOverlapped);
BOOL WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD
nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED
lpOverlapped);
Handle tp tin hFile cn c to vi dng truy cp GENERAL_READ hoc
GENERAL_WRITE.
Trng lpBuffer tr n vng nh m nhn d liu c t tp tin, hay cha d liu
cn ghi. Trng nNumberOfBytesToRead xc nh s byte cn c. Trng
lpNumberOfBytesRead tr n cc byte c c. Hm ReadFile thit lp gi tt ny bng 0
trc khi thc hin cc thao tc khc kim a li.
Trng nNumberOfBytesTo Write xc nh s byte cn ghi. Nu trng ny bng 0,
hm khng ghi d liu, nhng vn c gi thc hin. Trng IpNumberOfBytesWritten xc
nh s byte ghi c, trng ny cng c hm WriteFile thit lp v 0 trc khi thc
hin cc thao tc khc kim tra li.
Cui cng, trng lpOverlapped tr n cu trc OVERLAPPED. Nu tp tin c
m vi c FILE_FLAG_OVERLAPPED, gi tr ny phi khc NULL. n gin ta thit
lp gi tr bng NULL, hm s c (ghi) tp tin t v tr con hin ti v hm ch kt
qu v sau khi c (ghi) xong.
Hm ReadFile s dng vi mt s l do sau : thao tc ghi hon tt cui ng ng
ghi, c ht s byte yu cu, hoc xy ra li khi c.
Nu thnh cng, cc hm tr v gi tr khc 0. Ngc li, gi tr tr v bng 0.
Trang 200
LP TRNH c TRN
NGN NG LP TRNH
WINDOWS
Trang 201
LP TRNH
NGN NG LP TRNH
WINDOWS
0, // khng chia s
c TRN
NULL, // khng bo mt
OPENJEXISTING, // ch m tp tin tn ti
FILE_ATTRIBUTE_NORMAL, // tp tin bnh thng
NULL); //khng c thuc tnh tm
if (hFile == INVALID_HANDLE_VALUE)
{
ErrorHandler("Could not open ONE."); //x l li
}
/* M tp tin c. Nu cha c, to tp tin mi */
hAppend = CreateFile("TWO.TXT', / / m tp tin TWO.TXT
GENERIC_WR]TE, //m ghi
0, // khng chia s
NULL, //khng bo mt
OPEN_ALWAYS, //m tp tin c hoc to mi
FILE_ATTRIBUTE_NORMAL, // tp tin bnh thng
NULL); // khng c thuc tnh tm
(hAppend == INVALID_HANDLE_VALUE)
{
ErrorHandler("Could not open TWO."); / /x l li
}
/* Ni tp tir 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
{
(ReadFile(hFile, buff, 4096, &dwBytesRead, NULL))
{
Trang 202
NGN NG LP TRNH
WINDOWS
LP TRNH
c TRN
}
} while (dwBytesRead == 4096);
/* ng c hai tp tin */
CloseHandle(hFOe);
CIoseHandle(hAppend);
7.3.6 ng v xo t p tin
s dng hiu qu ti nguyn h thng, ng dng cn ng cc tp tin khi khng
cn dng na bng cch gi hm CloseHandle. Nu ng dng b ngt v tp tin vn ang
m, h thng s t ng ng tp tin ny.
BOOL CloseHandle(HANDLE hObject);
Nu thnh cng, hm tr v gi tr khc 0. Ngc li, gi tr tr v l 0. bit cc
thng tin li m rng, ta dng hm GetLastError.
xo m t tp tin, ta dng hm DeleteFile. Lu rng tp tin ny cn phi ng
trc khi b xa.
7.3.7 x l th m c
Khi ng dng to mt tp tin mi, h iu hnh s thm tp tin ny vo mt th mc
xc nh. to v xo mt th mc, ta dng hm CreateDirectory v RemoveDirectory.
BOOL CreateDirectory(LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES
lpSecurityAttributes);
Trang 203
NGN NG LP TRNH
LP TRNH c TRN
WINDOWS
BOOL RemoveDirectory(LPCTSTR IpPathName);
Trng lpPathName tr n chui (kt thc bng k t NULL) xc nh ng dn
th mc cn to (hay cn xo). Kch thc chui mc nh gii hn cho ng dn l
MAX_PATH k t. Trong ng hp xo th mc, ng dn cn xc nh th mc l th
mc rng.
Trng lpSecurityAttributes tr n cu trc SECURITY_ATTRIBUTES cha trng
lpSecurityDescriptor xc nh m t m t ca th mc mi. n gin, ta gn gi tr
lpSecurityAttributes bng NULL, khi th mc mi nhn cc gi tr m t mt mc nh.
Nu thnh cng, cc hm v gi tr khc 0. Ngc li, gi tr tr v l 0.
Th mc cui ca ng dn ang s dng gi l th mc hin hnh. xc nh
rh m r hin hnh, ng dng gi hm GpCnrrpnDirprnry. thay i iti m r hin hnh,
ng dng gi hm SetCurrentDirectory.
DWORD GetCurrentDirectory(DWORD nBufferLength, LPTSTR lpBuffer);
Trng nBufferLength xc nh kch thc vng m ca chui k t th hin th
mc hin hnh. Vng m ny phi di cha c k t NULL cui chui. Trng
lpBuffer s cha chui k t ny.
Nu thnh cng, hm tr v gi xc nh s k t c ghi vo vng m, khng
cha k t NULL. Ngc li, gi tr tr v l 0. Nu vng m lpBuffer khng ln, gi
tr v xc nh kch thc cn thit ca vng m, gm c byte NULL ng du kt thc
chui.
BOOL SetCurrentDirectoryQLPCTSTR lpPathName);
Trng lpPathName tr n chui k t (kt thc bng NULL) xc nh ng dn
mi. Nu thnh cng, hm tr v gi tr khc 0. Ngc li, gi tr tr v l 0.
Trang 204