You are on page 1of 202

NGN NG LP TRNH LP TRNH C TRN WINDOWS

Trang 1






LP TRNH C TRN
WINDOWS










T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 2
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 trnh 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 trin cc ng dng trn Windows.
Cui chng l phn xy dng mt chng trnh n gin nht trn Windows. Chng
trnh ny c xem nh l khun mu ca mt chng trnh ng dng in hnh, v hu ht cc
on chng trnh c vit minh ha trong sch u ly chng trnh ny lm khung sn
pht trin cho ph hp vi tng yu cu. Thm vo , mt s kiu d liu mi c nh ngha
trn Windows v nhng qui c v cch t tn bin cng c gii thiu trong phn ny.
Phn chi tit v chuyn su hn ca vic lp trnh bng ngn ng C trn mi trng
Windows s c trnh by trong cc chng tip theo.
1.2. H IU HNH MICROSOFT WINDOWS
1.2.1. Gii thiu
Gia thp nin 80, cng ty phn mm my tnh Microsoft cng b phin bn u tin ca
dng h iu hnh Windows l Microsoft Windows 1.0. y l h iu hnh dng giao din
ha khc vi giao din k t (text hay console) ca MS-DOS. Tuy nhin phi n phin bn
th hai (Windows 2.0 - thng 11 nm 1987) th mi c bc ci tin ng k, l s m rng
giao tip gia bn phm v thit b chut v giao din ha (GUI-Graphic User Interface) nh
trnh n (menu) v hp thoi (dialog). Trong phin bn ny Windows ch yu cu b vi x l
Intel 8086 hay 8088 chy real-mode truy xut 1 megabyte b nh.
Thng 5 nm 1990, Microsoft cng b phin bn tip theo l Windows 3.0. S thay i
ln trong phin bn ny l Windows 3.0 h tr protected-mode 16 bit ca cc b vi x l 286,
386, v 486 ca Intel. S thay i ny cho php cc ng dng trn Windows truy xut 16
megabyte b nh. Tip bc vi s pht trin l phin bn Windows 3.1 ra i nm 1992,
Microsoft a cng ngh Font TrueType, m nhc (multimedia), lin kt v nhng i tng
(OLE- Object Linking and Embedding), v a ra cc hp thoi chung c chun ha.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 3
Trong s pht trin mnh m ca nhng thp nin 90, Microsoft cng b tip dng h
iu hnh Windows vi ng dng cng ngh mi (1993). H iu hnh ny ly tn l
Windows NT (Windows New Technology), y l phin bn h iu hnh u tin ca
Windows h tr 32 bit cho b x l 386, 486 v Pentium. Trong h iu hnh ny th cc ng
dng phi truy xut b nh vi a ch l 32-bit v cc tp lnh hay ch th 32-bit. Ngoi ra
Windows NT cng c thit k chy cc b vi x l (CPU) khc ngoi Intel v c th chy
trn cc my trm (workstation).
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 mt nh Windows NT v vic thch nghi vi my trm
cng ngh RISC, nhng b li h iu hnh ny yu cu phn cng 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 cng 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 mt thch hp trong mi trng mng v giao din p.
1.2.2. c im chung ca h iu hnh Microsoft Windows
Windows l mt h iu hnh s dng giao tip ngi dng ha (GUI), hay cn gi l
h iu hnh trc quan (Visual interface). GUI s dng ha da trn mn hnh nh nh phn
(Bitmapped video display). Do tn dng c ti nguyn thc ca mn hnh, v cung cp mt
mi trng giu tnh trc quan v sinh ng.
Windows khng n iu nh MS-DOS (hay mt s h iu hnh giao din console) m
mn hnh c s dng ch th hin chui k t, do ngi dng g t bn phm (keyboard)
hay xut thng tin dng vn bn. Trong giao din ngi dng ha, mn hnh giao tip vi
ngi s dng a dng hn, ngi dng c th nhp d liu thng qua chut bng cch nhn vo
cc nt nhn (button) cc hp chn (combo box)thit b by gi c nhp, c th l bn phm
v thit b chut (mouse device). Thit b chut l mt thit b nh v trn mn hnh, s dng
thit b chut ngi dng c th nhp d liu mt cch trc quan bng cch kch hot mt nt
lnh, hay lm vic vi cc i tng ha lin quan n ta trn mn hnh.
giao tip trong mi trng ha, Windows a ra mt s cc thnh phn gi l cc
iu khin chung (common control), cc iu khin chung l cc i tng c a vo trong
hp thoi giao tip vi ngi dng. Bao gm : hp vn bn (text box), nt nhn (button), nt
chn (check box), hp danh sch (list box), hp chn (combo box)
Tht ra mt ng dng trn Windows khng phi l qu phc tp v chng c hnh thc
chung. Chng trnh ng dng thung chim mt phm vi hnh ch nht trn mn hnh gi l
mt ca s. Trn cng ca mi ca s l thanh tiu (title bar). Cc chc nng ca chng
trnh th c lit k trong thc n la chn ca chng trnh (menu) , hay xut hin di dng
trc quan hn l cc thanh cng c (toolbar). Cc thanh cng c ny cha cc chc nng c
s dng thng xuyn trong thc n gim thi gian cho ngi dng phi m thc n v
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 4
chn. Thng thng khi cn ly thng tin hay cung cp thng tin cho ngi dng th mt ng
dng s a ra mt hp thoi, trong hp thoi ny s cha cc iu khin chung giao tip vi
ngi dng. Windows cng ra to mt s cc hp thoi chun nh Open Files, v mt s hp
thoi tng t nh nhau.
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 ng dng ny chy ng thi vi nhau.
Trong Windows, chng trnh ng dng khi thc thi c chia s nhng th tc m
Windows cung cp sn, cc tp tin cung cp nhng th tc trn c gi l th vin lin kt
ng (Dynamic Link Libraries - DLL). Windows c c ch lin kt nhng chng trnh ng
dng vi cc th tc c cung cp trong th vin lin kt ng.
Kh nng tng thch ca Windows cng rt cao. Cc chng trnh ng dng c vit
cho Windows khng truy xut trc tip phn cng ca nhng thit b ho nh mn hnh v
my in. M thay vo , h iu hnh cung cp mt ngn ng lp trnh ha (gi l Giao tip
thit b ho - Graphic Device Interface - GDI) cho php hin th nhng i tng ha mt
cch d dng. Nh vy mt ng dng vit cho Windows s chy vi bt c thit b mn hnh no
hay bt k my in, min l ci t trnh iu khin thit b h tr cho Windows. Chng trnh
ng dng khng quan tm n kiu thit b kt ni vi h thng.
Nh gii thiu phn trn khi nim lin kt ng l thnh phn quan trng ca
Windows, n c xem nh l ht nhn ca h iu hnh, v bn thn ca Windows l cc tp
th vin lin kt ng. Windows cung cp rt nhiu hm cho nhng chng trnh ng dng
ci t giao din ngi dng v hin th vn bn hay ha trn mn hnh. Nhng hm ny c
ci t trong th vin lin kt ng hay cn gi l DLL. l cc tp tin c dng phn m rng
l *.DLL hay *.EXE, hu ht c cha trong th mc \Windows\System,
\Windows\system32 ca Windows 98 v cc th mc \WinNT\System, \WinNT\System32
ca Windows NT.
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 tin USER.EXE 16 bit v USER32.DLL 32 bit.
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.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 5
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 tin 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 trnh. thc hin c cc
li gi ny th mt chng trnh 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 trnh dng, nu th vin ny cha c
np vo b nh trc th by gi s c np.
1.3. LP TRNH TRN MICROSOFT WINDOWS
1.3.1. c im chung
Windows l h iu hnh ha trc quan, do d cc ti nguyn ca h thng cung cp
rt a dng i hi ngi lp trnh phi nghin cu rt nhiu pht hay ht sc mnh ca h
iu hnh.
Theo nh nhng mc ch tip cn ca cc nh lp trnh th cc ng dng trn Windows
phi ht sc thn thin vi ngi dng thng qua giao din ha sn c ca Windows. V l
thuyt th mt ngi dng lm vic c vi mt ng dng ca Windows th c th lm vic
c vi nhng ng dng khc. Nhng trong thc t s dng mt ng dng cho t hiu qu
cao trong Windows th cn phi c mt s hun luyn tr gip hay ti thiu th phi cho bit
chng trnh ng dng lm vic nh th no.
a s cc ng dng trong Windows u c chung mt giao din tng tc vi ngi
dng ging nhau. V d nh cc ng dng trong Windows a s u c thanh thc n cha cc
mc nh : File, Edit, Tool, Help V trong hp thoi th thng cha cc phn t iu khin
chung nh : Edit Control, Button Control, Checkbox.
1.3.2. S khc bit vi lp trnh trn MS-DOS
Khi mi bc vo lp trnh trn Windows a s ngi hc rt l lm, nht l nhng
ngi tng lm vic vi MS-DOS. Do MS-DOS l h iu hnh n nhim v giao tip qua
giao din console. Nn khi vit chng trnh khng phc tp.
Cn i vi Windows ngi lp trnh s lm vic vi b cng c lp trnh ha a dng
cng vi cch x l a nhim, a lung ca Windows. V vy vic lp trnh trn Windows s
gip cho ngi lp trnh nhm chn vi giao din console ca MS-DOS. Vic 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. Mt s yu cu i vi ngi lp trnh
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 6
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 trn 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 trn, i khi ngi lp trnh trn Windows cng cn c khiu thm
m, v cch trnh by cc hnh nh, cc iu khin trn cc hp thoi tt th s lm cho ng dng
cng tin li, r rng, v thn thin vi ngi dng.
1.3.4. B cng c giao din lp trnh ng dng API
H iu hnh Windows cung cp hng trm hm cho nhng ng dng c th s dng
truy cp cc ti nguyn trong h thng. Nhng hm ny c gi l giao din lp trnh ng dng
API (Application Programming Interface). Nhng hm trn c cha trong cc th vin lin
kt ng DLL ca h thng. Nh c cu trc ng ny mi ng dng u c th truy cp n cc
hm . Khi bin dch chng trnh, n on m gi hm API th chng trnh dch khng thm
m hm ny vo m thc thi m ch thm tn DLL cha hm v tn ca chnh hm . Do m
cc hm API thc t khng c s dng khi xy dng chng trnh, v n ch c thm vo
khi chng trnh c np vo b nh thc thi.
Trong API c mt s hm c chc nng duy tr s c lp thit b ha, v cc hm ny
gi l giao din thit b ha GDI (Graphics Device Interface). Do s c lp thit b nn cc
hm GDI cho php cc ng dng c th lm vic tt vi nhiu kiu thit b ha khc nhau.
1.3.5. C ch 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 hnh thc
gi l thng ip (message). Thng ip ny c pht sinh t ng dng v h thng. 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 ng 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.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 7
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 tr hay v tr 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 tr 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 cch s dng cc 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 trong 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 nhng 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 tr trong khong ny.
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, WM_KEYDOWN, v WM_CHAR.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 8
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,
WM_PAINT, v WM_QUIT.
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 trnh th s dng mt vng lp thng ip
(message loop) trong hm WinMain nhn thng ip t hng i v gi ti th tc x l ca
s tng ng. Vi 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 .
1.4. CCH VIT MT NG DNG TRN MICROSOFT WINDOWS
1.4.1. Cc thnh phn c bn to nn mt ng dng
1.4.1.1. Ca s
Trong mt ng dng ha 32-bit, ca s (window) l mt vng hnh ch nht trn mn
hnh, ni m ng dng c th hin th thng tin ra v nhn thng tin vo t ngi s dng. Do
vy, nhim v u tin ca mt ng dng ha 32-bit l to mt ca s.
Mt ca s s chia s mn hnh vi cc ca s khc trong cng mt ng dng hay cc
ng dng khc. Ch mt ca s trong mt thi im nhn c thng tin nhp t ngi dng.
Ngi s dng c th dng bn phm, thit b chut hay cc thit b nhp liu khc tng tc
vi ca s v ng dng.
Tt c cc ca s u c to t mt cu trc c cung cp sn gi l lp ca s
(window class). Cu trc ny l mt tp m t cc thuc tnh m h thng dng nh khun mu
to nn cc ca s. Mi mt ca s phi l thnh vin ca mt lp ca s. Tt c cc lp ca
s ny u c x l ring bit.
1.4.1.2. Hp thoi v cc iu khin
Hp thoi (Dialog) dng tng tc vi ngi dng trong mt chng trnh ng dng.
Mt hp thoi thng cha nhiu cc u khin nh nhp vn bn (edit text), nt bm (button),
ghi ch (static control), hp danh sch (list box)
Nt bm (button): gm c Push Button dng kch hot mt thao tc, Check Box
dng chn mt trong hai trng thi (TRUE hay FALSE), Radio Button cng ging nh
Check Box nhng mt nhm cc Radio Button phi c chn loi tr nhau.
Ch thch (static): dng cha cc ghi ch trong hp thoi, ngoi ra ni dung
c th thay i trong qu trnh s dng hp thoi.
Hp lit k (list box): Chn mt hay nhiu d liu c lit k trong danh sch,
nu hp cha nhiu dng v hp khng hin th ht cc mu thng tin th phi km theo mt
thanh cun (scroll bar).
nhp vn bn (edit text): Dng nhp vn bn, nu c nhiu dng th thng
km theo thanh cun.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 9
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 trnh cung cp cho ngi lp
trnh hay t h to ra da trn nhng thnh phn c cung cp sn.
1.4.1.3. ng dng in hnh trn Windows
1.4.1.4. Cc kiu tp tin xy dng mt 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 tin *.h, *.hpp. Cn m ngun (source code) cha trong tp tin *.c hay *.cpp.
Tp tin nh ngha
Tp tin 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 trnh trn Windows u c cc tool to cc nh ny.
Con tr chut ca ng dng c th c v li di dng cc biu tng v lu
trn a vi dng file *.cur.
Cc file dng nh bitmap dng minh ha c lu dng file *.bmp.
Tp tin ti nguyn *.rc l phn khai bo cc ti nguyn nh thc n, hp thoi,
v cc nh danh ch n cc tp tin dng *.ico, *.cur, *.bmp,...
1.4.1.5. Cc kiu d liu mi
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 trn 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 32-bit. i
vi kiu chui th c kiu PSTR kiu ny l mt con tr n mt chui tng t nh char*.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 10
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 16-bit
, 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, trong 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 tr 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 nhng nht thit tt c phi c
cng kch thc vi HANDLE.
Bng sau m t mt s kiu d liu mi:
Kiu ngha
HANDLE S nguyn 32-bit, nh danh.
HWND S nguyn 32-bit, nh danh.
BYTE Gi tr 8-bit khng du.
WORD S nguyn 16-bit khng du.
DWORD S nguyn 32-bit khng du.
UINT S nguyn khng du 32-bit.
LONG long 32-bit.
BOOL Bool.
LPSTR Con tr chui.
LPCSTR Hng con tr chui.
WPARAM 32-bit.
LPARAM 32-bit.
BSTR Gi tr 32-bit tr n k t.
LPVOID Con tr 32-bit n mt kiu khng xc nh.
LPTSTR Ging nh LPSTR nhng c th chuyn sang dng Unicode
v DBCS.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 11
LPCTSTR Ging nh LPCTSTR nhng c th chuyn sang dng
Unicode v DBCS.
Bng 1.1 M t cc kiu d liu mi
1.4.2. Khun mu chung to mt ng dng
Mt ng dng n gin nht ca Windows bao gm c hai hm l WinMain v x l
ca s WinProc. Do hai hm ny l quan trng v khng th thiu trong cc ng dng
Windows.
Hm WinMain thc hin cc chc nng sau :
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 trnh x l thng ip.
Hm x l WinProc c chc nng x l tt c cc thng ip c lin quan n ca s.

1.4.3. Hm WinMain
Hm chnh ca mt ng dng chy trn Windows l hm WinMain, c khai bo nh
sau:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR
szCmdLine, int iCmdShow);
Chng ta s tm hiu mt hm WinMain mu sau y.
int WINAPI WinMain(HINSTANCE hInstance, 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
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 12
/* nh ngha kiu ca s */
wndclass.style = SC_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc; // Hm th tc ca s
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance; // nh danh ng dng
wndclass.hIcon = LoadIcon (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 = CreateWindow (szAppName, // Tn ca s
"Hello Program", // Tiu
WS_OVERLAPPEDWINDOW, // Kiu ca s
CW_USEDEFAULT, // Ta x
CW_USEDEFAULT, // Ta y
CW_USEDEFAULT, // Chiu rng
CW_USEDEFAULT, // Chiu di
NULL, // Ca s cha
NULL, // Khng c menu
hInstacne, // nh danh ng dng
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 13
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 mt 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
{
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 14
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
} WNDCLASS, *PWNDCLASS;
ngha thuc tnh ca cu trc WNDCLASS c m t trong bng sau :
Thuc tnh ngha ghi ch
style Kiu lp Kt hp nhiu kiu gi tr khc nhau
bng ton t OR.
lpfnWndProc Con tr n th tc window
cbClsExtra S byte c cp pht thm sau
cu trc window-class
Mc nh
cbWndExtra S byte c cp pht thm sau
mt instance ca window
Mc nh
hInstance nh danh cha th tc ca s
ca lp window

hIcon nh danh ca biu tng Dng hm LoadIcon
hCursor nh danh ca con tr chut Dng hm LoadCursor
hbrBackground nh danh ca chi t nn Dng hm GetStockObject
lpszMenuName Tn thc n Tn thc n gn vi ca s, thc dn
ny c khai bo trong tp tin ti
nguyn.
lpszClassName 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 RegisterClass :
ATOM RegisterClass( CONST WNDCLASS * lpWndClass );
To ca s :
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 15
Lp ca s nh ngha nhng c tnh chung ca ca s, cho php to ra nhiu ca 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, // Kiu 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 hWndParent, // nh danh ca ca s cha
MENU hMenu, // nh dang ca thc n
INSTANCE hInstance, // nh danh th hin ng dng
PVOID lpParam // Cc tham s ban u
);
Hin th ca s :
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
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 16
);
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
WndProc.
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:

LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam,
LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
/*X l cc thng ip cn thit vi ng dng*/
switch (msg)
{
case WM_CREATE:
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 17
/*Vit on m khi to ca s*/
return 0;
case WM_PAINT:
/*Vit on m khi t v li ca s*/
hdc = BeginPaint ( hwnd, &ps);
GetClientRect (hwnd, &rect);
DrawText(hdc, "Hello", -1, &rect,
DT_SINGLELINE| DT_CENTER| DT_VCENTER);
EndPaint ( hwnd, &ps);
return 0;
case WM_SIZE:
/*Vit on m khi kch thc ca s thay i*/
return 0;
case WM_DESTROY:
/*Ca s b ng*/
PostQuitMessage (0);
return 0;
}
return DefWindowProc ( hwnd, msg, wParam, lParam);
}
Thng thng chng ta ch chn x l cc thng ip cn thit c lin quan n chc
nng ca ng dng. Cc thng ip khc th giao cho hm x l mc nh lm vic (hm
DefWindowProc).
1.4.5. X l thng ip
Sau khi ca s c hin th trn mn hnh, th chng trnh phi c cc thng tin nhp
ca ngi dng t bn phm hay thit b chut. Windows s duy tr mt hng i thng ip cho
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 18
mi chng trnh chy trn n. Khi mt s kin nhp thng tin xut hin, Windows s dch s
kin ny thnh dng thng ip v a n vo hng i thng ip ca ng dng tng ng.
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 lParam;
DWORD time;
POINT pt;
} MSG, *PMSG;
Kiu d liu POINT l mt kiu cu trc khc, c nh ngha trong tp tin tiu
WINDEF.H, v c m t :
typedef struct tagPOINT
{
LONG x;
LONG y;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 19
} POINT, *PPOINT;
ngha ca cc trng trong cu trc MSG
hwnd : nh danh ca ca s m thng ip pht sinh.
message : nh danh ca thng ip, v d nh thng ip pht sinh khi bm nt
chut tri l WM_LBUTTONDOWN c gi tr 0x0201.
wParam : Tham s 32-bit cha cc thng tin ph thuc vo tng thng ip c
th.
lParam : Tham s 32-bit ph thuc vo thng ip.
time : Thi gian t thng ip trong hng i.
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 ngng v ng dng kt thc. Ngc li th hm s tr v
mt gi tr khc 0 vi cc thng ip khc.
1.4.6. Xy dng mt ng dng u tin
Mt ng dng thng c giao din nn tng l mt khung ca s, to c ca s ny
chng ta thc hin bng cch khai bo mt lp ca s v ng k lp ca s . ca s tng
tc c th chng ta phi vit hm x l ca s WndProc khi tt c cc thng ip lin quan
n ca s s c truyn vo cho hm ny. on chng trnh sau l khung sn cho cc
chng trnh vit trn Windows, bao gm 2 hm chnh l :
WinMain : hm chnh ca chng trnh thc hin cc chc nng :
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.
WndProc : Hm x l thng ip gi n ca s.
/* HELLOWORLD.C */
#include <windows.h>
LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM );
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR
szCmdLine, int iCmdShow )
{
static TCHAR szAppName [] = TEXT ("HelloWorld");
HWND hwnd;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 20
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = 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,
MB_ICONERROR );
return 0;
}
hwnd = CreateWindow ( szAppName, // Tn lp ca s
TEXT (" The Hello World Program"), // Tiu ca s
WS_OVERLAPPEDWINDOW, // Kiu ca s
CW_USEDEFAULT, // Ta x
CW_USEDEFAULT, // Ta y
CW_USEDEFAULT, // Chiu ngang
CW_USEDEFAULT, // Chiu dc
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 21
NULL, // Ca s cha
NULL, // Thc n
hInstance, // nh danh
NULL ); // Tham s
ShowWindow ( hwnd, iCmdShow );
UpdateWindow ( hwnd );
while ( GetMessage ( &msg, NULL, 0, 0) )
{
TranslateMessage (&msg);
DispatchMessage (&msg) ;
}
return msg.wParam;
} // End WinMain
LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam,
LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch ( msg )
{
case WM_CREATE:
return 0;
case WM_PAINT:
hdc = BeginPaint ( hwnd, &ps);
GetClientRect ( hwnd, &rect );
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 22
DrawText( hdc, TEXT("Hello World"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER );
EndPaint ( hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage (0);
return 0;
} // End switch
return DefWindowProc ( hwnd, msg, wParam, lParam);
}
Bng di y lit k ngha ca cc hm c s dng trong 2 hm WinMain v
WndProc ca chng trnh HELLOWORLD.C.
Tn hm ngha
LoadIcon Np mt biu tng s dng trong chng
trnh.
LoadCursor Nap mt con tr chut cho chng trnh.
GetStockObject Nhn mt i tng ha, trong trng hp ca
chng trnh th ly mt chi t t li nn ca ca s.
RegisterClass ng k mt lp ca s cho ca s ng dng trong
chng trnh.
MessageBox Hin th mt thng ip.
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.
GetMesssage Nhn mt thng ip t hng i thng ip.
TranslateMessage Dch thng ip bn phm.
DispatchMessage Gi thng ip n hm x l ca s.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 23
BeginPaint Khi to chc nng v ca ca s.
GetClientRect Ly hnh ch nht lu vng lm vic.
DrawText Hin th mt chui vn bn.
EndPaint Kt thc vic v ca s.
PostQuitMessage a thng ip thot vo hng i thng ip.
DefWindowProc Thc hin vic x l mc nh cc thng ip.
Bng 1.3 M t cc hm c s dng trong chng trnh minh ha
1.4.7. Mt s qui c t tn bin
Khi vit mt chng trnh ng dng ln vi nhiu kiu khai bo bin khc nhau, nu vic
khai bo cc tn bin khng thch hp s lm cho chng trnh phc tp thm, i khi lm kh
ngay c ngi vit ra cc m ngun . V vy cc lp trnh vin thng qui c sao cho mt tn
bin va gi c chc nng ca n va xc nh c kiu loi. C rt nhiu phong cch t
tn, trong s th c phong cch t tn theo c php Hungary (Hungarian Notation) l c
dng nhiu nht. Qui c rt n gin l bt u tn bin th vit ch thng v cc ch u th
hin kiu d liu ca bin, v c gi l cc tin t. V d nh bin szCmdLine l mt bin lu
chui nhp t dng lnh, sz l th hin cho bin kiu chui kt thc k t 0, ngoi ra ta hay thy
hInstance v hPrevInstance, trong h vit tt cho kiu handle, kiu d liu nguyn thng
c khai bo dng tin t l ch i.
C php Hungary ny gip cho ngi lp trnh rt nhiu trong khu kim tra li ca
chng trnh, v khi nhn vo hai bin ta c th d dng nhn bit c s khng tng thch
gia hai kiu d liu th hin trong tn ca hai bin.
Bng m t mt s tin t khi t tn bin ca cc kiu d liu :
Tin t Kiu d liu
c char, WCHAR, TCHAR
by BYTE
n short
i int
x,y bin lu ta x, y
b BOOL
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 24
w WORD
l long
dw DWORD
s string
sz chui kt thc bi k t 0
h handle
p pointer
Lpsz con tr di chui k t kt thc k t 0
Bng 1.4 M t kiu t tn bin


























T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 25
Chng 2
HP THOI V THANH TRNH N
2.1. M U
Hp thoi (dialog) v thanh trnh n (menu) l cc thnh phn khng th thiu trong
vic t chc giao tip gia ngi s dng v chng trnh. Hp thoi c xem nh l mt loi
ca s c bit, l cng c mm do, linh hot a thng tin vo chng trnh mt cch d
dng. Trong khi menu l cng c gip ngi dng thc hin cc thao tc n gin hn, thng
qua cc nhm chc nng thng s dng.
2.2. HP THOI
Hp thoi phi hp gia ngi s dng vi chng trnh bng mt s phn t iu khin
m cc phn t ny nhn nhim v thu nhn thng tin t ngi dng v cung cp thng tin n
ngi dng khi ngi dng tc ng n cc phn t iu khin. Cc phn t iu khin ny
nhn ca s cha l mt hp thoi. Cc phn t iu khin thng l cc Button, List Box,
Combo Box, Check Box, Radio Button, Edit Box, Scroll Bar, Static.
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 WndProc 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, 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. Hp thoi trng 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.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 26

Hnh 2.1 Hp thoi n gin
on code chng trnh nh sau (V d 2.1):
DIALOG.CPP (trch dn)
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK DialogProc (HWND, UINT, WPARAM, LPARAM) ;
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
static HINSTANCE hInstance ;
switch (message)
{
case WM_CREATE :
hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
return 0 ;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDC_SHOW :
DialogBox (hInstance, TEXT ("DIALOG1"),
hwnd, DialogProc) ;
break;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 27
}
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
/*----------------------hm x l thng ip hp thoi-------------------------------*/
BOOL CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM
lParam)
{
switch (message)
{
case WM_INITDIALOG :
return TRUE ;
case WM_COMMAND :
switch (LOWORD (wParam))
{
case IDOK :
EndDialog (hDlg, 0) ;
return TRUE ;
}
break ;
}
return FALSE ;
}
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 28
DIALOG1.RC (trch dn)
/*---------------------------------------dialog--------------------------------------------*/
DIALOG1 DIALOG DISCARDABLE 40, 20, 164, 89
STYLE DS_MODALFRAME | 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,20,20
END
/* -----------------------------------------Menu------------------------------------------*/
MENU1 MENU DISCARDABLE
BEGIN
POPUP "Dialog1"
BEGIN
MENUITEM "&Show", IDC_SHOW
END
END
2.2.1.2. Hp thoi v to mu template cho hp thoi
Trong v d 2.1 trn, ta to hp thoi bng cch dng cc cu lnh cha trong file ti
nguyn DIALOG1.RC. Cch lm ny gip ta hiu cu trc lnh ca Windows, tuy nhin cng c
Visual C++ Developer Studio, ta c th thit lp mt hp thoi trc quan hn nh sau : Chn
Insert t thc n Resource View thm mt hp thoi, mn hnh c th hin nh trong
hnh 2.2.
Miscrosoft s hin th hp thoi trc quan cng vi thanh cng c bn c th thm cc
thnh phn iu khin vo hp thoi. Chng ta c th iu chnh cc thuc tnh ca hp thoi
nh tn hp thoi, ID hp thoi, v tr hin th ca hp thoi trn ca s chnh, kch thc ch v
kiu ch th hin trn hp thoi...vv bng cch nhn chut phi trn hp thoi th ca s
Properties ca hp thoi c hin th (hnh 2.3).
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 29

Hnh 2.2 Thm mt Dialog trong Resource View

Hnh 2.3 Hp thoi Properties ca Dialog
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 trnh 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 trc
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
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 30
STYLE DS_MODALFRAME | 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 WS_POPUP v DS_MODALFRAME ngoi ra cn
c cc hng WS_CAPTION, WS_MAXIMIZEBOX, WS_MINIMIZEBOX, WS_POPUP,
WS_VSCROLL, WS_HSCROLL, WS_SYSMENU, .... Lnh BEGIN v lnh END c th
c thay bng { v }. Trong v d trn, hp thoi s dng 3 kiu iu khin l
DEFPUSHBUTTON (kiu nt bm mc nh), ICON (biu tng), v kiu CTEXT (vn bn
c canh gia). Mt kiu iu khin c khai bo tng qut nh sau.
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 WS_ 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.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 31
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 th 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 WM_INITDIALOG dng 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 trc
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 phm tt c quy nh trong chng trnh chnh.
2.2.1.4. Gi hin th hp thoi v cc vn lin quan
Trong th tc WndProc khi x l thng ip WM_CREATE Windows ly v nh danh
hInstance ca chng trnh v lu n trong bin tnh hInstance nh sau.
hInstance = ((LPCREATESTRUCT) lParam)->hInstance;
Dialog1 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 trn 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 (hInstance, TEXT ("DIALOG1"), hwnd, DialogProc)
i s u tin ca hm ny phi l hInstance 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 ch
ca th tc x l cc thng ip ca 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)
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 32
Tuy Visual C++ Developer cung cp cho chng ta b son tho hp thoi trc quan
m ta khng cn phi quan tm n ni dung trong tp tin .RC. Tuy nhin vi cch thit k mt
hp thoi bng cc cu lnh gip chng ta hiu chi tit hn cu trc lnh ca Windows hn th
na tp lnh dng thit k hp thoi phong ph v a dng hn rt nhiu so vi nhng g m
ta trc quan c trn b son tho ca Developer. Bng cch s dng cc lnh c bit trong
tp tin Resource editor ca Visual C++ ta c th to ra nhiu i tng m trong b son tho
khng c.
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 | WS_POPUP | WS_CAPTION
CAPTION "Hello Dialog1"
C th dng cch khc thm tiu cho hp thoi, bng cch trong khi x l thng
ip WM_INITDIALOG thm vo dng lnh:
SetWindowText(hDlg,TEXT("Hello Dialog"));
Khi hp thoi c tiu ri, c th thm cc chc nng phng to v thu nh hp thoi
bng hng WS_MINIMIZEBOX, WS_MAXIMIZEBOX.
C th thm trnh n vo hp thoi nu mun bng on lnh.
DIALOG1 DIALOG DISCARDABLE 40, 20, 164, 90
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
CAPTION "Hello Dialog1"
MENU MENU1
Trong MENU1 l tn ca trnh n ta to. Trong Visual C++ Developer ta ch cn
chn tn thc n trong mc Menu nh hnh sau.

T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 33
Hnh 2.4 Chn menu trong Dialog Propertier
T ca s Properties trn th chn mc "Font" nh Font ch cho hp thoi.
Gi hm DialogBoxIndirect to ra mt hp thoi m khng cn dng resource script.
Hp thoi to ra bng hm ny trong khi chng trnh ang thc hin c gi l hp thoi to
t ng.
Trong v d 3-1 ta ch dng 3 kiu iu khin l cc kiu ICON, CTEXT,
DEFPUSHBUTTON. Ngoi ra cn c cc kiu iu khin c lit k trong bng sau.
Kiu iu khin Lp ca s Kiu ca s
PUSHBUTTON Button BS_BUSHBUTTON
DEFPUSHBUTTON Button BS_DEFBUSHBUTTON | WS_TABSTOP
CHECKBOX Button BS_CHECKBOX | WS_TABSTOP
RADIOBUTTON Button BS_RADIOBUTTON | WS_TABSTOP
GROUPBOX Button BS_GROUPBOX | WS_TABSTOP
LTEXT Static SS_LEFT | WS_GROUP
CTEXT Static SS_CENTER | WS_GROUP
RTEXT Static SS_RIGHT | WS_GROUP
ICON Static SS_ICON
EDITTEXT Edit ES_LEFT | WS_BORDER | WS_STABSTOP
SCROLLBAR Scrollbar SBS_HORZ
LISTBOX Listbox LBS_NOTIFY | WS_BORDER | WS_VSCROLL
COMBOBOX Combobox CBS_SIMPLE | WS_TABSTOP
Bng 2.1 Cc kiu iu khin
Cc kiu iu khin c khai bo trong resource script c dng nh sau, ngoi tr kiu
iu khin LISTBOX, COMBOBOX, SCROLLBAR, EDITTEXT.
Control-type "text", id, xPos, yPos, xWidth, yHeight, iStyle
Cc kiu iu khin LISTBOX, COMBOBOX, SCROLLBAR, EDITTEXT c khai
bo trong resource script vi cu trc nh trn nhng khng c trng "text".
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 34
Thm thuc tnh cho cc kiu iu khin bng cch thay i tham s iStyle. V d ta
mun to radio button vi chui din t nm bn tri ca nt th ta gn trng iStyle bng
BS_LEFTTEXT c th nh sau.
RADIOBUTTON Radio1",IDC_RADIO1,106,10,53,15,BS_LEFTTEXT
Trong resource script ta cng c th to mt kiu iu khin bng lnh tng qut sau.
CONTROL "text", id, "class", iStyle, xPos, yPos, xWidth, yHeight
Trong class l tn lp mun to v d thay v to mt radio button bng cu lnh.
RADIOBUTTON "Radio1",IDC_RADIO1,106,10,53,15,BS_LEFTTEXT
Thay bng on lnh sau:
CONTROL"Radio1",IDC_RADIO1,"button",106,10,53,15,BS_LEFTTEXT
2.2.1.5. V d chng trnh v hp thoi.
minh ha cho vic trao i thng ip gia cc thnh phn iu khin bn trong hp
thoi (ng vai tr l mt ca s cha) vi cc thnh phn iu khin con nm bn trong hp
thoi, v c ch qun l hp thoi ca Windows. Chng ta tin hnh xem xt v d 2-2. Kt qu
thc hin ca chng trnh nh trong hnh 2.5.
Ca 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
trong 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 tnh 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.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 35

Hnh 2.5 Minh ha trao i thng ip qua cc iu khin
Chng trnh minh ha (V d 2.2) :
DIALOG2.CPP (trch dn)
#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK DialogProc (HWND, UINT, WPARAM, LPARAM);
int iCurrentColor = IDC_BLACK, iCurrentFigure = IDC_RECT;
int iCurrenBrush = IDC_HS_BDIAGONAL;
void PaintWindow(HWND hwnd, int iColor, int iFigure, int iBrush)
{
static COLORREF crColor[8] = { RGB(0, 0, 0), RGB(0, 0, 255), RGB(0, 255, 0), RGB(0, 255,
255), RGB(255, 0, 0), RGB(255, 0, 255), RGB(255, 255, 0), RGB(255, 255, 255) } ;
HBRUSH hBrush,hbrush;
HDC hdc ;
RECT rect ;
hdc = GetDC (hwnd) ;
GetClientRect (hwnd, &rect) ;
if(iBrush==IDC_HS_BDIAGONAL)
hbrush=CreateHatchBrush(HS_BDIAGONAL,
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 36
crColor[iColor-IDC_BLACK]);
if(iBrush == IDC_HS_CROSS)
hbrush=CreateHatchBrush(HS_CROSS,
crColor[iColor - IDC_BLACK]);
if(iBrush == IDC_HS_DIAGCROSS)
hbrush=CreateHatchBrush(HS_DIAGCROSS,
crColor[iColor - IDC_BLACK]);
if(iBrush == IDC_HS_FDIAGONAL)
hbrush=CreateHatchBrush(HS_FDIAGONAL,
crColor[iColor - IDC_BLACK]);
if(iBrush == IDC_HS_HORIZONTAL)
hbrush=CreateHatchBrush(HS_HORIZONTAL,
crColor[iColor - IDC_BLACK]);
if(iBrush == IDC_HS_VERTICAL)
hbrush=CreateHatchBrush(HS_BDIAGONAL,
crColor[iColor - IDC_BLACK]);
hBrush = (HBRUSH) SelectObject (hdc, hbrush) ;
if (iFigure == IDC_RECT)
Rectangle (hdc, rect.left, rect.top, rect.right, rect.bottom) ;
else
Ellipse(hdc, rect.left, rect.top, rect.right, rect.bottom) ;
DeleteObject (SelectObject (hdc, hBrush)) ;
ReleaseDC (hwnd, hdc) ;
}
void PaintTheBlock(HWND hCtrl, int iColor, int iFigure, int iBrush)
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 37
{
InvalidateRect (hCtrl, NULL, TRUE) ;
UpdateWindow (hCtrl) ;
PaintWindow (hCtrl, iColor, iFigure,iBrush) ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
static HINSTANCE hInstance ;
PAINTSTRUCT ps ;
switch (message)
{
case WM_CREATE:
hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
return 0 ;
case WM_COMMAND:
switch (LOWORD (wParam))
{
case IDC_SHOW:
if (DialogBox (hInstance, TEXT ("DIALOG"), hwnd, DialogProc))
InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ;
}
break;
case WM_PAINT:
BeginPaint (hwnd, &ps) ;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 38
EndPaint (hwnd, &ps) ;
PaintWindow (hwnd, iCurrentColor, iCurrentFigure, iCurrenBrush) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
BOOL CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM wParam,
LPARAM lParam)
{
static HWND hCtrlBlock ;
static int iColor, iFigure,iBrush;
switch (message)
{
case WM_INITDIALOG:
iColor = iCurrentColor ;
iFigure = iCurrentFigure ;
iBrush = iCurrenBrush;
CheckRadioButton(hDlg,IDC_BLACK,IDC_WHITE, iColor);
CheckRadioButton(hDlg,IDC_RECT,IDC_ELLIPSE,iFigure);CheckRadioButton (hDlg,
IDC_HS_BDIAGONAL, IDC_HS_VERTICAL, iBrush);
hCtrlBlock = GetDlgItem (hDlg, IDC_PAINT) ;
SetFocus (GetDlgItem (hDlg, iColor)) ;
return FALSE ;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 39
case WM_COMMAND:
switch (LOWORD (wParam))
{
case IDOK:
iCurrentColor = iColor ;
iCurrentFigure = iFigure ;
iCurrenBrush = iBrush;
EndDialog (hDlg, TRUE) ;
return TRUE ;
case IDCANCEL:
EndDialog (hDlg, FALSE) ;
return TRUE ;
case IDC_BLACK:
case IDC_RED:
case IDC_GREEN:
case IDC_YELLOW:
case IDC_BLUE:
case IDC_MAGENTA:
case IDC_CYAN:
case IDC_WHITE:
iColor = LOWORD (wParam) ;
CheckRadioButton (hDlg, IDC_BLACK, IDC_WHITE, LOWORD (wParam)) ;
PaintTheBlock (hCtrlBlock, iColor, iFigure,iBrush) ;
return TRUE ;
case IDC_RECT:
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 40
case IDC_ELLIPSE:
iFigure = LOWORD (wParam) ;
CheckRadioButton (hDlg, IDC_RECT, IDC_ELLIPSE, LOWORD (wParam)) ;
PaintTheBlock (hCtrlBlock, iColor, iFigure,iBrush) ;
return TRUE ;
case IDC_HS_BDIAGONAL:
case IDC_HS_CROSS:
case IDC_HS_DIAGCROSS:
case IDC_HS_FDIAGONAL:
case IDC_HS_HORIZONTAL:
case IDC_HS_VERTICAL:
iBrush = LOWORD (wParam)
CheckRadioButton(hDlg,IDC_HS_BDIAGONAL,IDC_HS_VERTICAL, LOWORD
(wParam)) ;
PaintTheBlock (hCtrlBlock, iColor, iFigure,iBrush) ;
return TRUE ;
}
break;
case WM_PAINT:
PaintTheBlock (hCtrlBlock, iColor, iFigure,iBrush) ;
break ;
}
return FALSE ;
}
2.2.1.6. Lm vic vi cc thnh phn iu khin trong hp thoi
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 41
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 lParam 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 trng thi ca tt 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
SendMessage (hwndCtrl ,MB_SETCHECK, 1, 0);
V ngc li mun b chn mt nt no th dng hm.
SendMessage (hwndCtrl, MB_SETCHECK, 0, 0);
Trong i s hwndCtrl l handle ca ca s iu khin con.
Chng ta c th gp rc ri khi mun s dng hai hm trn bi v khng bit handle ca
cc thnh phn iu khin con. Chng ta ch bit handle ca cc thnh phn iu khin con khi
nhn c thng ip WM_COMMAND. gii quyt c vng mc trn, trong Windows
cung cp mt hm ly handle ca ca s con khi bit c nh danh ID ca n bng hm.
hwndCtrl = GetDlgItem (hDlg, id); // hDlg l handle ca hp thoi
C th ly c ch danh ID ca thnh phn iu khin con khi bit c handle ca n
bng hm sau.
id = GetWindowLong (hwndCtrl, GWL_ID);
Tuy nhin, chng ta c th qun l ID ca cc thnh phn iu khin con, cn handle l
do Windows cp ngu nhin, do vic dng handle nhn v ID ca cc thnh phn iu
khin con l t dng n.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 42
Khi hp thoi nhn c thng ip WM_COMAND th chng ta phi kim tra nt
radio no c chn (xc nh mu cn chn), v tin hnh b chn cc nt khc bng on lnh
sau.
case WM_COMMAND:
switch (LOWORD (wParam))
{
case IDC_BLACK:
case IDC_RED:
case IDC_GREEN:
case IDC_YELLOW:
case IDC_BLUE:
case IDC_MAGENTA:
case IDC_CYAN:
case IDC_WHITE:
iColor = LOWORD (wParam) ;
for( i = IDC_BLACK, i < IDC_WHITE,i++)
SendMessage(GetDlgItem(hDlg, i),MB_SETCHECK, i == LOWORD( wParam), 0).
return TRUE ;
}
Trong iColor dng lu gi tr mu hin hnh c chn. Vng lp for dng
kim tra trng thi ca tt c cc nt radio thng qua ID ca chng. Hm GetDlgItem dng
ly handle ca nt c chn v lu vo bin i. Hm SendMessage dng gi thng ip
MB_SETCHECK ti cc nt radio. Nu word thp ca i s wParam bng ch danh ID ca
nt c chn th nt c nh du v cc nt khc s khng c chn.
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 tr
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 43
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 ;
EndDialog (hDlg, TRUE) ;
return TRUE ;
case IDCANCEL:
EndDialog (hDlg, FALSE) ;
return TRUE ;

}
Hm EndDialog dng kt thc v ng hp thoi.Trong trng hp nhn nt OK th
hai gi tr iCurrentColor v gi tr iCurrentFigure c lu li cho ca s cha (c hai bin trn
u l bin ton cc). Ch rng, hai gi tr khc bit (TRUE, FALSE) ca i s th hai trong
li gi hm EndDialog. Gi tr ny s c tr ngc v t li gi hm DialogBox trong th tc
WndProc.
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_SHOW:
if(DialogBox(hInstance, TEXT("DIALOG"), hwnd, DialogProc))
InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ;
}
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 44
break;
C ngha nu hm DialogBox tr v gi tr TRUE, tc nt OK c nhn. Lc th tc
WndProc s cp nht li ni dung ca ca s chnh, bng cch ghi li s thay i gi tr ca hai
bin ton cc iCurrentColor v gi tr iCurrentFigure dng v li hnh ch nht hay hnh
ellipse vi mu c chn l iCurrentColor.
V ngc li nu nhn nt Cancel th gi tr iCurrentColor v gi tr iCurrentFigure s
khng thay i, tc th tc WndProc s dng li gi tr c.
Gi tr TRUE hay FALSE thng bo cho ca s chnh bit rng ngi dng t chi hay
chp thun ty chn trong hp thoi. V TRUE v FALSE c kiu s nguyn (1,0) nn i s th
hai trong li gi hm EndDialog c kiu s nguyn (int). Do kt qu tr v ca hm ny cng
c kiu l s nguyn. V d nu bn bm nt OK th tr tr v ca hm bng 1. Nu bn bm nt
Cancel th tr tr v ca hm bng 0, v nu trong chng trnh c s dng nt bm mc nh
Inoge th khi bm nt ny tr tr ca hm s l 2.
2.2.1.7. V trong hp thoi
Trong v d 2.2 chng ta dng phng php v trn hp thoi y l cng vic khc
thng. By gi ta tm hiu cng vic tin hnh nh th no.
Trong file RESOURCE.RC c thnh phn iu khin l.
LTEXT "",IDC_PAINT, 5, 22, 92, 93
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(hCtrl, iColor, iFigure);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 45
}
Hm InvalidateRect(hCtrl, 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 hCtrl, 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
GetClientRect.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 IDC_PAINT c v li. Cch x l thng ip WM_PAINT ging nh
th tc x l WndProc ca ca s chnh, nhng th tc x l hp thoi khng gi hm
BeginPaint v hm EndPaint bi v n khng t v ln ca s ca chnh n.
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 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.

2.2.2. Hp thoi khng trng thi
Trong phn trn tho lun loi hp thoi, th nht l hp thoi trng thi, v by
gi tip tc tho lun n loi hp thoi th hai, hp thoi khng trng thi (modeless). hiu
r cch s dng cng nh nhng thao tc trn hp thoi khng trng thi, chng ta th t tm
hiu qua cc mc sau.
2.2.2.1. S khc nhau gia hp thoi trng thi v hp thoi khng trng thi
Hp thoi khng trng thi khc vi hp thoi trng thi ch. Sau khi hin th hp thoi
khng trng thi chng ta c th chuyn thao tc n cc ca s khc m khng cn ng hp
thoi dng ny li. iu ny thun tin i vi ngi dng khi ngi dng mun trc quan cc
s thao tc cng mt lc. V d nh trnh son tho Studio Deverloper bn c th thao tc qua
li gia hai hp thoi, l hp thoi bn cn thit k v mt hp thoi cha cc loi iu khin
m bn dng thit k. Vi cch lm ny gip ngi dng trc quan hn so vi cch ch cho
php ngi dng ch thao tc trn mt ca s.
S dng hm DialogBox gi hp thoi trng thi v ch nhn c kt qu tr v khi
hp thoi ny b ng cng vi hm DialogBox kt thc. Gi tr tr v ca hm ny do i s th
hai ca hm kt thc hp thoi (EndDialog) quy nh. Cn i vi hp thoi khng trng thi th
c to ra bng hm.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 46
hDlgModeless=CreateDialog(hInstance, szTemplate, hwndParent, DialogProc);
Nhng hm ny tr quyn iu khin v cho ni gi ngay lp tc v gi tr tr v l
handle ca ca hp thoi hin hnh. V c th c nhiu ca s thao tc cng mt lc nn bn lc
handle ny d dng truy cp khi bn cn.
Phi t ch WS_VISIBLE cho hp thoi khng trng thi, bng cch chn mc
More Styles trong ca s Properties ca hp thoi. Nu nh khng bt ch VISIBLE ln th
chng trnh phi c cu lnh ShowWindow sau li gi hm CreateDialog khi mun hin th
hp thoi dng ny ln mn hnh.
hDlgModeless=CreateDialog(hInstance, szTemplate, hwndParent, DialogProc);
ShowWindow(hDlgModeless,SW_SHOW);
Cc thng ip gi n hp thoi dng modal do trnh qun l Windows iu khin cng
khc vi cc thng ip gi n hp thoi dng modeless phi i qua hng i ca chng trnh
chnh. Bi v cc thng ip ca hp thoi dng modeless dng chung vi cc thng ip ca
ca s chng trnh chnh. Nh vy chng ta phi lc ra thng ip no l thng ip gi n
hp thoi khi thao tc trn hp thoi t trong vng lp nhn thng ip. lm c iu ny
chng ta dng handle ca hp thoi (lu trong 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 || !IsDialogMessage (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 tr v gi tr TRUE, cn ngc li th
hm tr v gi tr FALSE. Nu dng thm chc nng phm tng tc th on chng trnh trn c
vit li nh sau.
while(GetMessage(&msg, NULL, 0, 0))
{
if (hDlgModeless==0 || !IsDialogMessage(hDlgModeless, &msg);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 47
{
if(TranslateAccelerator (hwnd, hAccel, &msg)
{
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.
2.2.2.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.

Hnh 2.6 Minh ha hp thoi khng trng thi
Khi dng chut chn loi hnh v trn radio button, loi hnh v c chn s v cng
lc ln control tnh ca hp thoi v ca s chnh. Dng chut chn mu t cho hnh v c
chn, bng cch r chut ln 3 thanh cun Scrollbar.
Chng trnh minh ha (V d 2.3) :
*MODELESS.CPP (trch dn)
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 48
void PaintWindow (HWND hwnd, int iColor[], int iFigure)
{
HBRUSH hBrush ;
HDC hdc ;
RECT rect ;
hdc = GetDC(hwnd) ;
GetClientRect (hwnd, &rect) ;
hBrush = CreateSolidBrush(RGB(iColor[0], iColor[1], iColor[2]));
hBrush = (HBRUSH) SelectObject (hdc, hBrush) ;
if (iFigure == IDC_RECT)
Rectangle (hdc, rect.left, rect.top, rect.right, rect.bottom) ;
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
lParam)
{
switch (message)
{
case WM_PAINT:
PaintTheBlock(hwnd, iColor, iFigure) ;
return 0 ;
case WM_DESTROY :
DeleteObject((HGDIOBJ)SetClassLong(hwnd, GCL_HBRBACKGROUND,(LONG)GetStockObject
(WHITE_BRUSH))) ;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 49
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
void PaintTheBlock (HWND hCtrl, int iColor[], int iFigure)
{
InvalidateRect (hCtrl, NULL, TRUE);
UpdateWindow (hCtrl) ;
PaintWindow (hCtrl, iColor, iFigure) ;
}
BOOL CALLBACK ColorScrDlg (HWND hDlg, UINT message, WPARAM wParam, LPARAM
lParam)
{
HWND hwndParent, hCtrl ;
static HWND hCtrlBlock ;
int iCtrlID, iIndex ;
switch (message)
{
case WM_INITDIALOG :
hCtrlBlock = GetDlgItem (hDlg, IDC_PAINT) ;
for (iCtrlID = 10 ; iCtrlID < 13 ; iCtrlID++)
{
hCtrl = GetDlgItem (hDlg, iCtrlID) ;
PaintTheBlock (hCtrlBlock, iColor, iFigure) ;
PaintTheBlock (hwndParent, iColor, iFigure) ;
SetScrollRange (hCtrl, SB_CTL, 0, 255, FALSE) ;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 50
SetScrollPos(hCtrl, SB_CTL, 0, FALSE) ;
}
return TRUE ;
case WM_COMMAND:
{
switch( LOWORD(wParam))
{
case IDC_RECT:
case IDC_ELLIPSE:
iFigure = LOWORD(wParam) ;
hwndParent = GetParent (hDlg) ;
CheckRadioButton(hDlg, IDC_RECT, IDC_ELLIPSE, LOWORD (wParam)) ;
PaintTheBlock(hCtrlBlock, iColor, iFigure) ;
PaintTheBlock (hwndParent, iColor, iFigure) ;
return TRUE ;
}
break;
}
case WM_VSCROLL :
hCtrl = (HWND) lParam ;
iCtrlID = GetWindowLong (hCtrl, GWL_ID) ;
iIndex = iCtrlID - 10 ;
hwndParent = GetParent (hDlg) ;
PaintTheBlock (hCtrlBlock, iColor, iFigure) ;
PaintTheBlock (hwndParent, iColor, iFigure) ;
switch (LOWORD (wParam))
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 51
{
case SB_PAGEDOWN :
iColor[iIndex] += 15 ;
case SB_LINEDOWN :
iColor[iIndex] = min (255, iColor[iIndex] + 1) ;
break;
case SB_PAGEUP :
iColor[iIndex] -= 15 ;
case SB_LINEUP :
iColor[iIndex] = max (0, iColor[iIndex] - 1);
break;
case SB_TOP :
iColor[iIndex] = 0 ;
break;
case SB_BOTTOM :
iColor[iIndex] = 255 ;
break;
case SB_THUMBPOSITION :
case SB_THUMBTRACK :
iColor[iIndex] = HIWORD (wParam) ;
break;
default :
return FALSE ;
}
SetScrollPos(hCtrl, SB_CTL, iColor[iIndex], TRUE) ;
SetDlgItemInt (hDlg, iCtrlID + 3, iColor[iIndex], FALSE) ;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 52
InvalidateRect(hwndParent,NULL,TRUE);
DeleteObject ( (HGDIOBJ)SetClassLong( hwndParent, GCL_HBRBACKGROUND, (LONG)
CreateSolidBrush( RGB(iColor[0], iColor[1], iColor[2]) ) ) ) ;
return TRUE ;
case WM_PAINT:
PaintTheBlock(hCtrlBlock, iColor, iFigure) ;
break;
}
return FALSE ;
}

2.3. MENU
Trong giao din ng dng Windows, thnh phn quan trng thng khng th thiu l
menu ca chng trnh. Menu xut hin ngay di thanh tiu ca chng trnh ng dng.
Ngoi ra trong mt s ng dng thanh menu c th di chuyn c.
Tht ra menu cng kh n gin, v chng c t chc thnh cc nhm trn thanh chnh
(File, Edit, View,), mi mc lit k trong menu chnh c th cha mt hay nhiu mc lit k
gi l menu popup hay dropdown, v vi mi mc lit k trong menu popup ny c th c cc
mc con ca n,.
Cc mc lit k trn menu c th dng kch hot mt lnh, hay chn trng thi (check,
uncheck). Cc mc lit k trn menu c 3 dng: c hiu lc (enabled), khng c hiu lc
(disabled), v mu xm (grayed). Vi quan im lp trnh th ta ch cn hai trng thi l c hiu
lc v khng c hiu lc m thi, do trng thi mu xm s ch cho ngi dng bit l trng
thi ca mc lit k c hiu lc hay khng. V vy khi vit chng trnh nhng mc no khng
c hiu lc th ta thit lp trng thi mu xm, khi ngi dng s bit rng mc lit k
khng c hiu lc.
2.3.1. Thit lp Menu
to mt menu v a vo chng trnh bao gm cc bc sau:
*To menu trong tp tin ti nguyn *.RC: to menu trong tp tin ti nguyn, thng
c 2 cch chnh l: dng mt trnh son tho m tp tin ti nguyn v son tho theo cu trc
tp tin RC cung cp cho ti nguyn menu. Thng thng, cch ny t s dng, v cc mi trng
pht trin C trn Windows (Borland C for Windows, Visual C) u cung cp cc cng c cho
php to menu mt cch d dng.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 53
*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 lpszMenuName ca cu 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 ( hInstance, 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.
hwnd = CreateWindow ( TEXT("MyClass"), TEXT("Window Caption"),
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, NULL, hMenu, hInstance, 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 trnh 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 tra 16 bit
thp ca tham s wParam l xc nh c ID ca mc lit k no trn menu c chn.
2.3.2. V d minh ha Menu
*Tp tin ti nguyn cha khai bo menu : MENUDEMO.RC
MENUDEMO MENU DISCARDABLE
BEGIN
POPUP "&File"
BEGIN
MENUITEM "&New", IDM_FILE_NEW
MENUITEM "&Open", IDM_FILE_OPEN
MENUITEM "&Save", IDM_FILE_SAVE
MENUITEM "Save &As...", IDM_FILE_SAVE_AS
MENUITEM SEPARATOR
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 54
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
MENUITEM "&Paste", IDM_EDIT_PASTE
MENUITEM "De&lete", IDM_EDIT_CLEAR
END
POPUP "&Background"
BEGIN
MENUITEM "&White", IDM_BKGND_WHITE, CHECKED
MENUITEM "&Light Gray", IDM_BKGND_LTGRAY
MENUITEM "&Gray", IDM_BKGND_GRAY
MENUITEM "&Dark Gray", IDM_BKGND_DKGRAY
MENUITEM "&Black", IDM_BKGND_BLACK
END
POPUP "&Help"
BEGIN
MENUITEM "&Help...", IDM_APP_HELP
MENUITEM "&About ...", IDM_APP_ABOUT
END
END
*Tp tin tiu cha cc nh ngha : MENUDEMO.H
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 55
#define IDM_FILE_NEW 40001
#define IDM_FILE_OPEN 40002
#define IDM_FILE_SAVE 40003
#define IDM_FILE_SAVE_AS 40004
#define IDM_APP_EXIT 40005
#define IDM_EDIT_UNDO 40006
#define IDM_EDIT_CUT 40007
#define IDM_EDIT_COPY 40008
#define IDM_EDIT_PASTE 40009
#define IDM_EDIT_CLEAR 40010
#define IDM_BKGND_WHITE 40011
#define IDM_BKGND_LTGRAY 40012
#define IDM_BKGND_GRAY 40013
#define IDM_BKGND_DKGRAY 40014
#define IDM_BKGND_BLACK 40015
#define IDM_APP_HELP 40018
#define IDM_APP_ABOUT 40019
*Tp tin cha m ngun : MENUDEMO.C
#include <windows.h>
#include "menudemo.h"
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
/* Khai bo tn dng chung cho ccti nguyn trong chng trnh.*/
TCHAR szAppName[] = TEXT ("MenuDemo") ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int
iCmdShow)
{
HWND hwnd;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 56
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground =
(HBRUSH)GetStockObject(WHITE_BRUSH) ;
wndclass.lpszMenuName = szAppName ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows "), szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, TEXT("Menu Demonstration"),
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 57
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
/* Khao bo danh sch cc mu chi t, cc hng ny c nh ngha trong file WINGDI.H */
static int idColor[5] = { WHITE_BRUSH, LTGRAY_BRUSH, GRAY_BRUSH, DKGRAY_BRUSH,
BLACK_BRUSH } ;
static int iSelection = IDM_BKGND_WHITE ;
HMENU hMenu ;
switch (message)
{
case WM_COMMAND:
hMenu = GetMenu (hwnd) ; // Ly nh danh ca menu
switch (LOWORD (wParam)) // Kim tra nh danh mc chn
{
case IDM_FILE_NEW:
case IDM_FILE_OPEN:
case IDM_FILE_SAVE:
case IDM_FILE_SAVE_AS:
MessageBeep(0) ; //Pht ra ting ku bp
return 0 ;
case IDM_APP_EXIT:
/*Gi thng ip ng ng dng li*/
SendMessage (hwnd, WM_CLOSE, 0, 0) ;
return 0 ;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 58
case IDM_EDIT_UNDO:
case IDM_EDIT_CUT:
case IDM_EDIT_COPY:
case IDM_EDIT_PASTE:
case IDM_EDIT_CLEAR:
MessageBeep (0) ;
return 0 ;
case IDM_BKGND_WHITE:
case IDM_BKGND_LTGRAY:
case IDM_BKGND_GRAY:
case IDM_BKGND_DKGRAY:
case IDM_BKGND_BLACK:
/* B check ca mc chn trc */
CheckMenuItem(hMenu,iSelection, MF_UNCHECKED);
iSelection = LOWORD (wParam) ; /*Ly ID mc mi*/
/* Check mc chn mi*/
CheckMenuItem (hMenu, iSelection, MF_CHECKED) ;
/* Thit lp mu tng ng vi mc chn mi*/
SetClassLong(hwnd,GCL_HBRBACKGROUND, (LONG) GetStockObject(idColor[iSelection-
IDM_BKGND_WHITE]));
InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ;
case IDM_APP_HELP:
MessageBox(hwnd, TEXT("Help not yet implemented!"), szAppName, MB_ICONEXCLAMATION |
MB_OK) ;
return 0 ;
case IDM_APP_ABOUT:
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 59
MessageBox (hwnd, TEXT ("Menu Demonstration Program\n (c) Charles Petzold, 1998"), szAppName,
MB_ICONINFORMATION | MB_OK) ;
return 0 ;
}
break;
case WM_DESTROY:
PostQuitMessage(0) ;
return 0 ;
}
return DefWindowProc(hwnd, message, wParam, lParam) ;
}











T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 60
Chng 3
CC I TNG IU KHIN
3.1. M U
Cc i tng iu khin (control) l cc thnh phn tng tc trc 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 ng 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 :
Lp Button (nt bm).
Lp Static (tnh).
Lp Edit Box (son tho).
Lp List Box (danh sch).
Lp Combo Box.
Lp Scroll Bar (thanh cun).
3.2. GII THIU TNG QUAN
Mt kiu iu khin c xem nh l mt ca s con. C th to nhiu ca s con trong
cng mt ca s cha. Cc ca s con xc nh handle ca s ca cha bng cch gi hm :
hwndParent = GetParent (hwnd);
hwnd l handle ca ca s con cn ly handle ca ca s cha. V khi ly c handle
ca ca s cha, ca s con c quyn gi cc thng ip n ca s cha thng qua hm.
SendMessage(hwndParent, message, wParam, lParam);
message l thng ip cn gi n th tc x l ca ca s cha. wParam l ch danh ID
ca ca s con, cn lParam ghi li trng thi ca ca s con.
Vy chng ta c th to mt thnh phn iu khin dng ca s con hay cn gi l "child
window control". Ca s con c nhim v x l cc thng ip nh bn phm, thng ip chut
v thng bo cho ca s cha khi trng thi ca ca s con thay i. Nh vy ca s con tr thnh
cng c giao tip (cho php nhp v xut) gia ngi dng vi chng trnh.
Tuy chng ta c th to ra mt ca s con cho chnh mnh, nhng chng ta nn tn dng
cc lp ca s con c Windows nh ngha sn hay cn gi l nhng kiu iu khin
chun. Nhng kiu iu khin chun ny thng l cc nt bm (button), hp kim tra (check
box), hp son tho (edit box), hp danh sch (list box), combo box, cc thanh cun v chui
ch. V d mun to ra mt nt bm trn mn hnh ch cn gi hm CreateWindows, m
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 61
chng cn phi quan tm n cch v, cch nhn chut hay l chp khi b kch hot. Tt c iu
ny u do Windows x l. iu quan trng lphi chn thng ip WM_COMMAND ca cc
iu khin x l thng ip ny theo nhng mc ch khc nhau.
Cc kiu iu khin con thng c dng trong hp thoi. Nh minh ha trong
chng 2, cc iu khin nhn hp thoi lm ca s cha. Tuy nhin, cng c th to cc
kiu iu khin con trc tip trn vng ca s chnh, bng cch gi hm CreateWindow v iu
chnh v tr cng vi kch thc ca n cho thch hp bng hm MoveWindow. Th tc x l
thng ip ca ca s cha gi cc thng ip n cc khiu iu khin con, v ngc li cc
child window control gi cc thng ip yu cu ca s cha x l cc thng ip .
to mt ca s ng dng bnh thng. u tin phi ng k lp ca s bng hm
RegisterClass. Tip theo l khi to lp ng k thng qua hm CreateWindow. Cn 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. LP 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.

Hnh 3.1 Minh ha cc lp Button
Nhp chut vo cc nt, lc cc nt s gi thng ip WM_COMMAND n th tc
x l thng ip WndProc ca ca s cha. Th tc WndProc x l v in ra mn hnh cc thng
s lParam v wParam ca thng ip gi ti ny.Trong lParam l handle ca ca s con gi
thng ip n ca s cha. wParam c hai phn LOWORD v HIWORD, LOWORD cho bit
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 62
ID ca ca s con, HIWORD l m thng bo. M thng bo nt bm l mt trong nhng gi tr
sau.
nh danh m thng bo Button Gi tr
BN_CLICKED 0
BN_PAINT 1
BN_HILETE hay BN_PUSHED 2
BN_UNHILITE hay BN_UNPHUSHED 3
BN_DISABLE 4
BN_DOUBLECLICKED hay BN_DBCLICK 5
BN_SETFOCUS 6
BN_KILLFOCUS 7
Bng 3.1 nh danh m thng bo Button
Khng bao gi thy c cc gi tr ca nt bm, ch bit rng gi tr t 1 n 4 dnh cho
kiu button BS_USERBUTTON, gi tr 5 dnh cho kiu BS_RADIOBUTTON,
BS_AUTORADIOBUTTON, BS_OWNEDRAW, hay cc nt bm khc nu nt bm bao
gm kiu BS_NOTYFY. Gi tr 5,6 dnh cho cc kiu nt bm bao gm c c NOTYFY. Sau
y l chng trnh chnh.
*CONTROL1.CPP (trch dn)
struct
{
int iStyle ;
TCHAR *szText ;
}
button[ ] =
{
BS_PUSHBUTTON, TEXT ("PUSHBUTTON"),
BS_DEFPUSHBUTTON, TEXT ("DEFPUSHBUTTON"),
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 63
BS_CHECKBOX, TEXT ("CHECKBOX"),
BS_AUTOCHECKBOX, TEXT ("AUTOCHECKBOX"),
BS_RADIOBUTTON, TEXT ("RADIOBUTTON"),
BS_3STATE, TEXT ("3STATE"),
BS_AUTO3STATE, TEXT ("AUTO3STATE"),
BS_GROUPBOX, TEXT ("GROUPBOX"),
BS_AUTORADIOBUTTON, TEXT ("AUTORADIO")
} ;
#define NUM (sizeof(button) / sizeof(button[0]))
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
static HWND hwndButton[NUM] ;
static RECT rect ;
static TCHAR szTop[] = TEXT("message wParam lParam"),
szUnd[] = TEXT("_______ ______ ______"),
szFormat[] = TEXT("%-16s%04X-%04X %04X-%04X"),
szBuffer[50];
static int cxChar, cyChar ;
HDC hdc ;
PAINTSTRUCT ps ;
int i ;
switch (message)
{
case WM_CREATE :
cxChar = LOWORD(GetDialogBaseUnits()) ;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 64
cyChar = HIWORD(GetDialogBaseUnits()) ;
for (i = 0 ; i < NUM ; i++)
hwndButton[i] = CreateWindow(TEXT("button"), button[i].szText,
WS_CHILD|WS_VISIBLE|button[i].iStyle, cxChar, cyChar*(1+2*i), 20*cxChar, 7*cyChar/4, hwnd, (HMENU)i,
((LPCREATESTRUCT)lParam)->hInstance, NULL) ;
return 0 ;
case WM_SIZE :
rect.left = 24*cxChar ;
rect.top = 2*cyChar ;
rect.right = LOWORD(lParam) ;
rect.bottom = HIWORD(lParam) ;
return 0 ;
case WM_PAINT :
InvalidateRect (hwnd, &rect, TRUE) ;
hdc = BeginPaint (hwnd, &ps) ;
SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
SetBkMode (hdc, TRANSPARENT) ;
TextOut (hdc, 24 * cxChar, cyChar, szTop, lstrlen (szTop)); TextOut (hdc, 24 * cxChar, cyChar, szUnd,
lstrlen (szUnd)) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DRAWITEM :
case WM_COMMAND :
ScrollWindow (hwnd, 0, -cyChar, &rect, &rect) ;
hdc = GetDC (hwnd) ;
SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
TextOut (hdc, 24*cxChar, cyChar*(rect.bottom/cyChar-1), szBuffer, wsprintf (szBuffer, szFormat,
message==WM_DRAWITEM ? TEXT ("WM_DRAWITEM") : TEXT ("WM_COMMAND"), HIWORD
(wParam), LOWORD (wParam), HIWORD (lParam), LOWORD (lParam))) ;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 65
ReleaseDC (hwnd, hdc);
ValidateRect (hwnd, &rect);
break;
case WM_DESTROY :
PostQuitMessage(0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
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 | WS_VISIBLE | button[i].iStyle
V tr x : cxChar
V tr y : cyChar*( 1+2*i )
Chiu rng : 20*xChar
Chiu cao : 7*yChar*4
Handle ca s cha : hwnd
Ch danh ca ca s con : (HMENU) i
Th qun Handle : ((LPCREATESTRUCT) lParam-> hInstance, NULL) ;
Cc thng s thm : NULL
Trong tn lp l c nh. Tn ca s do chng ta t. Kiu ca s s dng l
WS_CHILD, WS_VISIBLE v mt trong 9 kiu button (BS_PUSHBUTTON,
BS_CHECKBOX,...).
Tip theo l 4 thng s xc nh v tr x, v tr y, kch thc theo chiu rng, kch thc
chiu cao ca ca s con trn vng client ca ca s cha. hwnd l handle ca ca s cha. ID l
ch danh ca mi ca s con (mi ca s con c duy nht mi s ID). ID ny phi p kiu
HMENU ch nh trnh n. lParam thc cht l mt con tr n cu trc
LPCREATESTRUCT c thnh phn hInstance. D mun ly th qun hInstance th phi p
kiu lParam.
3.3.1. Lp Push Button
Trong v d 3.1 c hai Push Button c to ra bng hm CreateWindow vi kch
thc v v tr c xc nh bi ngi lp trnh. Cc Push Button c s dng bt tt mt
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 66
hnh ng tc thi ch khng gi c trng thi bt hay tt lu di nh checkbox c. Trn
y l hai kiu ca s BS_PUSHBUTTON v BS_DEFBUTTON (kiu nt bm mc nh). Hai
kiu ny khi thit k th khc nhau nhng khi s dng th n c chc nng hon ton ging nhau.
Khi nhn chut vo nt ny th nt ny gi thng ip WM_COMMAND n ca s cha vi
m thng bo BN_CLICK. C th tc ng n nt bm ny bng cch gi hm.
SendMessage( hwndButton, BM_SETSTASE, 1, 0 );
Nu mun nt nhn ny tr li trng thi bnh thng th gi hm :
SendMessage(hwndButton, BM_SETSTASE, 0, 0 );
hwndButton l nh danh ca ca s con c tr v bi hm CreateWindow.
3.3.2. Lp Check Box
Mt check box l l mt hp vung km theo ch. Thng thng ch nm bn tri ca
hp. Tuy nhin, cng c th t ch nm bn phi bng cch thm vo kiu BS_LEFTTEXT
khi to mt button. Cc check box cho php ngi dng chn cc ty chn, n hot ng nh
mt cng tc. C hai loi check box thng dng l BS_CHECKBOX v
BS_AUTOCHECKBOX. Khi s dng loi BS_CHECKBOX, chng ta t t du check box
bng cch gi n kiu iu khin ny thng ip BS_SETCHECK. Thng s wParam trong
hm SendMessage c t gi tr 1 to nh du, v bng 0 khi mun hy nh du. Ly
trng thi ca mt check box bng cch gi n kiu iu khin ny thng ip
BM_GETCHECK. Dng on chng trnh sau bt tt du check khi x l thng ip
WM_COMMAND c gi n t cc kiu iu khin.
SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)!SendMessage( (HWND)lParam,
BM_GETCHECK, 0, 0), 0);
Ch ton t ! (NOT) ng trc hm SendMessage. Gi tr lParam l handle ca ca
s con gi n ca s cha trong thng ip WM_COMMAND. Mun bit trng thi ca check
box no th gi ti n thng ip BM_GETCHECK. khi ng mt check box loi
BS_CHECKBOX vi trng thi c nh du, bng cch gi n n mt thng ip
BM_SETCHECK theo cu trc.
SendMessage (hwndButton,BM_SETCHECK, 1, 0);
Cn check box BS_AUTOCHECK l loi nt bm m t n nh du bt hay tt cho
chnh n. Mun ly trng thi ca check box hin hnh, ch cn gi thng ip
BM_GETCHECK n kiu iu khin ny theo cu trc.
iCheck = SendMessage (hwndButton, BM_SETCHECK, 1, 0);
iCheck mang gi tr TRUE nu check box trng thi chn, cn ngc li iCheck mang
gi tr FALSE.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 67
Ngoi ra cn c hai loi check box khc l BS_3STATE v BS_AUTO3STATE. Hai
loi ny cn c thm trng thi th 3, l trng thi nt check box c mu xm xut hin khi
bn gi thng ip WM_SETCHECK vi tham s wParam bng 2 n check box ny. Mu
xm cho bit ngi dng chn la khng thch hp hay khng xc nh.
3.3.3. Lp Radio Button
Mt radio button l mt vng trn c km theo ch. Ti mt thi im ch c mt radio
button c nhn. Cc radio thng c nhm li s dng cho vic la chn duy nht trong
nhm. Trng thi cc radio button khng bt tt nh check box. C ngha, khi nhn chut vo
radio button th button ny c nh du, v khi ta nhn chut vo mt ln na th radio
cng vn trng thi nh du. C hai kiu radio button l BS_RADIOBUTTON v
BS_AUTORADIOBUTTON, nhng kiu th hai ch s dng trong hp thoi.
Khi nhn thng ip WM_COMMAND t radio button, th chng ta phi 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. Lp 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 n. Cc group box thng c s dng bao quanh cc kiu iu khin khc.
3.4. LP 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 tnh, ca s con ny by thng ip
WM_NCHITTEST v tr v gi tr HTTRANSPARENT n Windows. iu ny lm cho
Windows gi cng thng ip WM_NCHITTEST cho ca s cha. Ca s cha thng gi thng
ip ny n th tc DefWindowProc. 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 :
SS_BLACKRECT, SS_GRAYRECT, SS_ WHITERECT.
SS_BLACKFRAME, SS_GRAYFAME, SS_WHITEFRAME.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 68
3.5. LP EDIT TEXT
Trong mt phng din no th lp son tho (edit text) c xem l mt ca s c
nh ngha sn n gin nht. Nhng xt mt kha cnh khc th n li phc tp nht. Dng tn
lp "edit" cng vi cc thng s v tr x, v tr y, chiu rng, chiu cao trong hm
CreateWindow to ra ca s son tho. Khi ca s son tho nhn focus th chng ta c th
g ch vo, xo cc ch, nh du cc chvv. Cc thao tc trn c Windows h tr hon
ton.
Mt trong nhng ng dng thng xuyn nht, v n gin nht ca lp son tho l to
ra mt ca s cho php ngi dng nhp cc ch vo. minh ha cho ca s nhp ta xt v d
3.2 sau.
*EDITTEXT.CPP
#include <windows.h>
#define ID_EDIT 1
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
TCHAR szAppName[] = TEXT ("PopPad1") ;
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
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)ID_EDIT, ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
return 0 ;
case WM_SETFOCUS :
SetFocus (hwndEdit) ;
return 0 ;
case WM_SIZE :
MoveWindow (hwndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 69
return 0 ;
case WM_COMMAND :
if (LOWORD (wParam) == ID_EDIT)
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 :
PostQuitMessage(0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
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.
3.5.1. Cc kiu lp Edit Text
Trong v d trn to mt edit box bng cch gi hm CreateWindow. C kiu ca s
l WS_CHILD, cng mt s ty chn. Chng ta c th canh tri, phi, gia cc ch trong vng
ca s edit box bng cch thay i thng s kiu ca s ES_LEFT, ES_RIGHT, ES_CENTER
trong hm CreateWindow.
C th to mt edit control cho php hin th nhiu hng bng cch chn kiu ca s
ES_MULTILINE. Mt edit control mc nh ch cho php nhp mt hng k t cho n cui
edit box. S dng ES_AUTOHSCROLL, ES_AUTOVSCROLL to mt edit control c
thanh cun ngang, v cun ng t ng. C th thm thanh cun ngang v ng vo edit
control bng cch s dng kiu ca s WS_HSCROLL, WS_VSCROLL. Dng kiu ca s
WS_BORDER to ng vin cho edit control.
Kch thc ca edit control c xc nh bng cch gi hm MoveWindow khi hm
WndProc x l thng ip WM_SIZE. Trong v d trn th kch thc ca edit control c t
bng kch thc ca ca s chnh.
MoveWindow(hwndEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 70
Cc edit control gi thng ip WM_COMMAND cng cc thng s wParam, lParam
n window ca s cha. Vi ngha : LOWORD(wParam) l ID ca s con,
HIWORD(wParam) l m thng bo. lParam l handle ca edit control.
M thng bo ngha
EN_SETFORCUS Endit control nhn focus nhp.
EN_KILLFORCUS Endit control mt focus nhp.
EN_CHANGE Ni dung ca edit control s thay i.
EN_UPDATE Ni dung ca edit control thay i.
EN_ERRSPACE Edit control chy qu thi gian.
EN_MAXTEXT Edit control chy qu khng gian khi chn.
EN_HSCROLL Thanh cun ng ca edit control b tc ng.
EN_VSCROLL Thanh cun nm ca edit control b tc ng.
Bng 3.2 Danh sch m thng bo ca edit Control.

3.5.2. Cc thng ip n mt lp Edit Text
Cc th t thng ip sau cho php ct, sao chp, xo cc phn ch c chn (selected).
SendMessage (hwndEdit, WM_CUT, 0, 0);
SendMessage (hwndEdit, WM_COPY, 0, 0);
SendMessage (hwndEdit, WM_CLEAR, 0, 0);
Vi WM_CUT ct phn ch c nh du a vo vng Clipboard. WM_COPY sao
chp phn ch c nh du a vo Clipboard nhng phn nh du vn cn trn edit
control. WM_CLEAR xa phn ch c nh du m khng a vo clipboard.
Chn phn ch nm trong clipboard vo vng son tho edit control bng cch gi hm.
SendMessage (hwndEdit, WM_PASTE , 0, 0);
Nhn bt u v kt thc ca phn ch chn bng cch gi hm :
SendMessage (hwndEdit, EM_GETSEL, (WPARAM)&iStart, (LPARAM)&iEnd );
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 71
iStart lu v tr bt u v iEnd lu v tr kt thc.
thay th phn ch chn bng ch khc, ta dng hm ;
SendMessage(hwndEdit,EM_REPLACESEL,0,(LPARAM)szString);
Trong szString l chui mun thay th.
i vi edit control nhiu dng, ta m s dng ch bng hm.
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 ).
3.6. LP LIST BOX
List box l tp hp cc chui k t c gi gn trong mt hnh ch nht. Mt chng
trnh c th thm hoc xa cc chui trong list box bng cch gi cc thng ip n th tc
window ca list box. List box control gi thng ip WM_COMMAND n ca s cha khi c
mt mc trong list box b nh du. Ca s cha xc nhn cc mc trong list box b nh du.
Mt list box c th chn c mt mc hay nhiu mc cng mt lc (ty theo loi list
box n hay kp).
3.6.1 Cc kiu List Box
Chng ta to mt ca s con list box bng hm CreateWindow vi lp ca s l
"listbox" cng vi loi ca s WS_CHILD. Tuy nhin kiu ca s con mt nh ny khng gi
thng ip WM_COMMAND n ca s cha, c ngha chng trnh t kim tra vic nh du
cc danh mc trong list box. V th, cc kiu iu khin list box thng nh ngha kiu list box
LBS_NOTYFY, iu ny cho php ca s cha nhn thng ip WM_COMMAND t list box.
Nu mun sp xp cc mc trong list box th s dng kiu LBS_SORT.
Theo mc nh, nhng list box to ra l nhng list box n. V th, nu mun to ra mt
list box kp (tc list box cho php ngi dng chn nhiu dng cng lc) th phi s dng loi
list box LBS_MULTIPLESEL.Thng thng, List box s t cp nht khi mt mc c thm
vo. Tuy nhin c th ngn cn vic cp nht ny bng kiu LBS_NOREDRAW. Vic lm ny
i khi khng thch lm, thay vo chng ta c th s dng thng ip WM_SETREDRAW
ngn chn tm thi vic v li ca list box.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 72
Theo mc nh, cc mc trong list box khng c ng vin bao quanh khi hin th trn
mn hnh. Tuy nhin, c th thm ng vin cho cc mc bng nh danh ca s
WS_BORDER. Thm thanh cun ng vo list box bng cch thm nh danh ca s
WS_VSCROLL.
Thng thng windows nh ngha mt list box gm cc thng s sau : LBS_NOTIFY |
LBS_SORT | WS_VSCROLL | WS_BORDER.
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);
3.6.2. t cc chui vo List Box
thm mt chui vo list box ta gi cc thng ip n th tc Windows list box bng
hm SendMessage. Khi truyn chui cho hm SendMessage th thng s wParam l mt con
tr, tr n chui c kt thc bi k t NULL. Hm SendMessage tr v m
LB_ERRSPACE (gi tr -2) khi Windows chy qu khng gian b nh dnh cho list box. Hm
SendMessage tr v m LB_ERR ( -1) khi xy ra li khc v tr v m LB_OKAY ( 0 ) nu
thao tc thm thnh cng.
Nu s dng kiu LBS_SORT th khi thm mt chui vo list box ch cn dng ch th
LB_ADDSTRING theo cu trc.
SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM) szString);
Vi szString l chui cn thm vo list box.
Nu trong list box khng dng kiu LBS_SORT th c th chn mt chui vi ch th
LB_INSERTSTRING cng v tr mun chn bng hm.
SendMessage(hwndList, LB_INSERTSTRING, iIndex, (LPARAM) szString);
iIndex l v tr mun chn chui vo. Nu gi tr ny bng -1 th chui c chn vo y
ca list box.
Xa mt chui trong list box bng ch th LB_DELETESTRING.
SendMessage(hwndList, LB_DELETESTRING, iIndex, 0);
Xa ht cc phn t nm trong list box th dng ch th LB_RESETCONTENT vi cu
trc.
SendMessage(hwndList, LB_LB_RESETCONTENT, 0, 0 );
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 73
Khi thm vo hay xa th Windows t cp nht li list box. Tuy nhin ta cng c th tm
thi cn s cp nht ny bng cch tt c v li list box.
SendMessage(hwndList, WMSETREDRAW, FALSE, 0);
Sau khi thc hin xong ta bt c v li list box bng hm.
SendMessage(hwndList, WMSETREDRAW, TRUE, 0);
3.6.3. Chn v ly cc mc trn List Box
Tng t nh t chui vo List box , chn v ly mc trong List box cng phi gi cc
thng ip n th tc Window List box bng hm SendMessage.
Dng ch th LB_GETCOUNT m s mc trong List box.
iCount = SendMessage (hwndList, LB_GETCOUNT, 0, 0 );
Lm sng mc chn mc nh th dng LB_SETCURSEL.
SendMessage (hwndList, LB_SETCURSEL, iIndex, 0 );
Nu t gi tr iIndex bng -1 th window s b tt c cc mc chn. chn cc mc
da trn ch bt u ca mc, ta dng hm.
iIndex = SendMessage (hwndlist, LB_SELECTSTRING, iIndex, (LPARAM)
szSearchString);
iIndex l v tr bt u ca vic tm vi k t u ging szSearchString. Nu gi tr iIndex
bng -1 th vic tm bt u t v tr u tin. Hm s tr v gi tr tm ci. Nu chui khng
tn ti th hm tr v m li LB_ERR.
Xc nh mc chn khi nhn c thng ip WM_COMMAND t list box bng
hm.
iIndex = SendMessage(hwndList, LB_GETCURSEL, 0, 0);
Hm tr v v tr ca mc c chn, cn ngc li nu khng c mc no c chn th
hm tr v m li LB_ERR.
Mun xc nh chiu di ca mt chui bt k c trong list box dng hm.
iLength = SendMessage(hwndList, LB_GETTEXTLEN, iIndex, 0);
Vi iIndex l v tr ca chui cn xc nh chiu di. chp chui trn vo vng p
Buffer, ta dng hm.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 74
iLength = SendMessage(hwndList, LB_GETTEXT, iInde, (LPARAM) Buffer);
Gi tr tr v ca hai hm trn l chiu di ca chui k t. Nn nh kch thc vng
buffer sao cho cha chiu di ca chui cng thm k t kt thc chui cn ghi vo.
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, iIndex);
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, iIndex, 0);
Hm tr v gi tr khc 0 nu mc c v tr iIndex c chn, v bng 0 nu mc v tr
khng c chn.
3.6.4. Nhn cc thng ip t List Box
Khi dng chut nhn vo list box, khi list box nhn focus nhp. Ca s cha c th t
focus nhp n list box bng hm.
SetFocus (hwndList);
Khi list box nhn focus nhp, chng ta dng con chut, cc phm ch, phm Spacebar
chn cc mc trong list box. List box gi thng ip WM_COMMAND vi cc thng s
wParam, lParam n ca s cha vi ngha :
LOWORD (wParam) ID ca s con.
HIWORD (wParam) M thng bo.
lParam Handle ca s con.
M thng bo Gi tr ngha
LBN_ERRSPACE
-2 Con trol list box chy qu khng gian
LBN_SELCHANGE
1 Cho bit mc chn hin hnh thay i
LBN_DBLCLK 2 Cho bit mt mc b double click vi chut
LBN_SELCANCEL
3 Cho bit ngi dng thay i mc chn trong list box
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 75
LBN_SETFOCUS 4 Cho bit list box ang nhn c focus nhp
LBN_KILLFOCUS
5 Cho bit list box mt focus nhp
Bng 3.3 Cc gi tr ca m thng bo
M thng bo LBN_ERRSPACE, LBN_SELCHANGE c gi n ca s cha khi
kiu ca s list box bao gm LBS_NOTIFY.
3.6.5. Mt ng dng List Box
Sau y l mt v d v list box, kt qu chng trnh sau khi chy th hin trong hnh
3.2.
Trong v d ny, ta to ra mt list box gm cc phn t cam, chanh, nho . Khi dng
chut hay dng phm Spacebar cng vi phm mi tn chn cc mc trong list box, mc c
chn s c mu t th hin c chn la (mc nh trong Windows l mu xanh) v ni dung
mc chn ny c hin th ln kiu iu khin tnh nm bn trn vng thao tc ca ca s
chnh. Chng trnh minh ha nh sau (v d 3.2).

Hnh 3.2 ng dng minh ha lp List Box
*LISTBOX.CPP (trch dn)
#include <windows.h>
#define ID_LIST 1
#define ID_TEXT 2
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
void FillListBox (HWND hwndList)
{
int i;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 76
static TCHAR *tc[]={TEXT("cam"), TEXT("quyt"), TEXT("buoi"), TEXT("tao"), TEXT("chanh"),
TEXT("xoai"), TEXT("nho")};
for(i=0; i<7; i++)
SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)tc[i]);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
static HWND hwndList, hwndText ;
int iIndex, iLength, cxChar, cyChar ;
TCHAR *pVarName;
switch (message)
{
case WM_CREATE :
cxChar = LOWORD (GetDialogBaseUnits ()) ;
cyChar = HIWORD (GetDialogBaseUnits ()) ;
// To mt listbox
hwndList = CreateWindow ( TEXT("listbox"), NULL, WS_CHILD | WS_VISIBLE | LBS_NOTIFY |
LBS_STANDARD, cxChar, cyChar * 3, cxChar * 16 + GetSystemMetrics (SM_CXVSCROLL), cyChar * 5,
hwnd, (HMENU) ID_LIST, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL ) ;
// to mt control "static"
hwndText = CreateWindow ( TEXT("static"), NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, cxChar,
cyChar, GetSystemMetrics (SM_CXSCREEN), cyChar, hwnd, (HMENU) ID_TEXT,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL) ;
FillListBox (hwndList) ;
return 0 ;
case WM_SETFOCUS : //t focus nhp cho list box
SetFocus (hwndList) ;
return 0 ;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 77
//x l cc thng ip khi chn mc trong list box
case WM_COMMAND :
if (LOWORD (wParam) == ID_LIST && HIWORD (wParam) == LBN_SELCHANGE)
{
// ly ch v tr ca mc c chn
iIndex=SendMessage(hwndList,LB_GETCURSEL, 0, 0);
iLength = SendMessage (hwndList, LB_GETTEXTLEN, iIndex, 0) + 1 ;
pVarName =(char*) calloc (iLength, sizeof (TCHAR)) ;
SendMessage ( hwndList, LB_GETTEXT, iIndex, (LPARAM)pVarName) ;
SetWindowText (hwndText, pVarName) ;
free (pVarName) ;
}
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
Khi dng chut hay bn phm chn mc trong list box, th list box gi thng ip
WM_COMMAND cho th tc WndProc ca ca s cha x l. Khi th tc WndProc nhn
c thng ip WM_COMMAND, n kim tra word thp ca tham s wParam c bng nh
danh ca list box ( v d trn l ID_LIST) khng v word cao ca tham s wParam(m thng
bo) c bng LBN_SELCHANGE khng. Nu bng, n ly ch s ca mc c chn thng
qua hm:
SendMessage (hwndList, LB_GETCURSEL, 0, 0) ;
V tip tc ly ni dung ca mc c chn thng qua hm.
SendMessage ( hwndList, LB_GETTEXT, iIndex, (LPARAM) pVarName);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 78
Sau cng, hin th mc c chn ln control tnh thng qua hm.
SetWindowText (hwndText, pVarName);
3.7. LP COMBO BOX
Cng ging nh List box, Combo box cng l tp hp cc chui k t c gi gn trong
mt hnh ch nht. Mt chng trnh c th thm 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 trong Combo box c nh du. Ca 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.
3.7.1. S khc v ging nhau gia Combo Box v List Box
Cc thao tc trn list box v combo box l hon ton ging nhau, ch khc nhau hnh
thc th hin. List box hin th cc mc khi chng c cp nht, cn combo box ch hin th cc
mc khi ta nhp chut vo n. Khi to kiu iu khin combo box vi hm CreateWindow phi
s dng lp ca s "combobox" cng vi kiu ca s l WS_CHILD.
List box c th cho php chn nhiu mc cng lc, cn combo box th ch cho php chn
mt mc m thi.
Khng ging nh list box, combo box c hai phn. Phn di l danh sch cc mc c
thm vo combo box, phn trn l mt edit control dng hin th mc chn hin hnh.
3.7.2. Thm, xa mt chui trnCombo Box
thm mt chui vo combo box dng hm SendMessage vi thng ip
CB_ADDSTRING:
SendMessage (hWnd, CB_ADDSTRING, 0, (LPARAM) szString);
hWnd l handle ca Combo box control, szString l chui cn thm vo.
Hn ch chiu di ca chui cn thm vo bng thng ip CB_LIMITTEXT.
SendMessage (hWnd, CB_LIMITTEXT, (WPARAM)length, 0).
length l chiu di ca chui cn thm vo khng k k t kt thc chui. chn mt
chui vo Combo box ti v tr xc nh, ta dng thng ip CB_INSERTSTRING.
SendMessage (hWnd, CB_INSERTSTRING, iIndex, (LPARAM) szString).
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 79
iIndex l v tr cn chn chui vo Combo box. xa tt c cc mc trong Combo box,
ta dng thng ip CB_RESETCONTENT.
SendMessage (hWnd, CB_RESETCONTENT, 0, 0).
Tng t, ta c th xa mt mc trong Combo box bng thng ip
CB_DELETESTRING.
SendMessage (hWnd, CB_DELETESTRING, iIndex, 0);
3.7.3. Chn v ly mc trn Combo box
m s mc c trong Combo box bng thng ip CB_GETCOUNT.
iCount = SendMessage (hWnd, CB_GETCOUNT, 0, 0).
Hm trn tr v s mc c trong Combo box. Thng thng ta chn mc t Combo box.
Tuy nhin, ta cng c th chn mc bng thng ip CB_SETCURSEL.
SendMessage (hWnd, CB_SETCURSEL, (WPARAM) iIndex, 0).
Vi iIndex l v tr cn chn, nu gi tr ny bng 1 th Windows loi b vic chn i
vi tt c cc mc trong Combo box.
Khi nhn thng ip WM_COMMAND t Combo box, chng ta c th xc nh mc
c chn c v tr th my trong Combo box (v tr bt u l 0) bng cch dng thng ip
CB_GETCURSEL.
iIndex = SendMessage (hWnd, CB_GETCURSEL, 0, 0);
iIndex l v tr ca mc c chn. Nu khng c mc no c chn th hm trn s tr
v m li CB_ERR (gi tr bng 1).
xc nh chiu di iLength ca mt chui c trong Combo box, ta dng thng ip
CB_GETLBTEXTLEN.
iLength=SendMessage (hwnd, CB_GETLBTEXTLEN, iIndex, 0);
Hm tr v chiu di chui vi iIndex l v tr ca chui cn ly chiu di. Nu mun ly
ni dung ca mc no , ta s dng thng ip CB_GETLBTEXT.
SendMessage ( hWnd, CB_GETLBTEXT, iIndex, (LPARAM)szString);
iIndex l v tr chui cn ly, szString dng cha chui ly c.
3.7.4. Mt ng dng Combo box
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 80
minh ha cch cch s dng Combo box cng vi cc th tc x l thng ip trong
Combo box chng ta cng nhau kho st v d sau (v d 3.3). Kt qu thc hin chng trnh.

Hnh 3.3 ng dng minh ha lp Combo Box
*COMBOBOX.CPP ( trch dn)
void FillCombo (HWND hwndCombo)
{
int i;
static TCHAR *tc[ ] = {TEXT("MAI XUAN HUNG"), TEXT("LE HOAN VU"), TEXT("LE LU
NHA"), TEXT("PHAM THANH PHONG"), TEXT("LE LUC"), TEXT("NGUYEN TIEN"), TEXT("DINH
QUYEN")};
for(i=0; i<7; i++)
SendMessage(hwndCombo,CB_ADDSTRING,0,(LPARAM)tc[i]);
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
static HWND hwndCombo, hwndText ;
int iIndex, iLength, cxChar, cyChar ;
TCHAR *pVarName;
switch (message)
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 81
{
case WM_CREATE :
cxChar = LOWORD (GetDialogBaseUnits ()) ;
cyChar = HIWORD (GetDialogBaseUnits ()) ;
hwndCombo = CreateWindow (TEXT ("combobox"), NULL, WS_CHILD | WS_VISIBLE |
LBS_STANDARD, cxChar, cyChar * 3, cxChar * 20 + GetSystemMetrics (SM_CXVSCROLL), cyChar * 10,
hwnd, (HMENU)ID_COMBO, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL) ;
hwndText = CreateWindow (TEXT ("static"), NULL, WS_CHILD | WS_VISIBLE | SS_LEFT, cxChar,
cyChar, GetSystemMetrics (SM_CXSCREEN), cyChar, hwnd, (HMENU) ID_TEXT, (HINSTANCE)
GetWindowLong (hwnd, GWL_HINSTANCE), NULL) ;
FillListBox (hwndCombo) ;
return 0 ;
case WM_SETFOCUS :
SetFocus (hwndCombo) ;
return 0 ;
case WM_COMMAND :
if (LOWORD(wParam) == ID_COMBO && HIWORD(wParam) == LBN_SELCHANGE)
{
iIndex=SendMessage(hwndCombo,CB_GETCURSEL,0,0);
iLength=SendMessage(hwndCombo,CB_GETLBTEXTLEN,iIndex, 0)+1;
pVarName =(char*) calloc (iLength, sizeof (TCHAR)) ;
SendMessage(hwndCombo, CB_GETLBTEXT, iIndex, (LPARAM)pVarName) ;
SetWindowText (hwndText, pVarName) ;
free (pVarName) ;
}
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 82
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
3.8. LP SCROLL BAR
Trong cc chng trc thanh cun ca s c to ra bng cch s dng hai thng s
WS_VSCROLL hay WS_HSCROLL, thanh cun c to ra trong trng hp ny nm bn
di hoc bn phi vng client. By gi to lp mt control thanh cun m kiu iu khin thanh
cun ny xut hin bt c ni no trong vng thao tc. Bng cch s dng lp "scrollbar" cng
vi hai kiu thanh cun nh ngha sn SBS_VERT v SBS_HORZ.
Khng ging nh cc kiu control iu kin cp trn, cc control thanh cun
y khng gi thng ip WM_COMMAND, m li gi thng ip WS_VSCROLL v WS_
HSCROLL cho ca s cha. C th phn bit c thanh cun ca s v kiu iu khin thanh
cun thng qua tham s lParam. Tham s ny s bng 0 nu nh thanh cun ny l thanh cun
ca s, cn tham s ny s bng handle ca ca s thanh cun nu nh thanh cun l mt
kiu iu khin. Cn tham s wPram th ging nhau cho c hai loi thanh cun ca s v kiu
iu khin thanh cun.
Bn c th to mt kiu iu khin thanh cun vi chiu di v chiu rng ty . Nu bn
mun to mt kiu iu khin thanh cun c kch thc bng kch thc ca thanh cun ca s.
Th dng hai hm sau ly chu cao v chiu rng ca thanh cun ca s.
GetsystemMetrics (SM_CYHCROLL) ;
GetsystemMetrics (SM_CXVCROLL) ;
Tng t nh thanh cun ca s chng ta c th t vng v v tr cho kiu iu khin
thanh cun hm.
SetScrollRange (hwndScroll, SB_CTL, iMin, iMax, bRedraw) ;
hwnScroll l handle ca control thanh cun. Tham s SB_CTL l mt trong hai kiu
SBS_VERT tng ng vi thanh cun ngang v SBS_HORZ tng ng vi thanh cun ng.
Theo mc nh th thanh cun nm trong vng c gi tr t 0 n 100 n v chiu di, tuy nhin
c th t li vng thanh cun thng qua hai tham s iMin tng ng vi chn di ca vng v
iMax tng ng vi chn trn ca vng. Tham s nRedraw mang mt trong hai gi tr TRUE
hoc FALSE, nu mun Windows v li thanh cun da trn vng mi th phi t gi tr ny
bng TRUE, cn ngc li th t gi tr ny bng FALSE.
Dng hm sau t li v tr con chy trn thanh cun.
SetScrollPos (hwndScroll, SB_CTL, iPos, bRedraw);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 83
Vi iPos l v tr cn t con chy trn vng control thanh cun.
3.8.1. Giao din bn phm i vi thanh cun
C th dng bn phm di chuyn con chy trn vng control thanh cun khi thanh
cun nhn c focus nhp. Sau y l cc phm di chuyn cng vi cc chc nng ca n
trn control thanh cun.
Cc phm di chuyn Gi tr wParam ca thng ip thanh cun
Home SB_TOP
End SB_BOTTOM
Page Up SB_PAGEUP
Page Down SB_PAGEDOWN
Left hay Up SB_LINEUP
Right hay Down SB_LINEDOWN
Bng 3.4 Cc gi tr wParam ca thng ip thanh cun
t focus nhp cho cc thanh cun bng hm.
SetFocus (hwndScroll);
Vi hwnScroll l handle ca control thanh cun. Mun t focus cho mt thanh cun no
khi khi ng chng trnh th phi t focus ny khi x l thng ip WM_SETFOCUS
trong th tc WndProc. V l do, thanh cun ch quan tm n cc phm di chuyn, n khng
quan tm n phm Tab. iu ny lm cho vic s dng phm Tab di chuyn focus nhp t
thanh cun ny n thanh cun khc gp nhiu kh khn. Tuy nhin gii quyt vn ny ta
nguyn cu cc k thut sau.
Nhn a ch th tc window ca cc control thanh cun bng hm GetWindowLong vi
nh danh GWL_ID. Bn c th t th tc Windows cho thanh cun bng hm
SetWindowLong vi nh danh GWL_WNDPROC. Trong v d sau y, hm
SetWindownLong t th tc window cho thanh cun mi v tr v a ch th tc window
thanh cun c.
hm x l thanh cun ScrollProc trong v d sau nhn tt c cc thng ip gi n
th tc window thanh cun. Hm ny ch n gin thay i focus nhp gia cc thanh cun khi
bm phm Tab hay Shift-Tab, bng cch gi window thanh cun c thng qua hm
CallWindowProc.
3.8.2. T mu cc thanh cun v cc static text
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 84
Mu ca cc thanh cun c thc hin bng cch x l cc thng ip
WM_CTLCOLORSCROLLBAR.
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];
Cc chi t trn c to ra bng hm CreateSolidBrush trong th tc x l thng ip
WM_CREATE .
for (i = 0; i < 3; i++)
{
hBrush [i] = CreateSolidBrush (color [i]);
}
Trong color cha cc gi tr mu s cp RGB (Red, Green, Blue). Mt trong 3 chi t
(brush) c tr v khi x l thng ip WM_CTLCOLORCROLLBAR trong th tc
WinProc bng on chng trnh sau.
case WM_CTLCOLORCROLLBAR:
i = GetWindowLong (HWND) lParam, GWL_ID) :
return (LRESULT) hBrush [i];
Ch : Cc chi t phi c hy b trc khi kt thc chng trnh thng qua hm
DeleteOject khi x l thng ip WM_DESTROY trong th tc x l WinProc.
for (i = 0; i < 3; i++)
DeleteObject (hBrush [i]);
Cc static text c t mu tng t nh cc thanh cun, bng cch x l thng ip
WM_CTLCOLORSTATIC trong th tc WinProc thng qua hm SetTextColor. Dng hm
SetBkColor t mu nn ch, trong v d sau th mu nn ch trng vi mu h thng
COLOR_BTNHIGHLIGHT. i vi cc Static text tnh ta ch p dng mu nn ch cho hnh
ch nht nm sau mi k t ch khng phi ton b chiu rng ca ca s control. thc hin
iu ny, trong th tc WndProc hm x l WM_CTLCOLORSTATIC phi tr v mt
handle cho mt chi t (brush) ca mu COLOR_BTNHIGHLIGHT. Cc chi t ny c to
ra khi x l thng ip WM_CREATE v phi c hy khi x l thng ip
WM_DESTROY.
3.8.3. T mu nn ca s
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 85
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) ;
Khi thay i vic chn trn cc thanh cun th chng trnh to ra mt chi t (brush)
mi v chn handle ca chi t mi ny vo ca s trn. Nhn hay t handle ca chi t
(brush) bng hm GetClassWord v hm SetClassWord. C th to mt chi t (brush) mi v
chn handle ca chi t ny vo cu trc ca ca s, sau xa chi t (brush) c.
DeleteObject ( (HBRUSH)SetClassLong( hwnd, GCL_HBRBACKGROUND,
(LONG)CreateSolidBrush(RGB (icolor[0], icolor[1], 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
cc thng ip ca th tc x l window. M thng ip WM_PAINT c u tin thp hn
cc thng ip x l bn phm 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 trn 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.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 86

Hnh 3.4 ng dng minh ha lp Scroll Bar
3.8.4. Mt ng dng ca thanh cun
Hnh 3.4 minh ha mt ng dng v thanh cun (Scroll Bar). Trong v d ny, ta s
dng 3 thanh cun v 6 static text. Bng cch dng chut hay bn phm, ta di chuyn con trt
trn thanh cun thay i gi tr mu. Mu thay i tng ng s l mu t ca vng client
bn cnh. Ba stactic text di mi thanh cun dng ghi nhn gi tr mu thay i tng ng
vi cc thanh cun.
*SCROLLBAR.CPP (trch dn)
int idFocus ;
WNDPROC OldScroll[3] ;
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
static COLORREF crPrim[3] = { RGB (255, 0, 0), RGB (0, 255, 0),
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") } ;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 87
HINSTANCE hInstance ;
int i, cxClient, cyClient ;
TCHAR szBuffer[10] ;
switch (message)
{
case WM_CREATE :
hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ;
hwndRect = CreateWindow (TEXT("static"), NULL, WS_CHILD | WS_VISIBLE | SS_WHITERECT, 0,
0, 0, 0, hwnd, (HMENU) 9, hInstance, NULL) ;
for (i = 0 ; i < 3 ; i++)
{
hwndScroll[i] = CreateWindow (TEXT ("scrollbar"), NULL, WS_CHILD | WS_VISIBLE |
WS_TABSTOP | SBS_VERT, 0, 0, 0, 0, hwnd, (HMENU) i, hInstance, NULL) ;
SetScrollRange(hwndScroll[i], SB_CTL, 0, 255, FALSE);
SetScrollPos (hwndScroll[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), hInstance, NULL) ;
hwndValue [i] = CreateWindow (TEXT ("static"), TEXT ("0"), WS_CHILD | WS_VISIBLE |
SS_CENTER, 0, 0, 0, 0, hwnd, (HMENU) (i + 6), hInstance, NULL) ;
OldScroll[i] = (WNDPROC) SetWindowLong ( hwndScroll[i], GWL_WNDPROC, (LONG) ScrollProc)
;
hBrush[i] = CreateSolidBrush (crPrim[i]) ;
}
hBrushStatic = CreateSolidBrush ( GetSysColor (COLOR_BTNHIGHLIGHT)) ;
cyChar = HIWORD (GetDialogBaseUnits ()) ;
return 0 ;
case WM_SIZE :
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 88
SetRect (&rcColor, 0, 0, cxClient/1.5, cyClient) ;
MoveWindow (hwndRect, cxClient/1.5, 0, cxClient/2, cyClient, TRUE) ;
for (i = 0 ; i < 3 ; i++)
{
MoveWindow (hwndScroll[i], ((int)(1.2 * i + 1) * cxClient) / 13 + (int)cxClient/1.5, 2*cyChar, cxClient /
17, cyClient - 4 * cyChar, TRUE) ;
MoveWindow (hwndLabel[i], (2.3 * i + 1) * cxClient / 28+ cxClient/1.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) ;
}
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 SB_PAGEDOWN :
color[i] += 15 ;
case SB_LINEDOWN :
color[i] = min (255, color[i] + 1) ;
break;
case SB_PAGEUP :
color[i] -= 15 ;
case SB_LINEUP :
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 89
color[i] = max (0, color[i] - 1) ;
break;
case SB_TOP :
color[i] = 0 ;
break ;
case SB_BOTTOM :
color[i] = 255 ;
break ;
case SB_THUMBPOSITION :
case SB_THUMBTRACK :
color[i] = HIWORD (wParam) ;
break ;
default :
break ;
}
SetScrollPos (hwndScroll[i], SB_CTL, color[i], TRUE) ;
wsprintf (szBuffer, TEXT ("%i"), color[i]) ;
SetWindowText (hwndValue[i], szBuffer) ;
DeleteObject ( (HBRUSH)SetClassLong( hwnd, GCL_HBRBACKGROUND,
(LONG)CreateSolidBrush ( RGB( color[0], color[1], color[2] ) ) ) ) ;
InvalidateRect (hwnd, &rcColor, TRUE) ;
return 0 ;
case WM_CTLCOLORSCROLLBAR :
i = GetWindowLong ((HWND) lParam, GWL_ID) ;
return (LRESULT) hBrush[i] ;
case WM_CTLCOLORSTATIC :
i = GetWindowLong ((HWND) lParam, GWL_ID) ;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 90
if (i >= 3 && i <= 8)
{
SetTextColor ((HDC) wParam, crPrim[i % 3]) ;
SetBkColor ( (HDC) wParam, GetSysColor ( COLOR_BTNHIGHLIGHT ) );
return (LRESULT) hBrushStatic ;
}
break ;
case WM_SYSCOLORCHANGE :
DeleteObject (hBrushStatic) ;
hBrushStatic = CreateSolidBrush ( GetSysColor (COLOR_BTNHIGHLIGHT)) ;
return 0 ;
case WM_DESTROY :
DeleteObject ((HBRUSH) SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)
GetStockObject (WHITE_BRUSH))) ;
for (i = 0 ; i < 3 ; i++)
DeleteObject (hBrush[i]) ;
DeleteObject (hBrushStatic) ;
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
LRESULT CALLBACK ScrollProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
int id = GetWindowLong (hwnd, GWL_ID) ;
switch (message)
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 91
{
case WM_KEYDOWN :
if (wParam == VK_TAB)
SetFocus (GetDlgItem (GetParent (hwnd), (id + (GetKeyState (VK_SHIFT) < 0 ? 2 : 1)) % 3)) ;
break ;
case WM_SETFOCUS :
idFocus = id ;
break ;
}
return CallWindowProc(OldScroll[id],hwnd,message,wParam,lParam);
}
























T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 92
Chng 4
X L BN PHM, THIT B CHUT, V B NH
THI GIAN
4.1. M U
Cc chng trc 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. 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 trnh by mt thnh phn cng khng km quan trng l b nh
thi gian. Windows cung cp c ch ny truyn thng vi ng dng theo nh k. Vi c ch
ny, ng dng ch cn khai bo mt b nh thi gian vi mt khong thi gian cho trc. V
khi ng dng hot ng th h thng s truyn mt tn hiu cho ng dng theo tng khong thi
gian nh k c khai bo.
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. Nn tng c s v bn phm
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 93
Windows nhn v x l thng tin nhn c t bn phm, qua hnh thc cc thng ip
v gi cho ng dng. Trong ng dng Windows cc thng ip s c h iu hnh chuyn cho
hm x l ca s WndProc ca ng dng.
Windows cung cp 8 loi thng ip khc nhau phn bit cc tnh hung ca cc phm
c g. Tuy nhin khng phi lc no chng ta cng phi x l ton b cc thng ip ,
thng thng th ch cn x l mt na cc thng ip c pht sinh t bn phm, v cc thng
ip cn li s c Windows x l mc nh.
V d, trong Windows c th b qua khi nhn phm Ctrl, Alt, Shift cng vi cc phm
khc, nu khng mun chn x l ring cho ng dng. Trong trng hp nu chng ta mun
chn x l ring cho mnh, chng hn to phm nng (hotkey) phi ch trnh dng trng hp
vi cc phm nng m Windows cung cp. V khi theo quyn u tin, ng dng ca chng ta
s x l thng ip v s lm cho h thng khng hot ng nh bnh thng.
Thnh phn giao tip chung nh hp thoi (dialog) cng c nhiu giao tip vi bn phm,
nhng chng ta khng cn quan tm n vic giao tip vi bn phm khi hp thoi c kch
hot. X l bn phm trong hp thoi thng c giao cho Windows x l. Cc iu khin
c dng trong hp thoi nh hp nhp liu (edit box), hp la chn (check box), hay cc nt
nhn (button)...iu c kh nng t x l phm g vo v ch tr li thng bo ca cc phm g
cho ca s cha (parent window). Tuy vy, vi mt s cc iu khin nht nh theo ng dng ta
c th phi x l cc thng ip tng cng thm sc mnh ca thnh phn iu khin ny.
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.
4.2.2. Khi nim focus trong cc ng dng trong mi trng Windows
Windows a ra khi nim s quan tm (focus) cho cc ng dng c chy ng thi
trong mt thi im. V ch c mt bn phm, nn Windows phi qun l v phn phi cc thng
ip c g vo cho cc ng dng. Thng thng, c cc trng hp trn Windows l : mt
trong s cc ng dng ang chy c kch hot (active) hay khng c ng dng no chy. Khi
c mt chng trnh ng dng c kch hot th Windows xem nh ng dng nhn c s
quan tm.Trong mt ng dng c nhiu cc ca s, mi thi im ch mt ca s nhn c s
quan tm. Theo c ch ny, Windows cung cp mt dng gi l hng i thng ip. Mi thng
ip s c a vo hng i x l thng ip v c Windows phn phi n cc ng dng
tng ng.
Hm DispatchMessage trong vng lp x l thng ip s chu trch nhim chuyn
thng ip n th tc x l ca s WndProc ca cc ca s tng ng.
Mt ca s c th xc nh c trng thi quan tm ca mnh bng cch chn cc thng
ip WM_SETFOCUS, WM_KILLFOCUS trong hm x l WndProc. Thng ip
WM_SETFOCUS s cho ca s bit c thi im nhn c quan tm ca Windows v
ngc li WM_KILLFOCUS s thng bo cho ca s bit c mt s quan tm t
Windows. Phn sau s gii thiu k hn v x l thng ip.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 94
4.2.3. C ch hng i v qun l hng i
Trong Windows khi ngi dng nhn v nh phm trn bn phm, th thng qua trnh iu
khin thit b bn phm (keyboard driver) s din dch m qut (scan code) ca phn cng sang
hnh thc thng ip. Trc ht Windows s tm thi lu tr thng ip ny vo hng i thng
ip ca h thng (system message queue). Hng i thng ip h thng ca Windows l mt
hng i duy nht v qun l cc thao tc tin x l thng tin nhp t bn phm v chut.
Windows s ln lt ly cc thng ip trong hng i x l v s gi n hng i ca ng
dng khi ng dng x l xong thng ip bn phm v thit b chut trc .

Hnh 4.1 Qu trnh x l bn phm
L do m Windows phi chia thnh hai giai on trong qu trnh nhn v gi thng ip
t bn phm n hng i ca ng dng l do vic ng b ha vi mi tin trnh. Nu Windows
khng qun l hng i h thng th rt kh ng b cc tin trnh ca cc ng dng. V d, khi
mt ca s nhn c s quan tm v chun b x l cc thng ip. Ngi dng c th g phm
nhanh trong khi thng ip trc vn cha x l xong. Gi s ngi dng mun chuyn qua ng
dng khc v nhn Alt-Tab, khi thng ip bn phm mi ny s c a vo hng i ca
h thng v phn pht cho ng dng kia ch khng phi a vo hng i ca ng dng. Vi
tnh nng ng b ha ca Windows th cc thng ip t bn phm m bo c chuyn giao
ng cho cc ca s tng ng.
4.2.4. X l thng ip t bn phm
4.2.4.1. Thng ip t thao tc nhn v nh ca mt phm
Thao tc cn bn ca nhp liu t bn phm l thao tc nhn v nh mt phm. Khi thao
tc nhn mt phm trn bn phm c thc hin th Windows s pht sinh thng ip
WM_KEYDOWN hay WM_SYSKEYDOWN v a vo hng i thng ip ca ng dng
hay ca s nhn c s quan tm (focus). Cng tng t, khi ta nh phm th thng ip
WM_KEYUP hay WM_SYSKEYUP s c h iu hnh phn pht ti hng i .
Khi thc hin thao tc nhp t bn phm th vic nhn (down) v nh (up) phi i i vi
nhau. Tuy nhin, nu chng ta nhn mt phm v gi lun th Windows s pht sinh hng lot
cc thng ip WM_KEYDOWN hay WM_SYSKEYDOWN, nhng vi thao tc nh th ch
pht sinh mt thng ip WM_KEYUP hay WM_SYSKEYUP. Cc thng ip ny s c
gi tun t n cc hm WndProc ca cc c s nhn c s quan tm ca Windows. Ngoi ra
chng ta c th bit c thi im m thng ip phm c g vo lc no bng cch dng
hm GetMessageTime.
Nh chng ta thy trong dng trn mt thao tc nhn hay th th c hai dng thng
ip khc nhau nh WM_KEYDOWN v WM_SYSKEYDOWN ca thao tc nhn, v tng
t i vi thao tc nh. Thng ip c tip u ng l "SYS" thng c pht sinh khi ngi
dng nhn cc phm g h thng. Khi ngi dng nhn phm Alt kt hp vi phm khc th
thng pht sinh thng ip WM_SYSKEYDOWN v WM_SYSKEYUP. i vi t hp cc
phm Alt, chc nng thng l gi mt mc chn trn trnh n menu ca ng dng hay trnh
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 95
n h thng system menu v ngoi ra dng chuyn i cc tc v gia nhiu ng dng khc
nhau (phm Alt+Tab hay Alt+Esc), v ng ca s ng dng khi kt hp vi phm chc nng
F4.
Khi xy dng mt chng trnh ng dng, thng t quan tm n cc thng ip
WM_SYSKEYDOWN v thng ip WM_SYSKEYUP. Chng ta ch cn dng hm
DefWindowProc cui mi hm WndProc ca ca s nhn thng ip. Windows s chu trch
nhim x l cc thng ip dng h thng ny, nu c nhng tc v c bit th chng ta c th
chn cc thng ip ny x l. Tuy nhin ta khng nn lm nh vy v khi chng trnh
ca chng ta s chy khng bnh thng nh cc ng dng khc. Khng phi 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 th theo mc nh hm DefWindowProc s x l v tr v
thng ip WM_KILLFOCUS cho ng dng, khi ng dng ca chng ta s d dng x l
hn.
Tm li thng ip WM_KEYDOWN v WM_KEYUP 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 Nguyn nhn pht sinh
WM_ACTIVATE Thng ip ny cng c gi n cc ca s b kch
hot v ca s khng b kch hot. Nu cc ca s ny cng
mt hng i nhp liu, cc thng ip ny s c truyn mt
cch ng b, u tin th tc Windows ca ca s trn cng
b mt kch hot, sau n th tc ca ca s trn cng c
kch hot. Nu cc ca s ny khng nm trong cng mt hng
i th thng ip s c gi mt cch khng ng b, do
ca s s c kch hot ngay lp tc.
WM_APPCOMMAND Thng bo n ca s rng ngi dng to mt s
kin lnh ng dng, v d khi ngi dng kch vo button s
dng chut hay nh vo mt k t kch hot mt lnh ca ng
dng.
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.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 96
WM_DEADCHAR 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
phm dead key c nhn. Phm 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 ng dng gi thng ip ny xc nh mt phm
nng lin quan n mt ca s. gi thng ip ny th dng
hm SendMessage.
WM_HOTKEY Thng ip ny c gi khi ngi dng nhn mt
phm nng c ng k trong RegisterHotKey.
WM_KEYDOWN Thng ip ny c gi cho ca s nhn c s quan
tm khi ngi dng nhn mt phm trn bn phm. Phm ny
khng phi phm h thng (Phm khng c nhn phm Alt).

WM_KEYUP
Thng ip ny c gi cho ca s nhn c s quan
tm khi ngi dng nh mt phm c nhn trc .Phm
ny khng phi phm h thng (Phm khng c nhn phm Alt).
WM_KILLFOCUS Thng ip ny c gi ti ca s ang nhn c s
quan tm trc khi n mt quyn ny.
WM_SETFOCUS Thng ip ny c gi ti ca s sau khi ca s nhn
c s quan tm ca Windows
WM_SETHOTKEY ng dng s gi thng ip ny n ca s lin quan
n phm nng, khi ngi dng nhn mt phm nng th ca s
tng ng lin quan ti phm nng ny s c kch hot.
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 phm 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 F10 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).
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 97
WM_SYSKEYUP 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
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 th phn cng vt l pht
sinh ra mt m qut (scan code), trn bn phm tng thch IBM cc phm c gn vi cc m
v d phm W l 17, phm E l 18, v phm R l 19... Cch sp xp ny thun ty da trn v tr
vt l ca phm trn bn phm. Nhng ngi xy dng nn Windows nhn thy rng nu dng
trc tip m qut th s khng thch hp khi b l thuc vo bn phm hin ti v tng lai. Do
h c x l bn phm bng cch c lp thit b hn, bng cch to ra mt bng nh ngha tp
gi tr phm tng qut m sau ny c gi l m phm o. Mt s gi tr bn phm o m ta
khng thy xut hin trn bn phm IBM tng thch nhng c th tm thy chng trong bn
phm ca cc nh sn xut khc hay chng c dnh cho bn phm trong tng lai. Cc gi
tr ca phm o ny c nh ngha trong tp tin tiu WINUSER.H v c bt u vi cc
tip u ng VK_xxxxx. sau y l bng m t cc phm o thng dng trong Windows giao tip
vi bn phm IBM tng thch.
Thp phn Thp lc
phn
Hng phm nh ngha
trong WINUSER.H
Windows dng Bn phm IBM tng
thch
1 01 VK_LBUTTON Nt chut tri
2 02 VK_RBUTTON Nt chut phi
3 03 VK_CANCEL X Ctrl Break
4 04 VK_MBUTTON Nt chut gia
Bng 4.2 M t cc phm o
Cc thng ip trn ch c nhn khi dng chut, ta khng bao gi nhn c thng
ip trn nu g t bn phm. Khng nn dng phm CtrlBreak trong ng dng Windows,
phm ny thng c ngt cc ng dng trong DOS.
Nhng gi tr phm o tip sai dnh cho cc phm Backspace, Tab, Enter, Escape, v
Spacebar c dng nhiu trong chng trnh Windows.

T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 98
Thp phn Thp lc
phn
Hng phm nh ngha
trong WINUSER.H
Windows
dng
Bn phm IBM tng thch
8 08 VK_BACK X Backspace
9 09 VK_TAB X Tab
12 0C VK_CLEAR X Phm s 5 trong NumPad
vi n Numlock tt.
13 0D VK_RETURN X Enter (cho hai phm)
16 10 VK_SHIFT X Shift (cho hai phm)
17 11 VK_CONTROL X Ctrl (cho hai phm)
18 12 VK_MENU X Alt (cho hai phm)
19 13 VK_PAUSE X Pause
20 14 VK_CAPITAL X Caps Lock
27 1B VK_ESCAPE X Esc
32 20 VK_SPACE X Spacebar
Bng 4.3 M t cc phm o
Bng m t phm o tip sau y l cc phm thng c s dng nhiu trong Windows.
Thp phn Thp lc
phn
Hng phm nh ngha
trong WINUSER.H
Windows
dng
Bn phm IBM tng thch
33 21 VK_PRIOR X Page Up
34 22 VK_NEXT X Page Down
35 23 VK_END X End
36 24 VK_HOME X Home
37 25 VK_LEFT X Phm tri
38 26 VK_UP X Phm mi tn ln
39 27 VK_RIGHT X Phm phi
40 28 VK_DOWN X Phm xung
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 99
41 29 VK_SELECT -
42 2A VK_PRINT -
43 2B VK_EXECUTE -
44 2C VK_SNAPHOT Print Screen
45 2D VK_INSERT X Insert
46 2E VK_DELETE X Delete
47 2F VK_HELP
Bng 4.4 M t cc phm o (tip theo)
Mt s cc phm o nh VK_SELECT, VK_PRINT, VK_EXECUTE, hay VK_HELP
thng ch xut hin trong cc bn phm gi lp m chng ta t khi nhn thy.
Tip sau l m phm o ca cc phm s v phm ch trn bn phm chnh. Trong bn
phm b sung phm Num Pad c qui nh ring.
Thp
phn
Thp lc
phn
Hng phm nh ngha
trong WINUSER.H
Windows
dng
Bn phm IBM tng thch
48-57 30-39 Khng X T phm 0 n phm 9 trn
bn phm chnh
65-90 41-5A Khng X T phm A n phm Z.
Bng 4.5 M t cc phm ch v s trn bn phm chnh
M phm o trong bng trn bng vi m ASCII ca k t m phm th hin. Trong cc
ng dng Windows thng khng dng m phm o ny m thay vo ng dng ch x l
thng ip k t dnh cho k t c m ASCII.
Cui cng l m phm o ca bn phm m rng Num Pad (bn phi ca bn phm) v
cc phm chc nng (F1, F2, F3...).
Thp
phn
Thp lc
phn
Hng phm nh ngha
trong WINUSER.H
Windows
dng
Bn phm IBM tng
thch
96-105 60-69 VK_NUMPAD0 n
VK_NUMPAD9
Phm 0 9 khi n
Num Lock c bt
106 6A VK_MULTIPLY Phm *
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 100
107 6B VK_ADD Phm +
108 6C VK_SEPARATOR
109 6D VK_SUBTRACT Phm -
110 6E VK_DECIMAL Phm .
111 6F VK_DIVIDE Phm /
112-
121
70-79 VK_F1 n VK_F10 X Phm F1 n F10
122-
135
7A-87 VK_F11 n VK_F24 Phm F11 n F24
144 90 VK_NUMLOCK Num Lock
145 91 VK_SCROLL Scroll Lock
Bng 4.6 M t cc phm b sung
Mt s cc phm o nh F13- F24 th c Windows to ra phng h cho cc bn phm
sau ny. Thng th ng dng Windows ch dng phm F1 F10 m thi.
4.2.4.4. Cc tham s wParam v lPram trong thng ip pht sinh t bn phm
Trong thng ip phm g (WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN,
v WM_SYSKEYUP) th tham s wParam s nhn gi tr m phm o. Cn tham s lParam s
cha thng tin chi tit v phm c g vo.
Bng sau m t cc thng tin cha trong 32 bit ca tham s lParam.
Bit nhn dng Ni dung
0-15 Cha s ln ca phm c nhn xung. Nu
chng ta ch nhn ri nh ra th gi tr ny bng 1, nu
chng ta gi lun phm th s lp ny s tng theo.
16-23 Cha m qut OEM (Original Equipment
Manufacturer) c pht sinh t phn cng, ta hu nh
khng quan tm n thng tin ny
24 C ny c gi tr 1 khi phm c nhn l phm
thuc nhm phm m rng trn bn phm IBM tng
thch hay phm Alt, Ctrl bn phi bn phm c nhn.
Windows t quan tm n gi tr ca c ny
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 101
29 M ng cnh ca phm (Context code), nu c
ny c gi tr bng 1 th phm Alt c nhn, iu ny
tng ng vi thng ip WM_SYSKEYDOWN hay
WM_SYSKEYUP c pht sinh
30 Trng thi ca phm trc , trng ny bng 0
cho bit phm trc trng thi nh, v 1 nu phm
trc trng thi nhn.
31 Trng thi dch chuyn ca phm, c ny bng 0
nu phm ang c nhn, v bng 1 nu phm c
nhn.
Bng 4.7 M t thng tin cha trong tham s lParam
4.2.5. on chng trnh minh ha
on chng trnh di y minh ha mt chng trnh nh nhp cc k t t bn phm
v xut ra mn hnh.
#define BUFSIZE 65535;
#define SHIFTED 0x8000;
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam )
{
HDC hdc; // Thit b ng cnh
TEXTMETRIC tm; // Cu 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; // Chiu 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; // Ta x ca caret
static int nCaretPosY = 0; // Ta y ca caret
static int nCharWidth = 0; // B dy ca k t
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 102
static int cch = 0; // S k t trong buffer
static int nCurChar = 0; // Ch n k t hin thi trong buffer
static PTCHAR pchInputBuf; // K t tm a vo buffer
int i, j; // Bin lp
int cCR = 0; // S k t xung dng
int nCRIndex = 0; // Ch 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; // Mu ca vn bn
COLORREF crPrevBk; // Mu nn
switch ( message )
{
case WM_CREATE:
/* Ly thng tin font hin thi */
hdc = GetDC ( hWnd );
GetTextMetrics ( hdc, &tm );
ReleaseDC ( hWnd, hdc );
dwCharX = tm.tmAveCharWidth;
dwCharY = tm.tmHeight;
/* Cp pht b nh m lu k t nhp vo */
pchInputBuf = (LPTSTR)GlobalAlloc( GPTR,BUFSIZE * sizeof ( TCHAR ) );
return 0;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 103
case WM_SIZE:
/* Lu gi kch thc ca vng lm vic */
dwClientX = LOWORD ( lParam );
dwClientY = HIWORD ( lParam );
/* Tnh kch thc ti a ca mt dng
v s dng ti a trong vng lm vic */
dwLineLen = dwClientX - dwCharX;
dwLines = dwClientY / dwCharY;
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 WM_KILLFOCUS:
/*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 0x1B: // Escape
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 104
MessageBeep( ( UINT ) 1 );
return 0;
case 0x09: // tab
/* 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 0x0D: // Xung dng
/* Lu k t xung dng v to dng mi a caret
xung v tr mi */
pchInputBuf [ cch++ ] = 0x0D;
nCaretPosX = 0;
nCaretPosY += 1;
break;
default: // X l nhng k t c th hin th c
ch = ( TCHAR ) wParam;
HideCaret ( hWnd );
/* Ly b dy ca k t v xut ra */
hdc = GetDC ( hWnd );
GetCharWidth32 ( hdc, (UINT) wParam, (UINT)wParam,
&nCharWidth );
TextOut(hdc, nCaretPosX, nCaretPosY*dwCharY, &ch, 1);
ReleaseDC ( hWnd, hdc );
/* Lu k t vo buffer */
pchInputBuf [ cch++ ] = ch;
/* Tnh li v tr ngang ca caret. Nu v tr ny ti cui dng th chn thm k t xung dng v di chuyn
caret n dng mi */
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 105
nCaretPosX += nCharWidth;
if ( ( DWORD ) nCaretPosX > dwLineLen )
{
nCaretPosX = 0;
pchInputBuf [ cch++ ] = 0x0D;
++nCaretPosY;
}
nCurChar = cch;
ShowCaret ( hWnd );
break;
}
SetCaretPos ( nCaretPosX, nCaretPosY * dwCharY );
break;
case WM_KEYDOWN:
switch ( wParam )
{
case VK_LEFT: // LEFT arrow
/* 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 = pchInputBuf [--nCurChar ];
hdc = GetDC ( hWnd );
GetCharWidth32 ( hdc, ch, ch, &nCharWidth );
ReleaseDC ( hWnd, hdc );
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 106
nCaretPosX=max(nCaretPosX-nCharWidth,0 );
ShowCaret ( hWnd );
}
break;
case VK_RIGHT: // RIGHT arrow
/* Di chuyn caret sang phi */
if (nCurChar < cch)
{
HideCaret ( hWnd );
/* Tnh ton li v tr ca caret khi sang phi */
ch = pchInputBuf [ nCurChar ];
if ( ch == 0x0D )
{
nCaretPosX = 0;
nCaretPosY++;
}
/* Nu k t khng phi l enter th kim tra xem phm shift c c nhn hay khng. Nu c nhn th i
mu v xut ra mn hnh. */
else
{
hdc = GetDC ( hWnd );
nVirtKey = GetKeyState ( VK_SHIFT );
if ( nVirtKey & SHIFTED )
{
crPrevText=SetTextColor( hdc,RGB (255, 255, 255) );
crPrevBk= SetBkColor(hdc,RGB(0,0,0));
TextOut(hdc,nCaretPosX,nCaretPosY*dwCharY,
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 107
&ch,1 );
SetTextColor ( hdc, crPrevText );
SetBkColor ( hdc, crPrevBk );
}
GetCharWidth32(hdc,ch,ch,&nCharWidth);
ReleaseDC ( hWnd, hdc );
nCaretPosX = nCaretPosX + nCharWidth;
}
nCurChar++;
ShowCaret ( hWnd );
break;
}
break;
case VK_UP: // Phm mi tn ln
case VK_DOWN: // Phm mi tn xung
MessageBeep ( (UINT) 1 );
return 0;
case VK_HOME: // Phm home
/* Thit lp v tr ca caret dng u tin */
nCaretPosX = nCaretPosY = 0;
nCurChar = 0;
break;
case VK_END: // Phm end
/* Di chuyn v cui vn bn v lu v tr ca k t xung dng cui */
for ( i=0; i < cch; i++ )
{
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 108
if ( pchInputBuf [ i ] == 0x0D )
{
cCR++;
nCRIndex = i + 1;
}
}
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.
*/
for ( i = nCRIndex, j = 0; i < cch; i++, j++ )
szBuf [ j ] = pchInputBuf [ i ];
szBuf [ j ] = TEXT ( '\0' );
/* Tnh v tr dc ca caret */
hdc = GetDC ( hWnd );
GetTextExtentPoint32(hdc,szBuf, lstrlen(szBuf), &sz );
nCaretPosX = sz.cx;
ReleaseDC ( hWnd, hdc );
nCurChar = cch;
break;
default:
break;
}
SetCaretPos( nCaretPosX, nCaretPosY*dwCharY );
break;
case WM_PAINT:
if ( cch == 0 )
break;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 109
hdc = BeginPaint ( hWnd, &ps );
HideCaret ( hWnd );
SetRect ( &rc, 0, 0, dwLineLen, dwClientY );
DrawText ( hdc, pchInputBuf, -1, &rc, DT_LEFT );
ShowCaret ( hWnd );
EndPaint ( hWnd, &ps );
break;
case WM_DESTROY:
PostQuitMessage ( 0 );
/* Gii phng buffer */
GlobalFree ( ( HGLOBAL) pchInputBuf );
UnregisterHotKey ( hWnd, 0xAAAA );
break;
default:
return DefWindowProc ( hWnd, message, wParam, lParam );
}
return NULL;
}
4.3. THIT 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 ng dng ha khng qu phc tp th cng c
thc hin ch yu l chut, ring i vi cc ng dng i hi s phc tp khi v th ngi ta
dng bt v.
Vi 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.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 110
Cng tng t nh bn phm, thit b chut cng c dng nhp d liu t ngi
dng vo ng dng nhng d liu y khng phi l vn bn nh khi nhp t bn phm m l cc
thao tc v hay x l cc i tng ha.
4.3.1. C bn v thit b chut trong 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 tra 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 cng c th kim tra s nt ca thit b chut bng cch dng hm trn theo cu 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 tr chut (mouse cursor). Con tr chut ny c mt
im gi l im nng (hot spot) , im nng ny nm trong hnh bitmap, v do ngi to con
tr chut quyt nh. Khi chng ta tham chiu ti mt v tr ca con tr chut th chnh l chng
ta ang dng ta ca im nng ny.
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 ng dng ang x l cn mt khong thi gian th con tr 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, IDC_ARROR);
Vi thit b chut ta c th c cc hnh ng nh sau:
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 111
Kch chut : nhn v th mt nt chut.
Kch p chut : nhn v th chut nhanh (nhn 2 ln nhanh).
Ko : di chuyn chut trong khi vn nm gi mt nt.
4.3.2. X l cc thng ip t thit b chut
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 ng dng b qua khng x l.
4.3.2.1. 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 WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK
Gia WM_MBUTTONDOWN WM_MBUTTONUP WM_MBUTTONDBLCLK
Phi WM_RBUTTONDOWN WM_MBUTTONUP WM_RBUTTONDBLCLK
Bng 4.8 M t thng ip kch thit b chut
Th tc ca s ca ng dng s nhn c thng ip ca nt chut gia nu my tnh
ci thit b chut c 3 nt. Tng t nh vy vi thng ip thit b chut phi, chng ta cn c
thit b chut dng 2 nt. nhn c thng ip kch p thit b chut th tc ca s phi
khai bo nhn thng ip ny.
Wndclass.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
Trong thng ip pht sinh t thit b chut th tham s lParam s cha v tr ca thit b
chut, 16 byte thp s cha gi tr ta x, cn 16 byte cao s cha gi tr ta ca y. ly ra
hai gi tr ny ta c th dng macro l LOWORD v HIWORD.
Gi tr wParam s cho bit trng thi ca nt nhn, phm Shift, v phm Ctrl. Chng ta
c th kim tra cc trng thi ny bng cch dng bit mt n c nh ngha trc trong
WINUSER.H. Cc mt n ny c bt u bng tin t MK_xxx (Mouse Key)

T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 112
MK_LBUTTON
Nt chut tri nhn
MK_MBUTTON
Nt chut gia nhn
MK_RBUTTON
Nt chut phi nhn
MK_SHIFT
Phm Shift c nhn
MK_CONTROL
Phm Ctrl c nhn
Bng 4.9 M t trng thi ca chut v phm nhn
V d khi nhn c thng ip WM_LBUTTONDOWN chng ta mun kim tra xem
phm Ctrl c c nhn hay khng bng cch so gi tr wParam vi mt n MK_CONTROL.
...
if (wParam & MK_CONTROL)
{
/* C gi 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 trn mn hnh m tu thuc vo thng s phn cng ca thit b
chut c ci t v tc lm vic ca n.
Khi chng ta kch nt chut tri vo vng lm vic ca mt ca s khng kch hot
(inactive window) th Windows s kch hot ca s ny tc l ca s va c kch sau
truyn thng ip WM_LBUTTONDOWN vo th tc WndProc ca ca s. Khi mt ca s
nhn c thng ip WM_XXXDOWN th khng nht thit phi nhn c thng ip
WM_XXXUP hay ngc li. iu ny c gii thch nh sau, khi ngi dng kch tri vo
mt ca s v gi lun nt chut va kch ri ko thit b chut n mt vng thuc phm vi ca
ca s khc mi th. Khi ca s u tin s nhn c thng ip nhn chut
WM_LBUTTONDOWN v ca s th hai s nhn c thng ip nh thit b chut
WM_LBUTTONUP. Tuy nhin tnh hung trn s khng xut hin vi hai trng hp ngoi l
sau :
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 113
Th tc WndProc ca mt ca s ang thc hin vic bt gi thit b chut
(mouse capture), i vi tnh trng ny th ca s tip tc nhn c thng ip chut
cho d con tr chut c di chuyn ra ngoi vng lm vic ca ca s. Kiu ny thng
xut hin trong cc ng dng v hay thao tc i tng ha, v d khi ta v mt 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.
Nu xut hin hp thng tin trng thi (model) ca h thng, th khng c chng
trnh no khc nhn c thng ip ca thit b chut. Hp thoi trng thi h thng v
hp thoi trng thi ca ng dng ngn cn vic chuyn qua ca s khc trong mt ng
khi n cha gii quyt xong hay vn cn trng thi kch hot (active).
4.3.2.2. Thng ip ca thit b chut ngoi vng lm vic
Vi cc thng ip ca thit b chut va tm hiu trong phn trc u c pht sinh
khi thit b chut nm trong vng lm vic ca ca s. Khi di chuyn con tr chut ra khi vng
lm vic ca ca s nhng vn trong phm vi ca ca s th khi cc thng ip ca thit b
chut s c pht sinh dng thng ip ca thit b chut ngoi vng lm vic (nonclient-area).
Ngoi vng lm vic ca mt ca s l ca s thanh tiu , thc n, v thanh cun ca ca s.
Ni chung vi cc thng ip ca thit b chut pht sinh t ngoi vng lm vic th
chng ta khng quan tm lm, thay vo ta giao ph cho hm mc nh x l l
DefWindowProc thc hin. iu ny cng ging nh l thng ip bn phm h thng m ta
tm hiu trong cc phn trc.
Cng tng t nh thng ip xut pht t vng lm vic, cc thng ip ngoi vng lm
vic c nh ngha vi t NC vo sau du "_", ta c bng m t cc thng ip pht sinh t
ngoi vng lm vic nh sau.
Nt Nhn Th Nhn p
Tri
WM_NCLBUTTONDOWN WM_NCLBUTTONUP WM_NCLBUTTONDBLCLK
Gia
WM_NCMBUTTONDOWN WM_NCMBUTTONUP WM_NCMBUTTONDBLCLK
Phi
WM_RBUTTONDOWN WM_NCRBUTTONDOWN WM_NCRBUTTONDBLCLK
Bng 4.10 M t cc thng ip chut ngoi vng lm vic
Cc tham s lParam v wParam cng hi khc so vi cc thng ip thit b chut pht
sinh trong vng lm vic. Vi tham s lParam ca thng ip pht sinh t ngoi vng lm vic
s ch ra v tr ngoi vng lm vic ni m thit b chut di chuyn hay ko ti. V tr ny c
nh danh bi cc gi tr nh ngha trong WINUSER.H c bt u vi HT (vit tt cho hit-
test).
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 114

Hnh 4.2 Minh ha ta mn hnh v ta vng lm vic
Tham s lParam s cha ta x 16 byte thp v ta y 16 byte cao. Tuy nhin,
y l ta mn hnh, khng phi l ta vng lm vic ging nh thng ip pht sinh t
vng lm vic. Do chng ta phi chuyn v ta vng lm vic x l tip nu cn.
chuyn t ta mn hnh sang ta lm vic hay ngc li t ta lm vic sang
ta mn hnh ta dng hai hm tng ng c Windows cung cp nh sau :
ScreenToClient( hwnd, &pt );
ClientToScreen( hwnd, &pt );
pt l bit cu trc POINT, hai hm trn s nhn tham chiu n bin pt do sau khi gi
hm ta s c gi tr pt tng ng ta mi.
4.3.3 V d minh ho thit b chut
on chng trnh thc hin chc nng v t do bng cc thao tc: Nhn chut tri v
mt ng thng t v tr con tr ca bt v n v tr chut tri kch, ngoi ra ta cng c th v
bng cch nhn phm tri v gi lun sau ta ko chut n v tr bt k ri th. Nu ta nhn
chut phi th s i mu ca bt v.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
HDC hdc;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 115
static POINT oldPoint;
static int iC;
int WIDTH_PEN = 2;
HPEN oPen,pen;
COLORREF Col [ ] ={ RGB (0, 0, 0) ,
RGB (255 ,0 ,0),
RGB (0, 255, 0),
RGB (0, 0, 255),
RGB (255, 255, 0)};
POINT point;
TCHAR str [255];
switch ( message ) // X l thng ip
{
case WM_LBUTTONDOWN:
/* V ng thng t v tr trc n v tr chut hin ti*/
hdc = GetDC ( hWnd );
pen = CreatePen ( PS_SOLID,WIDTH_PEN,Col [ iC] );
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 );
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 116
ReleaseDC ( hWnd, hdc );
break;
case WM_RBUTTONDOWN:
/* Chuyn index ca bng mu sang v tr tip theo, nu cui bng mu th quay li mu u tin*/
iC = ( iC+1 ) % ( sizeof ( Col ) / sizeof ( COLORREF ) );
break;
case WM_MOUSEMOVE:
/* Xut to chut hin thi ln thanh tiu */
sprintf ( str,"Toa do chuot x = %d, To do y = %d", LOWORD(lParam), HIWORD(lParam));
SetWindowText ( hWnd, str );
/* Kim tra xem c gi phm chut tri hay khng*/
if ( wParam & MK_LBUTTON )
{
hdc = GetDC ( hWnd );
pen = CreatePen ( PS_SOLID,WIDTH_PEN,Col [ iC ] );
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;
SelectObject ( hdc, oPen );
DeleteObject ( pen );
ReleaseDC ( hWnd, hdc );
}
break;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 117
case WM_DESTROY:
PostQuitMessage ( 0 );
break;
default:
return DefWindowProc ( hWnd, message, wParam, lParam );
}
return 0;
}
4.4. B NH THI 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 chut . V ngoi ra th mt thng
ip cng rt hu dng l thng ip thi gian. Khi vit mt chng trnh chng ta c th yu
cu h iu hnh gi mt thng ip cnh bo theo tng khong thi gian nht nh chng ta
c th lm mt s x l cn thit. Thng ip ny c gi t h iu hnh n chng trnh
thng qua mt b nh thi gian (Timer) v thng ip c pht sinh l WM_TIMER. Vic
dng chc nng ny rt n gin, ta khai bo mt b nh thi gian v thit lp thng s khong
thi gian Windows pht sinh thng ip Timer cho ng dng. Khi ng dng ch cn x l
thng ip WM_TIMER trong hm x l ca s WinProc.
4.4.1. B nh thi gian v vn ng 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.

4.4.2. Khi to b nh thi gian
Khng nh thng ip xut pht t bn phm v chut, c Windows gi t ng vo
hng i thng ip ca ng dng. i vi thng ip thi gian phi c khai bo trc bng
hm SetTimer, sau khi khai bo hm ny th Windows s gi thng ip WM_TIMER iu n
vo hng i ca ng dng.
Hm SetTimer c khai bo nh sau :
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 118
UINT_PTR 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.
nIDEvent : 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 ng dng ta gi hm KillTimer,
hm ny c khai bo :
BOOL KillTimer( HWND hWnd, UINT_PTR uIDEvent );
hWnd : nh danh ca ca s dng b nh thi gian
uIDEvent : nh danh ca b nh thi gian.
4.4.3. V d v b nh thi gian
4.4.3.1. Dng thng ip WM_TIMER
on chng trnh minh ha vic s dng b nh thi gian trong chng trnh. C mi
0.5 giy th chng trnh pht sinh t ng ngu nhin mt vng trn trn mn hnh.
#include <time.h>
#include "stdio.h"
#define MAX_POINT 10000
#define IDT_TIMER1 1
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
PAINTSTRUCT ps;
HDC hdc;
static int NumCir = 0;
static POINT point [ MAX_POINT ];
int r = 5, i;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 119
HPEN pen, oldPen;
RECT rc;
TCHAR str [255];
/* X l thng ip*/
switch ( message )
{
case WM_CREATE:
/* Khai bo dng b nh thi gian trong ng dng*/
SetTimer(hWnd, IDT_TIMER1, 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 trong point v bn knh l r */
for( i=0; i < NumCir; 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].x+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*/
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 120
GetClientRect ( hWnd, &rc );
/*Pht sinh ngu nhin mt vng trn*/
point [NumCir].x = rand( ) % (rc.right - rc.left);
point [NumCir].y = rand( ) % (rc.bottom - rc.top);
NumCir++;
/*Hin th s vng trn sinh ra trn thanh tiu */
sprintf ( str,"So vong tron : %d", NumCir);
SetWindowText ( hWnd, str );
/* Lm bt hp l vng lm vic & yu cu v li */
InvalidateRect ( hWnd, &rc, FALSE);
break;
case WM_DESTROY:
/* Hy b s dng b nh thi gian*/
KillTimer ( hWnd, IDT_TIMER1 );
PostQuitMessage ( 0 );
break;
default:
return DefWindowProc ( hWnd, message, wParam, lParam );
}
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.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 121
#include <time.h>
#include "stdio.h"
#define IDT_TIMER1 1
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
PAINTSTRUCT ps;
HDC hdc;
/* Khai bo bin lu cc gi tr khng gian*/
struct tm *newtime;
time_t CurTime;
TCHAR str [255];
RECT rc;
/* Bin LOGFONT to font mi*/
LOGFONT lf;
HFONT oldFont, font;
COLORREF 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 );
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 122
newtime = localtime ( &CurTime );
GetClientRect ( hWnd, &rc );
/* To chui xut ra mn hnh*/
sprintf(str,"Gio hien tai : %d gio: %d phut: %d giay", newtime->tm_hour,newtime->tm_min, newtime-
>tm_sec);
/* Thit lp mu k t xut*/
oldColor = SetTextColor ( hdc, color );
/* To font ring dng*/
memset ( &lf, 0, sizeof ( LOGFONT ) );
lf.lfHeight = 50;
strcpy ( lf.lfFaceName, "Tahoma" );
font = CreateFontIndirect ( &lf );
oldFont = ( HFONT ) SelectObject ( hdc,font );
/* Xut ra mn hnh*/
DrawText ( hdc, str, strlen(str), &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
/* Ly li cc gi tr mc nh*/
SetTextColor ( hdc,oldColor );
SelectObject ( hdc,oldFont );
DeleteObject ( font );
EndPaint ( hWnd, &ps );
break;
case WM_DESTROY:
PostQuitMessage ( 0 );
break;
default:
return DefWindowProc ( hWnd, message, wParam, lParam );
}
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 123
return 0;
}
/* Hm x l ca Timer*/
VOID CALLBACK TimerProc( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
/* Hm ny n gin yu cu t li vng lm vic*/
RECT rc;
GetClientRect ( hwnd, &rc );
InvalidateRect ( hwnd, &rc, TRUE );
}




























T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 124
Chng 5
X L VN BN V FONT CH
5.1. M U
Mt trong cc c tnh ni bt nht ca Windows l giao din giao tip vi ngi dng.
Nh c tnh ny, nhiu dng d liu thng tin khc nhau c my tnh h tr khi xut ra mn
hnh, my in, Trong , xut vn bn ra vng lm vic ca cc ng dng Win32 l hnh thc
ph bin nht trong giao din ha.
cc chng trc, cc thao tc xut thng tin ch c thc hin thng qua cc ca s
thng bo, hp thoi v cc phn t iu khin. Chng ny s trnh by cch th hin ni dung
vn bn trn vng lm vic ca ca s thng qua cc hm Win32 API.
Phn cui chng s trnh by cch khi to, chn v x l cc dng font ch khc nhau.
Nh kh nng ny, vic th hin cc on vn bn s tr nn sinh ng v trc quan hn.
5.2. X L VN BN
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. Hin th vn bn
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 tr lpString ra DC, vi
chiu di c xc nh bi cbString (khng ph thuc vo k t NULL nh du kt thc
chui).
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 125
Hai trng 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 trung 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 lpnTabStopPositions c gi tr 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 fuOptions c thit lp l ETO_CLIPPED, hoc l vng
nn hnh ch nht s c t bi mu nn nu fuOptions l 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 tr v gi tr khc 0 nu thnh cng. Ngc
li, gi tr tr v bng 0.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 126
Mt hm mc mc cao hn xut vn bn l hm DrawText :
int DrawText(HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, 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 hnh 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 0x0D) hoc k t xung dng LF (linefeed, bng \n hoc 0x0A) c 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_WORDBREAK. Nu khng mun Windows ct b cc phn d ra khi v ch vt qu
phm vi khung ch nht, ta thm c DT_NOCLIP. Nu mun k t tab (\t hoc 0x09) c
din dch thnh k t phn ct, cn thm c DT_EXPANDTABS. Gi tr mc nh ca tab l 8
khong trng. C DT_TABSTOP c dng t li gi tr tab. Trong trng hp ny, byte
cao ca word thp (bits 15-8) ca uFormat s cha gi tr tab cn thay th.
5.2.2. nh dng vn bn
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 thc 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);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 127
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 CLR_INVALID.
Khi v ch, Windows s dng hai ch : ch trong sut (TRANSPARENT) v ch
m (OPAQUE). ch trong sut, mu nn s khng c s dng n, ch 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);
Vi 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 tr 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 tr mc nh ca Windows. Nu fMode
bng TA_RIGHT, v tr 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 tr c thit lp trc
bi hm MoveToEx hoc LineTo, hoc mt hm thay i v tr khc. C TA_UPDATE cng
cp nht im gc v u chui (nu dng TA_LEFT) v v cui chui (nu dng TA_RIGHT)
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 128
cho ln gi k tip. iu ny cn thit cho vic hin th nhiu dng vn bn vi hm TextOut.
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 GetTextAlign(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 | TA_RIGHT | 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];
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 129
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);
Mt thuc tnh khc ca DC nh hng n cch v chui l khong cch gia cc k t
trong chui hin th. Khong cch mc nh ca Windows l 0, khi cc k t c hin th
lin tip nhau. thay i khong cch gia cc k t, ta dng hm :
int SetTextCharacterExtra(HDC hDC, int nCharExtra);
Trong , nCharExtra l khong cch theo n v logic thit lp gia cc k t. Nu
thnh cng, hm tr v khong cch trc khi c thit lp. Ngc li, gi tr tr v l
0x80000000. bit khong cch hin ti, ta dng hm :
int GetTextCharacterExtra(HDC hDC);
Nu thnh cng, gi tr tr v cho bit khong cch hin ti. Ngc li, gi tr tr v l
0x80000000.
Ngoi ra, Windows cn h tr cc hm cho bit rng k t v kch thc chui hin
th. y l cc hm cp cao, s dng trong vic trnh by vn bn vi cc kiu font kh phc tp.
Trong chng ny, chng ta ch cp n mt s hm nh GetTextMetrics (phn 5.3.2) v
GetTextExtentPoint32 (phn 5.3.5).
5.3. FONT CH
Trong Windows, khi trnh by vn bn, cc k t c th hin theo nhiu dng khc
nhau. y l mt trong nhng c trng c bn ca giao din ha - ngi dng (GUI
Graphical User Interface). thc hin iu ny, Windows h tr nhiu dng font ch khc
nhau. Trong phn ny, chng ta tm hiu cc vn chnh v cc font ch, cng nh cch s
dng chng trnh by vn bn.
5.3.1. Khi nim font trong Windows
Mt font ch l mt tp hp cc k t v k hiu cng dng, th hin qua kiu ch, loi
ch v kch c ch.
Kiu ch xc nh cc c trng v k t v k hiu trong font ch, v d rng, nt
ch dy hoc mnh, c chn (c gch ngang hoc cc nt cong mnh u cc k t) hay khng.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 130
Loi ch xc nh m nht (trng lng) v nghing ca dng font th hin. Chia
lm ba loi sau : roman, opaque, v italic. 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 b xut tng ng, v d my in. Khng nh font GDI, khi in bng font thit b, Windows
khng cn nh dng font, m ch cn gi ni dung d liu trc tip n thit b. Ngi dng
chn trc tip font t my in in. i vi font GDI, Windows chuyn vn bn thnh nh
bitmap sau chuyn n my in in. Nh vy, li im ca font GDI l c lp vi thit b
xut, tuy nhin tc x l in chm hn.
Cc font GDI thng thng gm c : font bitmap, font vector v font TrueType. Font
bitmap c cu thnh t ma trn pixel, c li im l hin th nhanh, nhng hn ch trong vic
th hin vi cc kch thc khc nhau (do ch phng to thu nh, v khi phng trng rt th).
Font vector th hin cc k t nh l tp hp cc nt v (s dng cc hm GDI), do linh ng
v co gin hn font bitmap, tuy nhin c v kh chm v ng nt cng khng c mm
mi cho lm.
Font TrueType l dng font c s dng ph bin nht hin nay, c lu tr di dng
mt tp cc im nh, kt hp mt s thut ton bin i. Do th hin sc xo cc ng nt
trn mn hnh v my in. Chng ta s kho st cc hm x l cho cc font ch dng ny trong
phn 5.3.3. Cn by gi chng ta tm hiu cch s dng cc font c sn ca h thng.
5.3.2. S dng font nh ngha sn
Khi ta gi cc hm v ch TextOut, TabbedTextOut, ExtTextOut hoc DrawText,
Windows s s dng font ch ang c chn trong DC hin th ni dung vn bn. Ta c th
dng mt s font c Windows nh ngha sn, thng gi l font h thng (phn bit cc font
do ngi dng to trong qu trnh x l vn bn xem phn 5.3.3). Tn macro ca cc font ny
th hin trong bng sau :
MACRO FONT
ANSI_FIXED_FONT
Font vi kch thc c nh ca k t da trn
Windows. Font Courier l mt v d in hnh ca
dng font ny.
ANSI_VAR_FONT
Font vi rng k t thay i da trn cc k
t chun ca Windows. Font MS San Serif l mt v
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 131
d in hnh.
DEVICE_DEFAULT_FONT
Font vi thit b cho c chn mc nhin.
Dng font ny thng co sn trong h thng iu
khin vic trnh by trn thit b. Tuy nhin, i vi
mt s thit b, font c ci t ngay trn thit b. V
d, i vi my in, cc font thit b ci sn thc hin
thao tc in nhanh hn so vi vic load bitmap nh v t
my tnh.
DEFAULT_GUI_FONT
Font ca giao din ha c thit lp mc
nh.
OEM_FIXED_FONT
Font ch c nh, da trn b k t OEM. V
d, i vi my IBM, font OEM da trn b k t
IBM PC.
SYSTEM_FONT
Font h thng ca Windows. c h iu
hnh dng trnh by cc thnh phn giao din nh
thanh tiu , menu, ni dung vn bn trong cc hp
thoi thng ip. Cc font h thng ny lun c sn khi
ci h iu hnh, trong khi cc font khc cn phi ci
thm ty theo ng dng sau ny.
SYSTEM_FIXED_FONT
Font Windows c s dng nh font h thng
trong cc phin bn trc 3.0.
Bng 5.1 Macro cc font nh ngha sn.
Vic chn v s dng font h thng trong Windows kh n gin. lm iu ny, u
tin chng trnh to ra handle ca font - kiu bin HFONT, sau chn font dng hm
GetStockObject.
HGDIOBJ GetStockObject(int fnObject);
Trong , kiu HGDIOBJ l HFONT, bin fnObject l mt trong cc macro bng
trn. Nu thnh cng, hm ny tr v handle ca font h thng hin hnh. Ngc li, gi tr tr v
l NULL. thay i font, ta gi hm SelectObject.
HGDIOBJ SelectObject(HDC hDC, HGDIOBJ hGDIObj);
Hoc gn hn, ta c th gi :
SelectObject(hDC.GetStockObject(fnObject));
Khi , font hin hnh trong DC l font va c gi. Hm tr v macro font trc .
Nu khng thnh cng, li tr v l GDI_ERROR. Thng khi gi font nh sn, nu cc font
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 132
khng c sn, h thng s tr v font h thng (SYSTEM_FONT). Lu , ch nn dng cc font
c sn nu ch hin th ca DC ng dng hin thi l MM_TEXT.
xem cc thuc tnh ca font h thng, v d kch thc ca b font tnh ton v tr
khi xut vn bn, ta dng hm GetTextMetrics.
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 trnh sau minh ha vic chn font nh sn vo mt DC, sau vit mt
chui 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 tr cc hm s dng cc font ch t to. Phn tip theo s bn k hn
v cc hm x l cc font ny.
5.3.3. S dng font t to
Font logic l mt i tng GDI c handle kiu HFONT. Mt font logic l mt m t
ca mt font ch thc t. Tng t nh vit v logic v chi sn logic, font logic l mt i
tng tru tng, v tr thnh font thc t trong DC khi ng dng gi hm SelectObject.
u tin, ta cn nh ngha cc trng trong cu trc LOGFONT theo mt trong hai
cch sau :
Thit lp cc trng trong cu trc LOGFONT da trn cc c tnh ca font bn
quan tm. Trong trng hp ny, khi gi hm SelectObject, Windows s s dng
mt thut ton "nh x font" chn mt font tng thch nht hin c trn thit
b.
Chn font trong hp thoi Font, hm ChooseFont s khi gn cc gi tr trong
cu trc LOGFONT theo thuc tnh font c chn.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 133
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 CreateFontIndirect. Tuy nhin, hm CreateFont t c s dng hn
do hm cn gi cc bin trong cu trc LOGFONT, trong khi hm CreateFontIndirect 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 ng vi mt
font vt l trong 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 trng 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.
5.3.4. Cu trc LOGFONT v TEXTMETRIC
to font logic, ta c th gi hm CreateFont v CreateFontIndirect. Hm
CreateFontIndirect nhn con tr cu trc LOGFONT. Hm CreateFont c bin l 14 trng
ca LOGFONT. Xt nh ngha ca cu trc LOGFONT :
typedef struct tagLOGFONT // lf
{
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 134
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;
Hai trng u trong cu trc LOGFONT tnh theo n v logic, do ph thuc vo
ch hin th. Trng lfHeight l chiu cao ca k t, nhn gi tr mc nh ca font nu bng
0. Nu lfHeight m, Windows xc nh kch c font qua gi tr tuyt i gn nht. Gi tr dng
ca lfHeight xp x bng gi tr tmHeight tng ng trong cu trc TEXTMETRICS. Trng
lfWidth xc nh rng k t. Trong trng hp lfWidth bng 0, Windows s chn font tng
ng da vo chiu cao lfHeight. Gi tr lfWidth khc 0 thng c s dng cho cc font
TrueType (khng tng thch cho cc font vector). Trng ny tng ng trng
tmAveCharWidth trong cu trc TEXTMETRICS.
Hai trng tip theo xc nh hng hin th ca cc k t trong chui. Trng
lfEscapement xc nh gc lch gia ng c s (base line) v trc x ca thit b. Gi tr nhp
vo l mt bi s ca 10. Chui xut theo hng mc nh (tri sang phi), hng ln, t phi
sang tri, v hng xung nu gi tr ln lt l 0, 900, 1800, v 2700. Trng lfOrientation xc
nh hng ng c s ca tng k t so vi trc x. Gi tr c xc nh tng t
lfEscapement. Nu ng dng gi hm trong Windows NT, vi ch ha l
GM_ADVANCED, gi tr lfEscapement c xc nh c lp vi lfOrientation. Trong cc
trng hp khc, hai gi tr ny phi c thit lp nh nhau.
V d sau th hin vic xut mt chui quanh tm vng lm vic ca ca s ng dng
bng cch thay i gi tr ca trng lfEscapement v lfOrientation tng 10 .
RECT rc;
int angle;
HFONT hfnt, hfntPrev;
LPSTR lpszRotate = "String to be rotated.";
// Cp pht vng nh cho cu trc LOGFONT.
PLOGFONT plf=(PLOGFONT)LocalAlloc(LPTR, sizeof(LOGFONT));
// Xc nh tn v m nht ca font.
lstrcpy(plf->lfFaceName, "Arial");
plf->lfWeight = FW_NORMAL;
// Thu nhn kch thc ca vng lm vic ca s ng dng .
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 135
GetClientRect(hwnd, &rc);
// Thit lp ch nn TRANSPARENT cho thao tc xut vn bn.
SetBkMode(hdc, TRANSPARENT);
// V chui quay quanh tm vng lm vic tng 10 (36 ln).
for (angle = 0; angle < 3600; angle += 100)
{
plf->lfEscapement = angle;
hfnt = CreateFontIndirect(plf);
hfntPrev = SelectObject(hdc, hfnt);
TextOut(hdc, rc.right/2, rc.bottom/2, lpszRotate, lstrlen(lpszRotate));
SelectObject(hdc, hfntPrev);
DeleteObject(hfnt);
}
// Chuyn ch hin th v li dng OPAQUE.
SetBkMode(hdc, OPAQUE);
// Gii phng vng nh cp pht cho cu trc LOGFONT.
LocalFree((LOCALHANDLE) plf);
Trng tip theo l lfWeight xc nh m nht ca k t, c gi tr t 0 n 1000.
Trong trng hp bng 0, Windows s dng gi tr mc nh. tin dng, ta dng mt s
macro sau :
Tn Gi tr
FW_DONTCARE 0
FW_THIN 100
FW_EXTRALIGHT 200
FW_ULTRALIGHT 200
FW_LIGHT 300
FW_NORMAL 400
FW_REGULAR 400
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 136
FW_MEDIUM 500
FW_SEMIBOLD 600
FW_DEMIBOLD 600
FW_BOLD 700
FW_EXTRABOLD 800
FW_ULTRABOLD 800
FW_HEAVY 900
FW_BLACK 900
Bng 5.2 Macro xc nh m nht lfWeight.
Cc trng lfItalic, lfUnderline, lfStrikeOut xc nh font nghing, c gch di, gch
ngang nu c thit lp bng TRUE.
Trng lfCharSet xc nh tp k t s dng. Gi tr OEM_CHARSET xc nh tp k
t ph thuc h iu hnh. Thng thng, ta s dng DAFAULT_CHARSET (tp k t mc
nh). Vic chn tp k t l rt quan trng, nu ng dng s dng font c tp k t khng xc
nh, h thng khng th thng dch chng.
Cc trng cn li kh phc tp. Chng ta khng phn tch cc gi tr ca chng y.
Trng lfOutPrecision nh ngha chnh xc (c th c) ca font thc t so vi font yu cu.
Trng lfClipPrecision xc nh cch thc cc k t b ct b khi nm ngoi vng clipping.
Trng lfQuality dng cho font vector, xc nh cch thc GDI nh ngha chnh xc ca font
logic so vi font vt l. Trng lfPitchAndFamily xc nh h font ch. Trng lfFaceName xc
nh tn kiu font.
Sau khi chn font cho DC, ta cn bit cc c trng ca font hin ti dng cho vic
xut vn bn bng hm GetTextMetrics. Ta c cu trc TEXTMETRIC :
typedef struct tagTEXTMETRIC // tm
{
LONG tmHeight;
LONG tmAscent;
LONG tmDescent;
LONG tmInternalLeading;
LONG tmExternalLeading;
LONG tmAveCharWidth;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 137
LONG tmMaxCharWidth;
LONG tmWeight;
LONG tmOverhang;
LONG tmDigitizedAspectX;
LONG tmDigitizedAspectY;
BCHAR tmFirstChar;
BCHAR tmLastChar;
BCHAR tmDefaultChar;
BCHAR tmBreakChar;
BYTE tmItalic;
BYTE tmUnderlined;
BYTE tmStruckOut;
BYTE tmPitchAndFamily;
BYTE tmCharSet;
} TEXTMETRIC;
Cc trng v kch thc c tnh theo n v logic, ph thuc vo ch hin th.
Trng tmHeight cho bit chiu cao ca k t, bng tng hai trng tmAscent (phn trn ng
c s) v tmDescent (phn di ng c s). Trng tmInternalLeading xc nh khong cch
bn trong ng bin xc nh bi tmHeight. Ngi thit k c th cho gi tr ny bng 0.
Trng tmExternalLeading l khong cch Windows thm vo gia cc dng. Ngi dng cng
c th gn gi tr ny bng 0. Trng tmAveCharWidth cho bit rng trung bnh ca cc k t
ch thng. Trng tmMaxCharWidth cho bit rng k t ln nht tnh theo n v logic.
i vi b font fixed-pitch ( rng khng i), gi tr ny bng tmAveCharWidth.
Trng tmOverhang cho bit phn m rng (theo n v logic) m Windows thm vo
font vector khi font nghing hoc t m. Khi font nghing, gi tr tmAveCharWidth khng thay
i, bi v chui cc k t nghing vn c rng bng chui ch thng thng. Trong trng
hp ch m, Windows s m rng tng k t. Khi , tmAveCharWidth ca k t bnh thng
bng tmAveCharWidth tr i ln tmOverhang ca k t m.
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
thng s ca nIndex l LOGPIXELSX v LOGPIXELSY.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 138
int GetDeviceCaps(HDC hDC, int nIndex);
Trng tmFirstChar xc nh gi tr k t u tin trong 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 bng 32).
Cc trng tmWeight, tmItalic, tmUnderlined, tmStruckOut, tmCharSet v
tmPitchAndFamily ging cc trng lfWeight, lfItalic, lfUnderline, lfStrikeOut, lfCharSet v
lfPitchAndFamily trong cu trc LOGFONT.
5.3.5. S dng hp thoi chn font
chn font, ta c th s dng hp thoi font. u tin, ng dng khi to cc gi tr
trong cu trc CHOOSEFONT, sau gi hm ChooseFont hin th hp thoi lit k danh
sch cc font. Sau khi ngi dng chn mt font c sn v chn OK, hm ChooseFont s khi
gn cc gi tr tng ng vo cu trc LOGFONT. ng dng c th gi hm
CreateFontIndirect to mt font logic da trn cc yu cu ca ngi dng.
Xt cu trc CHOOSEFONT.
typedef struct tagCHOOSEFONT // cf
{
DWORD lStructSize;
HWND hwndOwner;
HDC hDC;
LPLOGFONT lpLogFont;
INT iPointSize;
DWORD Flags;
DWORD rgbColors;
LPARAM lCustData;
LPCFHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 139
HINSTANCE hInstance;
LPTSTR lpszStyle;
WORD nFontType;
WORD ___MISSING_ALIGNMENT__;
INT nSizeMin;
INT nSizeMax;
} CHOOSEFONT;
Trng lStructureSize xc nh s byte kch thc cu trc. Trng hwndOwner xc
nh ca s cha hp thoi chn font. Trng ny c th l mt handle ca s xc nh, hoc
cng c th bng NULL nu hp thoi khng xc nh ca s cha. Trng hDC l DC ca my
in c cc font c lit k trong hp thoi. Ch dng trng hDC nu thit lp trng Flags vi
c CF_PRINTERFONTS hoc CF_BOTH; trong cc trng hp khc, gi tr trng ny b b
qua.
Trng lpLogFont tr n cu trc LOGFONT. Nu ta thit lp trong trng Flags gi
tr CF_INITTOLOGFONTSTRUCT, v khi gn cc gi tr cho n, hm ChooseFont s khi
to hp thoi vi font gn ging nht. Sau khi ta chn OK ng hp thoi, hm ChooseFont s
thit lp cc gi tr ca cu trc ny da trn cc chn la tng ng.
Trng iPointSize xc nh kch thc font c chn theo n v 1/10 im. Gi tr ny
s c thit lp sau khi ta ng hp thoi.
Trng Flags l tp cc bit c c dng khi to hp thoi Font. Trng ny c th
kt hp cc gi tr sau :
CF_APPLY
Hp thoi c thm button Apply. Ta
phi cung cp hm hook x l thng ip
WM_COMMAND cho button ny.
CF_BOTH
Hp thoi lit k danh sch cc font
my in v font mn hnh. Trng hDC s xc
nh DC lin quan n my in. C ny cn kt
hp vi c CF_SCREENFONTS v
CF_PRINTERFONTS.
CF_TTONLY
Xc nh hm ChooseFont ch qun l
v chn la trn font dng TrueType.
CF_EFFECT
hp thoi th hin cc control cho
php ngi dng thit lp ch gch ngang, gch
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 140
di v chn mu. Nu c ny c thit lp,
ta c th s dng trng rgbColors xc nh
mu font ban u. Ta cng c th s dng
trng lfStrikeOut v lfUnderline ca cu trc
LOGFONT tr n trng lpLogFont xc nh
cc thit lp ban u ca checkbox gch ngang
v gch di k t. Hm ChooseFont s s
dng cc trng ny tr v gi tr chn la
ca ngi dng.
CF_ENABLEHOOK
Cho php th tc hook thit lp trong
trng lpfnHook.
CF_ENABLETEMPLATE
Ch ra trng hInstance v
lpTemplateName xc nh hp thoi mu s
dng mc nh.
CF_ENABLETEMPLATEHANDLE
Ch ra trng hInstance xc nh khi
d liu cha hp hoi mu trc khi np. H
thng s b qua gi tr ca trng
lpTemplateName.
CF_FORCEFONTEXIST
Xc nh hm ChooseFont s ch ra li
nu ngi dng c chn font hoc kiu khng
tn ti.
CF_INITTOLOGFONTSTRUCT
Xc nh hm ChooseFont phi s
dng cu trc LOGFONT qua trng
lpLogFont khi to hp thoi.
CF_LIMITSIZE
Xc nh hm ChooseFont ch chn
font c kch thc trong gii hn t nSizeMin
n nSizeMax.
CF_NOOEMFONTS
Ging c CF_NOVECTORFONTS.
CF_NOFACESEL
Khi s dng cu trc LOGFONT
khi to cc control ca hp thoi, trong
combo box tn font khng th hin mt font
no ang c chn c.
CF_NOSCRIPTSEL
Khng cho php chn combo box
Scrip. Khi c ny c thit lp, trng
lfCharSet ca cu trc LOGFONT c thit
lp vi gi tr DEFAULT_CHARSET khi hm
ChooseFont tr v. C ny ch dng khi khi
to hp thoi.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 141
CF_NOSTYLESEL
Khi s dng cu trc LOGFONT
khi to cc control ca hp thoi, ta khng
dng kiu font no c (combo box style).
CF_NOSIZESEL
Khi s dng cu trc LOGFONT
khi to cc control ca hp thoi, ta khng
hin th chn la ban u cho combo box kch
thc.
CF_NOVECTORFONTS
Hm ChooseFont khng cho php chn
la font vector.
CF_NOVERTFONTS
Hp thoi font ch lit k cc font vit
hng ngang.
CF_PRINTERFONTS
Hp thoi ch lit k cc font h tr my
in lin quan n DC xc nh qua handle hDC.
CF_SCALABLEONLY
Ch nh hm ChooseFont ch cho php
chn la cc font c th co gin (font vector,
TrueType, ).
CF_SCREENFONTS
Hp thoi ch lit k cc font mn hnh
c h thng h tr.
CF_SHOWHELP
Hp thoi s hin th nt Help. Trng
hwndOwner phi xc nh window nhn thng
ip HELPMSGSTRING m hp thoi a ra
khi ngi dng nhn button Help.
CF_USESTYLE
Xc nh trng lpszStyle tr n vng
m cha d liu kiu m hm ChooseFont
dng khi to combo box Font Style. Sau
khi ngi dng ng hp thoi, hm
ChooseFont chp d liu kiu vo vng m.
CF_WYSIWYG
Xc nh hm ChooseFont cho php
chn la cc font c sn cho my in v mn
hnh. Nu c ny c thit lp, c c
CF_BOTH v CF_SCALABLEONLY cng
cn c thit lp.
Bng 5.3 Cc macro c Flags khi to hp thoi Font.
Nu c CF_EFFECT c thit lp, trng rgbColors s xc nh mu ch khi to. Nu
hm ChooseFont thc hin thnh cng, trng ny s cha gi tr RGB ca mu ch m ngi
dng chn.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 142
Trng lCustData xc nh d liu c ng dng nh ngha chuyn cho hm hook gn
bi gi tr lpfnHook. Nu h thng gi thng ip WM_INITDIALOG, gi tr lParam ca
thng ip l con tr tr n cu trc CHOOSEFONT xc nh khi hp thoi c to.
Trng lpfnHook tr n th tc hook CFHookProc x l cc thng ip ca hp thoi.
s dng gi tr ny, cn phi thit lp c vi CF_ENABLEHOOK.
Trng lpTemplateName tr n chui (kt thc bng k t NULL) xc nh tn ti
nguyn hp thoi mu, lin quan vi trng hInstance. Nu thit lp c
CF_ENABLETEMPLATEHANDLE, hInstance l handle ca i tng vng nh cha hp
thoi mu. Nu thit lp c CF_ENABLETEMPLATE, hInstance xc nh module cha hp
thoi mu c tn trng lpTemplateName.
Trng lpszStyle tr n vng m cha d liu kiu. Nu thit lp c CF_USESTYLE,
hm ChooseFont s s dng d liu trong vng m khi to combo box kiu font. Khi
ngi dng ng hp thoi, hm ChooseFont chp chui trong combo box kiu font vo vng
m ny.
Trng nFontType xc nh dng font tr v. C th kt hp cc gi tr sau :
BOLD_FONTTYPE
Font ch m. Gi tr ny c lp
li trong trng lfWeight ca cu trc
LOGFONT, v bng FW_BOLD.
ITALIC_FONTTYPE
Font ch nghing. Gi tr ny c
lp li trong trng lfItalic ca cu trc
LOGFONT.
PRINTER_FONTTYPE
Font ch l font my in.
REGULAR_FONTTYPE
Font ch bnh thng. Gi tr ny
c lp li trong trng lfWeight ca cu
trc LOGFONT, v bng FW_REGULAR
.
SCREEN_FONTTYPE
Font ch l font mn hnh.
SIMULATED_FONTTYPE
Font da theo giao din GUI.
Bng 5.4 Cc macro xc nh dng font tr v.
Trng nSizeMin v nSizeMax xc nh kch c ch nh nht v ln nht m ngi
dng c th chn. Hm ChooseFont ch nhn ra cc gi tr ny khi c CF_LIMITSIZE c
thit lp.
Nh trnh by trn, to hp thoi font cho php ngi dng chn cc thuc tnh
ca mt font logic, ta dng hm ChooseFont.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 143
BOOL ChooseFont(LPCHOOSEFONT lpcf);
Vi lpcf tr n cu trc CHOOSEFONT cha cc thng tin dng khi to hp thoi.
Khi hm tr v, cu trc ny cha cc thng tin m ngi dng chn.
Nu ngi dng nhn nt OK trn hp thoi, hm tr v gi tr khc 0. Ngc li, nu
chn Cancel hoc ng (close) hp thoi, gi tr tr v bng 0.
V d sau minh ha vic chn font logic s dng hp thoi font.
HFONT FAR PASCAL MyCreateFont( void )
{
CHOOSEFONT cf;
LOGFONT lf;
HFONT hfont;
// Khi to cc trng trong cu trc CHOOSEFONT.
cf.lStructSize = sizeof(CHOOSEFONT);
cf.hwndOwner = (HWND)NULL;
cf.hDC = (HDC)NULL;
cf.lpLogFont = &lf;
cf.iPointSize = 0;
cf.Flags = CF_SCREENFONTS;
cf.rgbColors = RGB(0,0,0);
cf.lCustData = 0L;
cf.lpfnHook = (LPCFHOOKPROC)NULL;
cf.lpTemplateName = (LPSTR)NULL;
cf.hInstance = (HINSTANCE) NULL;
cf.lpszStyle = (LPSTR)NULL;
cf.nFontType = SCREEN_FONTTYPE;
cf.nSizeMin = 0;
cf.nSizeMax = 0;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 144
// Hin th hp thoi font.
ChooseFont(&cf);
/* To font logic da trn cc chn la ca ngi dng v tr v handle ca font logic */
hfont = CreateFontIndirect(cf.lpLogFont);
return (hfont);
}
5.3.6. V d v hin th vn bn bng cc font khc nhau
Sau khi tm hiu v vic xut ni dung vn bn v s dng font ch bng cc hm
Win32 API, ta c th trnh by vn bn mt cch linh ng hn. Phn ny a ra v d xut
mt chui vn bn theo cc font khc nhau trn cng mt dng.
Mt trong cc cch trnh by mt dng vn bn vi nhiu font ch khc nhau l s dng
hm GetTextExtentPoint32 sau mi ln gi hm TextOut v cng chiu di nhn c vo v
tr hin th hin ti. V d sau xut cu "This is a sample string", s dng ch m vit "This
is a", ch nghing vit "sample", v tr li ch m vit string.". Sau khi xut xong,
chng trnh phc hi li dng font mc nh.
int XIncrement;
int YStart;
TEXTMETRIC tm;
HFONT hfntDefault, hfntItalic, hfntBold;
SIZE sz;
LPSTR lpszString1 = "This is a ";
LPSTR lpszString2 = "sample ";
LPSTR lpszString3 = "string.";
/* To font ch m v nghing (hm ny khng vit y) */
hfntItalic = MyCreateFont();
hfntBold = MyCreateFont();
/* Chn font ch m v vit chui ti v tr xc nh bi cp tham s (XIncrement, YStart) */
XIncrement = 10;
YStart = 50;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 145
hfntDefault = SelectObject(hdc, hfntBold);
TextOut(hdc, XIncrement, YStart, lpszString1, lstrlen(lpszString1));
/* Tnh di ca chui u tin v cng gi tr ny vo gi tr XIncrement thc hin thao tc xut
chui tip theo */
GetTextExtentPoint32(hdc, lpszString1, lstrlen(lpszString1), &sz);
XIncrement += sz.cx;
/* Xc nh ln phn m rng k t qua cu trc TEXTMETRIC v tr bt XIncrement. (iu ny ch
cn thit cho font vector) */
GetTextMetrics(hdc, &tm);
XIncrement -= tm.tmOverhang;
/* Chn font nghing v vit chui th hai bt u ti v tr (XIncrement, YStart) */
hfntBold = SelectObject(hdc, hfntItalic);
GetTextMetrics(hdc, &tm);
XIncrement -= tm.tmOverhang;
TextOut(hdc, XIncrement, YStart, lpszString2, lstrlen(lpszString2));
/* Tnh di ca chui u tin v cng gi tr ny vo gi tr XIncrement thc hin thao tc xut
chui tip theo */
GetTextExtentPoint32(hdc, lpszString2, lstrlen(lpszString2), &sz);
XIncrement += sz.cx;
/* Chn li font ch m v vit chui th ba bt u ti v tr (XIncrement, YStart) */
SelectObject(hdc, hfntBold);
TextOut(hdc, XIncrement-tm.tmOverhang, YStart, lpszString3, lstrlen(lpszString3));
/* Chn li font ban u */
SelectObject(hdc, hfntDefault);
/* Xo cc i tng font ch */
DeleteObject(hfntItalic);
DeleteObject(hfntBold);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 146
Trong v d trn, ta s dng hm GetTextExtentPoint32 nhn chiu di v chiu cao
ca chui vn bn.
BOOL GetTextExtentPoint32(HDC hDC, LPCTSTR lpString, int cbString, LPSIZE
lpSize);
Trong hDC l handle ca DC, lpString tr n chui vn bn c chiu di xc nh bi
cbString. V lpSize tr n cu trc SIZE cha kch thc ca chui k t cn xc nh.
typedef struct tagSIZE
{
LONG cx;
LONG cy;
} SIZE;
Cu trc trn xc nh chiu rng v chiu cao ca mt hnh ch nht ln lt qua hai
bin cx v cy.
Nu thc hin thnh cng, hm tr v gi tr khc 0. Ngc li, gi tr tr v bng 0.
























T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 147
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.
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.
6.2. DEVICE CONTEXT
Device context l mt thit b xut logic, lin kt vi mt thit b xut vt l c th.
Windows khng cho php chng ta kt xut trc tip ra thit b vt l m phi thng qua handle
ca device context. Handle device context l mt s nguyn khng du c Windows cp nh
mt nh danh ca device context.
V d 1 : Xut dng ch "Hello Windows 2000" ra mn hnh
HDC hDC;
/* Ly device context ca ca s */
hDC=GetDC(hWnd);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 148
/* Xut dng ch "Hello Windows 2000" ra ca s ti v tr (20,20) */
TextOut(hDC, 20, 20, "Hello Windows 2000", 18);
/*Gii phng Device Context */
RealeaseDC(hWnd, hDC);
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, 20, 100, 100);
/* Restore li bt v c */
SelectObject(hDC, oldHPen);
/* Gii phng bt v to ra */
DeleteObject(hPen);
/* Gii phng device context */
ReleaseDC(hWnd, hDC);
6.2.1. Thao tc ly v v gii phng Device Context
C 3 cch nhn v v gii phng mt Device Context :
S dng hm BeginPaint v EndPaint khi x l thng ip WM_PAINT:
hDC = BeginPaint(hWnd, &ps);
// X l
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 149
EndPaint(hWnd, &ps);
Bin ps l mt cu trc kiu PAINTSTRUCT.
Dng hm GetDC v ReleaseDC khi x l cc thng ip khc WM_PAINT:
hDC = GetDC(hWnd);
//X l
ReleaseDC(hWnd, hDC);
Dng hm GetWindowDC v ReleaseDC :
hDC = GetWindowDC(hWnd);
// X l
ReleaseDC(hWnd, hDC);
Lu : Cc hm GetDC v BeginPaint tr v device context cho vng client ca ca s,
ring hm GetWindowDC tr v device context ca ton b ca s k c thanh tiu , menu,
thanh cun v tt nhin l c vng client. v ra ngoi vng lm vic (client area), phi
chn thng ip WM_NCPAINT( NC: None Client). Ngoi ra, cn c th nhn v device
context ca ton mn hnh bng hm:
hDC = CreateDC( "DISPLAY", NULL, NULL, NULL);
6.2.2. To lp v gii phng memory device context
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 mt 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 mt hin th ch gm 1 bit nh vy.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 150
Do cn lm cho b mt hin th ny rng hn bng cch chn mt i tng bitmap GDI vo
MDC:
SelectObject(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
BitBlt:
BitBlt(hDC, xDest, yDest, nWidth, nHeight, hMemDC, xSource, ySource);
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);
// Ly v kch thc vng client ca ca s hin hnh
RECT rect;
GetClientRect(hWnd, &rect);
// To MDC tng thch vi DC ca ca s
HDC hMemDC;
hMemDC = CreateCompatibleDC(hdc);
// Chn mt i tng bitmap m rng vng hin th cho MDC
HBITMAP bitmap,oBitmap;
bitmap = CreateCompatibleBitmap(hdc,rect.right,rect.bottom);
oBitmap = (HBITMAP)SelectObject(hMemDC,bitmap);
// V li nn MDC
FillRect(hMemDC, &rect, HBRUSH (GetBkColor(hMemDC)));
// Xut hnh nh, text ra MDC
SetPixel(hMemDC, 0, 0, RGB(255,0,0));
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 151
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);
// Phc hi li bitmap c cho MDC
SelectObject(hMemDC, oBitmap);
// Gii phng MDC, bitmap to
DeleteDC(hMemDC);
DeleteObject(bitmap);
EndPaint(hWnd, &ps);
break;
6.3. MT S HM HA C S
S dng cc hm ha c s, ta c th trnh 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 trong chng trc. y s trnh by cc nhm
hm cn li.
6.3.1. Nhm hm v
COLORREF 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, int 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);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 152
Di chuyn bt v n ta (x, y) trn 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);
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 sau :
Gi tr Gii thch
PS_SOLID

PS_DASH

PS_DOT

PS_DASHDOT

PS_DASHDOTDOT

PS_NULL Khng hin th
PS_INSIDEFRAME

Bng 6.1 Cc kiu bt v penStyle
V d : To bt v mi v dng bt v ny v mt s ng c s.
HDC hDC;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 153
POINT PointArr[3];
HPEN hPen, hOldPen;
hDC = GetDC(hWnd);
PointArr[0].x = 50;
PointArr[0].y = 10;
PointArr[1].x = 250;
PointArr[1].y = 50;
PointArr[2].x = 125;
PointArr[2].y = 130;
// V mt ng gp khc bng Pen hin hnh
Polyline(hDC, PointArr, 3);
//To Pen mi c nt lin, dy 1, mu xanh
hPen = (HPEN)CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
//Chn bt v mi cho hDC ca window
hOldPen = SelectObject(hDC, hPen);
//V ng thng vi bt v mi
MoveToEx(hDC, 100, 100, NULL);
LineTo(hDC, 200, 150);
//Tr li bt v c cho hDC
SelectObject(hDC, hOldPen);
//Xo bt v mi to v gii phng hDC
DeleteObject(hPen);
ReleaseDC(hWnd, hDC);
6.3.2. Nhm hm min
HBRUSH CreateSolidBrush(COLORREF cRef);
To mu t c vi mu cRef.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 154
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.
BOOL ExtFloodFill(HDC hDC, int xStart, int yStart, COLORREF cRef, UINT
fillStyle);
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(BLACK_PEN);
SelectObject(hDC, hPen);
Rectangle(hDC, 10, 10, 50, 50);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 155
Rectangle(hDC, 100, 100, 200, 200);
// Dng mt trong cc mu t c sn t hnh
hBrush = (HBRUSH)GetStockObject(GRAY_BRUSH);
SelectObject(hDC, hBrush);
FloodFill(hDC, 30, 30, RGB(0,0,255));
// To mu t mi t hnh th hai
hBrush = (HBRUSH)CreateHatchBrush(HS_DIAGCROSS, RGB(0, 255, 255));
hOldBrush = (HBRUSH)SelectObject(hDC, hBrush);
FloodFill(hDC, 150, 150, RGB(0, 0, 0));
SelectObject(hDC, hOldBrush);
//Xa mu t v gii phng hDC
DeleteObject(hBrush);
ReleaseDC(hWnd, hDC);
6.3.3. Nhm hm bitmap
6.3.3.1. Np nh
C hai cch np nh bitmap :
Np t bitmap resource trong chng trnh :
HBITMAP LoadBitmap(HINSTANCE hInstance, LPCTSTR lpBitmapName);
i s u tin hInstance l handle th hin ca module cha bitmap resource, c th l
NULL nu bitmap mun np l mt bitmap h thng. l cc bitmap nh s dng cho cc
thnh phn giao din chng trnh nh close box v cc du check, cc nh danh bt u vi
tip u ng OBM. i s th hai c th s dng macro MAKEINTRESOURCE nu bitmap kt
hp vi mt nh danh kiu nguyn, hoc l chui tn bitmap resource. Sau khi s dng, dng
hm DeleteObject gii phng handle ang tham chiu n bitmap .
V d : Np bitmap resource, c s dng MDC trnh gy chp mn hnh.
// Ly v kch thc vng client ca ca s
RECT rect;
GetClientRect(hWnd, &rect);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 156
// Ly v handle device context ca ca s
HDC hdc;
hdc = GetDC(hWnd);
//To MDC tng thch vi hDC ca ca s
HDC hMemDC;
hMemDC = CreateCompatibleDC(hdc);
HBITMAP hNewBmp,hOldBmp;
// Np bitmap resource c ID l IDB_CUB
hNewBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_CUB));
if(hNewBmp)
{
//Gn bitmap mi cho MDC
hOldBmp = (HBITMAP)SelectObject(hMemDC,hNewBmp);
//Copy bitmap t MDC sang DC
BitBlt(hdc, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0, SRCCOPY);
}
//Phc hi li bitmap c cho MDC
SelectObject(hMemDC, hOldBmp);
//Gii phng bitmap va to v MDC, hdc
DeleteObject(hNewBmp);
DeleteDC(hMemDC);
ReleaseDC(hdc);
Np t file bitmap ca Windows(*.bmp) :
*Bng mu(Color Palette):
Bng mu trong Windows GDI l mt khi nim ging nh bng mu tht s ca ha s,
n gm cc mu(palette entry) vi thng tin c th v mt sc .
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 157
qun l vic th hin mu trn cc ca s, Windows s dng cc bng mu. Thng
thng cc ca s dng bng mu h thng th hin thng tin. Tuy nhin, trong nhiu trng
hp bng mu h thng khng ph hp vi nhu cu, khi ta cn thay mt s mu trong bng
mu h thng bng cc mu ph hp hn.

Trong thc t, Windows cho php mi ca s dng mt bng mu khc nhau vi iu
kin s lng mu trong bng mu khng c vt qu s mu ti a cho php ca thit b
hin th. Khi mt ca s nhn s quan tm (focus), Windows s th hin d liu trong ca s
vi s mu ti a cho php ca bng mu tng ng, nhng mu cn li trong palette s c
th hin bng nhng mu gn ging nht. i vi nhng ca s khng active, d liu s c
th hin bng nhng mu gn ging nht trong bng mu h thng.

Hnh 6.2 Cch th hin mu s dng palette.
V d v cch th hin mu s dng palette:
o Bng mu h thng c 12 gi tr mu.
o Bng mu 1 dng cho ca s 1. Ca s 1 ang active nn cc mu ca bng mu 1
c nh x trc tip vo bng mu h thng.
o Bng mu 2 dng cho ca s 2. Ca 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.
*Cu trc file bitmap :
File bitmap gm 2 phn: phn header v phn d liu nh.

Hnh 6.3 Cu trc file bitmap.
o Cu trc BITMAPFILEHEADER
Tn trng Kch thc ngha
bfType 2 bytes(WORD) Loi file(=BM)
bfSize 4 bytes(DWORD) Kch thc file(bytes)
bfReserved1 2 bytes(WORD) Khng dng(=0)
bfReserved2 2 bytes(WORD) Khng dng(=0)
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 158
bfOffBits 4 bytes(DWORD) Kch thc ca phn
BitmapHeader (byte)
o Cu trc BITMAPINFO
Tn trng Kiu ngha
bmiHeader BITMAPINFOHEADER Cc thng s nh bitmap
bmiColors RGBQUAD* Bng mu ca nh.
o Cu trc BITMAPINFOHEADER
Tn trng Kiu ngha
biSize DWORD Kch thc phn BITMAPINFO(=40 bytes)
biWidth LONG Chiu rng bitmap(theo n v pixel)
biHeight LONG Chiu cao bitmap(theo n v pixel)
biPlanes WORD S plane. Lun = 1.
biBitCount WORD S bit dng lu gi tr 1 im nh.
= 1: nh trng en
= 4: nh 16 mu
= 8: nh 256 mu
=16: nh 16 bits
=24: nh 24 bits
Gi tr ny cho bit s mu c trong bng mu
bmiColors.
biCompression DWORD Hnh thc nn ca d liu nh:
- BI_RGB: nh khng nn
- BI_RLE8: nn theo hnh thc RLE cho nh 8
bits/pixel
- BI_RLE4: nn theo hnh thc RLE cho nh 4
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 159
bits/pixel
biSizeImage DWORD Kch thc ca nh(n v byte). Trng hp
biCompression=BI_RGB th gi tr ny c th = 0.
biXPelsPerMeter LONG phn gii (DPI/m) theo phng ngang. Dng trong
trng hp nh qut t scanner.
biYPelsPerMeter LONG phn gii (DPI/m) theo phng dc. Dng trong
trng hp nh qut t scanner.
biClrUsed DWORD S mu thc s c dng. Nu = 0 th c ngha l
dng tt c mu trong bng mu.
biClrImportant DWORD S lng mu quan trng dng trong vic hin th nh.
Nu = 0 ht dng tt c mu trong bng mu.
o Cu trc RGBQUAD
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 Gi tr thnh phn RED
rgbGreen BYTE Gi tr thnh phn GREEN
rgbBlue BYTE Gi tr thnh phn BLUE
rgbReserved BYTE Khng dng
o Cu trc phn d liu nh (BITMAPDATA):
Nh trnh by trn, phn d liu tp tin bitmap dng lu gi tr index ca mu
tng ng vi im nh trong bng mu i vi nh c s mu <=256. Cc im nh c lu
tun t t tri sang phi theo tng dng qut(scanline) theo th t t di ln.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 160
i vi nh <=256 mu, bit gi tr mu (R,G,B) ng vi 1 im nh (x,y), s dng
cng thc sau:
(R,G,B) ca im nh i = bmiColors[i]
i vi nh 16 v 24 bits mu, ta khng dng palette v cch biu din ca phn d liu
c trnh by trn.
Phn d liu ca file bitmap c th c nn theo phng php RLE, ti liu ny khng
trnh by chi tit vo mi loi nh nn, nu cn cc bn c th tham kho trong cc gio trnh v
x l nh.
*Cch to bitmap t file *.bmp:
o c header ca file, ly cc thng tin v nh: rng, cao, bng mu
o c d liu nh v gii m(nu cn thit) vo b nh m.
o To palette mu t bng mu ly c t file bng hm CreatePalette.
o i palette mu cho thit b xut, s dng cc hm SelectPalette, RealizePalette.
o To lp bitmap handle bng hm CreateDIBitmap.
Hnh 6.4 S tng qut quy trnh np nh bitmap
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;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 161
Count=0;
SetCursor(LoadCursor(NULL, IDC_WAIT));
// M file bitmap c
if ((FHandle=open(bmpFN, O_BINARY|O_RDONLY))==-1)
throw "Cannot open the file.";
// c header file bitmap
read(FHandle, &bmpfh, sizeof(BITMAPFILEHEADER));
hBmp=GlobalAlloc(LMEM_MOVEABLE, bmpfh.bfOffBits-sizeof(BITMAPFILEHEADER));
BmpInfo=(BITMAPINFO*)GlobalLock(hBmp);
// c phn bitmap info v palette mu
read(FHandle, BmpInfo, bmpfh.bfOffBits-sizeof(BITMAPFILEHEADER));
if (BmpInfo->bmiHeader.biCompression != BI_RGB)
throw "Program don't support compressed bitmap file.";
// Xc nh s mu ca palette
NumColor=(int)pow(2,BmpInfo->bmiHeader.biBitCount);
if(NumColor>256)
throw "The program supports 256 colors bitmap file only.";
// Xc nh s byte cho 1 scanline
BytesPerLine=(bmpfh.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-bmpfh.bfOffBits;
// c ni dung file bitmap
hBuff=GlobalAlloc(GMEM_MOVEABLE,
BmpInfo->bmiHeader.biSizeImage);
Buff=(unsigned char *)GlobalLock(hBuff);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 162
If (!Buff) throw "Cannot read the bitmap data.";
// c tng dng trn file
do
{
n = read(FHandle,Buff,BytesPerLine);
Buff+=n;
Count++;
}while (Count<BmpInfo->bmiHeader.biHeight);
close(FHandle);
GlobalUnlock(hBuff);
GlobalUnlock(hBmp);
SetCursor(LoadCursor(NULL, IDC_ARROW));
/*-----------------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 Entry trong Palette
for (i=0;i<NumColor;i++) //Error here
{
logPal->palPalEntry[i].peRed=BmpInfo->bmiColors[i].rgbRed;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 163
logPal->palPalEntry[i].peGreen =
BmpInfo->bmiColors[i].rgbGreen;
logPal->palPalEntry[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.";
/*------------------------Tao handle bmp file ------------------------------*/
SetCursor(LoadCursor(NULL, IDC_WAIT));
// Map palette vo hdc
SelectPalette(hdc,hPal,FALSE);
RealizePalette(hdc);
BmpInfo=(BITMAPINFO *)LocalLock(hBmp);
Buff=(unsigned char *)GlobalLock(hBuff);
//To bitmap
hBmp=CreateDIBitmap(hdc,(BITMAPINFOHEADER *)BmpInfo, CBM_INIT, Buff, (BITMAPINFO
*)BmpInfo,DIB_RGB_COLORS);
GlobalUnlock(hBuff);
GlobalUnlock(hBmp);
GlobalFree(hBuff);
GlobalFree(hBmp);
SetCursor(LoadCursor(NULL, IDC_ARROW));
if(!hBmp) throw "Cannot create bitmap.";
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 164
/*-----------------------Hin th bitmap ln ca s---------------------------*/
HDC hMemDC;
HANDLE OldBmp;
// To MDC
hMemDC=CreateCompatibleDC(hdc);
SelectPalette(hMemDC, hPal, FALSE);
// Tr v palette h thng
UnrealizeObject(hPal);
// Map li palette
RealizePalette(hdc);
SelectPalette(hMemDC, hPal, FALSE);
// Lin kt hMemDC vi nh bitmap
OldBmp=SelectObject(hMemDC, hBmp);
// Copy bitmap ln window
BitBlt(hdc, 0, 0, rect.right, rect.bottom, hMemDC, 0, 0,SRCCOPY);
// Hy MDC
SelectObject(hMemDC,OldBmp);
DeleteDC(hMemDC);
}
catch(char *e)
{
MessageBox(NULL, e, "Error", MB_OK|MB_ICONERROR);
}
}
6.3.3.2. Zoom nh
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 165
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
V d : zoom nh bitmap ly t bitmap resource.
// Ly v kch thc vng client ca ca s
RECT rect;
GetClientRect(hWnd, &rect);
//Ly v handle device context ca ca s
HDC hdc;
hdc = GetDC(hWnd);
// To 2 MDC tng thch vi DC ca ca s
HDC hSourceMemDC, hDestMemDC;
hSourceMemDC = CreateCompatibleDC(hdc);
hDestMemDC = CreateCompatibleDC(hdc);
//Np bitmap cn load va to mt bitmap rng tng thch hdc
HBITMAP hBmp,hOldBmp,hBlankBmp,hOldBlankBmp;
hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_CUB));
hBlankBmp = CreateCompatibleBitmap(hdc,rect.right,rect.bottom);
if(hBmp && hBlankBmp && hSourceMemDC && hDestMemDC)
{
// Chn bitmap cn load cho MDC ngun
hOldBmp = (HBITMAP)SelectObject(hSourceMemDC, hBmp);
// Chn blank bitmap cho MDC ch
hOldBlankBmp =(HBITMAP)SelectObject(hDestMemDC,hBlankBmp);
// Ly v thng tin ca nh
BITMAP bmpInfo;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 166
GetObject(hBmp, sizeof(BITMAP),(BITMAP *)&bmpInfo);
// Zoom nh t MDC ngun sang MDC ch
StretchBlt(hDestMemDC, 0, 0, rect.right, rect.bottom,hSourceMemDC, 0, 0, bmpInfo.bmWidth,
bmpInfo.bmHeight, SRCCOPY);
// Copy nh zoom t MDC ch ln hdc
BitBlt(hdc, 0, 0, rect.right, rect.bottom, hDestMemDC, 0,0,SRCCOPY);
}
// Gii phng cc bitmap handle, MDC handle
SelectObject(hSourceMemDC, hOldBmp);
DeleteObject(hBmp);
SelectObject(hDestMemDC, hOldBlankBmp);
DeleteObject(hBlankBmp);
DeleteDC(hSourceMemDC);
DeleteDC(hDestMemDC);
ReleaseDC(hdc);
6.4. IN N
Trn Windows, cc ng dng khng truy xut trc tip my in m s dng cc hm GDI
v ra device context ca my in. Do vic in n trn Windows tr nn n gin, tng t
vic v ra cc hp thoi trn mn hnh.
Vi 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:
Ly v device context ca my in cn in.
Gi yu cu bt u vic in n (STARTDOC).
Kt xut d liu ra my in(c th sang trang _ NEWFRAME nu cn).
Gi yu cu kt thc vic in n(ENDDOC).
Gii phng device context my in.
6.4.1. Ly v handle device context my in
6.4.1.1. S dng file win.ini
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 167
Da vo thng tin v my in mc nh trong file win.ini. File win.ini lu thng tin v
my in trong section [windows], entry DEVICE.
V d : mt on ca file win.ini cha thng tin v my in mc nh.
[windows]
device = EpsonFX1050, Epson9, LPT1
l cc thng tin v tn my in, driver, v cng giao tip vi my tnh.
Mt s hm chun c ghi file win.ini ca Windows :
DWORD GetProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName,
LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize);
BOOL WriteProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName,
LPCTSTR lpString);
V d : In dng ch ra my in mc nh.
void PrintStrWinInit(char *msg)
{
char prnInfo[200];
GetProfileString("windows", "device", "NoPrinter", prnInfo, 200);
If ( strcmp(prnInfo, "NoPrinter") )
{
char prnName[100], prnDriver[100], prnPort[100];
char seps[10];
char *token;
strcpy(seps,",");
token = strtok(prnInfo, seps);
strcpy(prnName, token);
token=strtok(NULL, seps);
strcpy(prnDriver, token);
token=strtok(NULL, seps);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 168
strcpy(prnPort, token);
HDC prnDC;
prnDC=CreateDC(prnDriver, prnName, prnPort, NULL);
if(prnDC)
{
StartDoc(prnDC, NULL);
StartPage(prnDC);
TextOut(prnDC, 100, 100, "Your message here:", 18);
TextOut(prnDC, 100, 200, msg, strlen(msg));
TextOut(prnDC, 100, 300, "End of printing", 15);
EndPage(prnDC);
EndDoc(prnDC);
DeleteDC(prnDC);
}
}
}
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.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 169

Hnh 6.4 Hp thoi in
Kt qu tr v ca hm PrintDlg l mt handle device context ca my in chn.
V d : In dng ch ra my in c chn t hp thoi in chun.
void PrintStrPrintDlg(char *msg)
{
PRINTDLG pd;
ZeroMemory(&pd, sizeof(PRINTDLG));
pd.lStructSize = sizeof(PRINTDLG);
pd.hwndOwner = GetFocus();
pd.Flags = PD_RETURNDC|PD_NOSELECTION;
if(PrintDlg(&pd))
{
StartDoc(pd.hDC, NULL);
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);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 170
EndPage(pd.hDC);
EndDoc(pd.hDC);
DeleteDC(pd.hDC);
}
}

6.4.2. Cc hm iu khin in n
Hm ngha
int StartDoc(hDC, lpDocInfo)
Bt u tc v in n 1 ti liu trong file
c tn lpDocInfo, hDC l handle printer device
context.
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.
int SetAbortDoc( hDC, MyAProc )
Ch nh hm (MyAProc) x l trng
hp ngi dng mun ngt ngang tc v in.
Bng 6.2 Cc hm iu khin in n
6.4.3. X l li khi in
Trong qu trnh 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).






T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 171
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 trong b nh chnh. Nhng b nh chnh th kh nh c th lu gi mi d liu v chng
trnh, ngoi ra d liu s mt khi khng cn c cung cp nng lng. Do , cn phi s dng
h thng lu tr ph.
Chng ny trnh by cc vn trn qua hai phn sau : phn 7.2 - Qun l b nh - trnh
by cch thc Microsoft Win32 API qun l cc vng nh thng qua cc hm cp pht, s
dng, v gii phng chng; cch thc thao tc trn a ch vng nh o v cc trang nh. Phn
7.3 - X l tp tin - trnh by cc hm thc hin cc thao tc to, x l v hy tp tin, cng nh
tm hiu mt s vn lin quan n tp tin.
7.2. QUN L B NH
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 trong C++ l new, delete, . Th nhng trong 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 trang vt l m khng nh hng n a ch o. Hn na, Win32 cng khng phn bit gia
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 172
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.
7.2.1. Cc hm Global v Local
Cc hm ton cc (global) v a phng (local) l cc hm heap Windows 16 bits. Tuy
nhin, qun l b nh trong Win32 cng h tr cc hm ny c th s dng cc chng trnh,
hoc source code ca cc chng trnh vit cho Windows 16 bits. Cc hm ton cc v a
phng x l chm v t chc nng hn cc hm qun l b nh mi thit k cho Win32. Chng
ta s lm quen cc hm mi phn sau.
cp pht vng nh cho mt tin trnh, ta c th s dng hm GlobalAlloc hoc
LocalAlloc. Vic qun l vng nh trong Win32 khng phn bit hm ton cc hay cc b nh
trong Windows 16 bits. Do , khng c s phn bit gia cc i tng vng nh c cp
pht bi hai hm trn. Thm vo , vic chuyn m hnh on vng nh 16 bits sang vng a
ch o 32 bits thc hin mt s hm ton cc v a phng vi cc chn la (options) khng cn
thit hoc v ngha. V d, v c cp pht ton cc v a phng u tr v a ch o 32 bits, do
khng xc nh dng con tr gn hoc xa trong cc hm trn.
Hai hm ny cp pht mt vng nh theo kch thc nBytes trong heap. C prototype
nh sau :
HGLOBAL GlobalAlloc(UINT uFlags, DWORD nBytes);
HLOCAL LocalAlloc(UINT uFlags, UINT nBytes);
Trong uFlags xc nh cch thc cp pht vng nh. Ta c bng sau :
Ton cc a phng ngha
GMEM_FIXED LMEM_FIXED
Cp pht vng nh c
nh. Gi tr tr v l mt con
tr.
GMEM_MOVEABLE 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 hoc
LocalLock chuyn handle
sang con tr vng nh.
GMEM_ZEROINIT LMEM_ZEROINIT
Khi to ni dung
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 173
vng nh vi gi tr 0.
GPTR

GMEM_FIXED |
GMEM_ZEROINIT
GHND

GMEM_MOVEABLE |
GMEM_ZEROINIT

LPTR LMEM_FIXED |
LMEM_ZEROINIT

LHND LMEM_MOVEABLE |
LMEM_ZEROINIT
Bng 7.1 Cc c s dng trong cc hm GlobalAlloc v LocalAlloc
Ch : Khng th s dng gi tr GMEM_FIXED ng thi vi GMEM_MOVEABLE,
hoc LMEM_FIXED ng thi vi LMEM_MOVEABLE.
Nu thnh cng, hm tr v handle cho i tng vng nh c cp pht. Ngc li, gi
tr tr v l NULL.
Cc i tng vng nh c cp pht bng hm GlobalAlloc v LocalAlloc l cc
trang ring, truy cp c-ghi bi chnh tin trnh to n. Cc tin trnh khc khng th truy cp
cc i tng vng nh ny.
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 tr v con tr tr n byte u tin trong khi nh. Ngc li, gi tr
tr v l NULL.
Khi kho (lock) vng nh, cc khi nh khng th dch chuyn trong b nh my tnh.
Sau khi s dng con tr vng nh, cn m kho (unlock) chng, h thng c th di chuyn v
s dng cc vng nh linh ng cho cc tin trnh khc. Ta dng hai hm tng ng l
GlobalUnlock v LocalUnlock.
BOOL GlobalUnlock(HGLOBAL hMem);
BOOL LocalUnlock(HLOCAL hMem);
Mi ln kho vng nh, bin m tng ng tng mt n v. Mi ln m kho, bin
m gim mt. Nu vng nh cn kho, hm tr v gi tr khc 0, ngc li gi tr tr v l 0.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 174
Kch thc tht s ca vng nh c cp pht c th ln hn kch thc yu cu
(nBytes). xc nh s byte tht s c cp pht, ta dng hm GlobalSize v LocalSize.
DWORD GlobalSize(HGLOBAL hMem);
UINT LocalSize(HLOCAL hMem);
Nu thnh cng, hm tr v s byte kch thc vng nh xc nh bi hMem. Ngc li,
gi tr tr v l 0.
Ngoi ra, ta c th s dng hm GlobalReAlloc v LocalReAlloc cp pht thay i
kch thc hoc thuc tnh vng nh.
HGLOBAL GlobalReAlloc(HGLOBAL hMem, DWORD nBytes, UINT uFlags);
HLOCAL LocalReAlloc(HLOCAL hMem, UINT nBytes, UINT nFlags);
Trng nBytes xc nh kch thc cp pht li cho vng nh hMem. Tuy nhin, khi
nFlags cha GMEM_MODIFY (hoc LMEM_MODIFY), h thng b qua gi tr ny. Khi ,
hm thay i cc thuc tnh ca vng nh.
xc nh handle ca vng nh khi bit con tr vng nh, ta dng hm GlobalHandle
v LocalHandle nh sau :
HGLOBAL GlobalHandle(LPCVOID pMem);
HLOCAL LocalHandle(LPCVOID pMem);
Vi pMem l con tr tr n byte u tin trong vng nh. Nu thnh cng, hm tr v
handle cn tm. Ngc li, gi tr tr v l NULL.
Sau khi s dng xong, ta dng hm GlobalFree v LocalFree gii phng cc vng
nh c cp pht.
HGLOBAL GlobalFree(HGLOBAL hMem);
HLOCAL LocalFree(HLOCAL hMem);
Nu thnh cng, gi tr tr v l NULL. Ngc li, hm tr v gi tr handle ca i
tng ban u.
on chng trnh sau minh ha cch h thng cp pht mt vng nh vi kch thc
yu cu l 3500 bytes. Sau gn cc gi tr vng nh bng 0x3C.
HANDLE hMem;
LPBYTE lpAddress;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 175
int i, nSizeMem;
hMem = GlobalAlloc(GMEM_MOVEABLE, 3500);
if(hMem != NULL)
{
/* Vng nh c th ln hn 3500 */
nSizeMem = GlobalSize(hMem);
lpAddress = (LPBYTE)GlobalLock(hMem);
if(Address != NULL)
{
for(i=0; i<nSizeMem; i++)
lpAddress[i] = 0x3C;
GlobalUnlock(hMem);
/* */
}
/* Nu khng dng na th gi hm
GlobalFree(hMem); */
}
on chng trnh tip theo cp pht li vng nh trn vi kch thc l 5000 bytes, khi
gn cc gi tr l 0x00 :

HANDLE hMemTmp;
hMemTmp = GlobalReAlloc(hMem, 5000,
GMEM_MOVEABLE|GMEM_ZEROINIT);
if(hMemTmp != NULL)
{
hMem = hMemTmp;
nSizeMem = GlobalSize(hMem);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 176
/* */
}

/* Khi kt thc s dng, cn gi hm
GlobalFree(hMem); */
7.2.2 Cc hm Heap
Cc hm heap cho php cc tin trnh to mt vng heap ring cho mt hoc mt s trang
trong vng a ch ca tin trnh ang thc hin. Sau tin trnh c th s dng mt tp cc
hm khc nhau qun l vng nh trong heap ny. y khng c s phn bit gia vng nh
c cp pht bi hm heap ring hay dng cc hm cp pht khc.
u tin hm HeapCreate to i tng heap cho mt tin trnh. 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 dwInitialSize, DWORD
dwMaximumSize);
Trng flOptions xc nh cc thuc tnh c chn cho vng heap mi c khi to.
C th l HEAP_GENERATE_ EXCEPTIONS v HEAP_NO_SERIALIZE. Trng
dwInitialSize xc nh kch thc khi to ca heap, c lm trn cho cc trang vng nh.
Trng dwMaximumSize xc nh vng nh ti a c th cp pht cho tin trnh bng hm
HeapAlloc hoc HeapReAlloc. Hm tr v handle ca i tng heap nu thnh cng, ngc li
tr v NULL.
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 tr 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.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 177
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 0xFFFFFFFF.
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);
BOOL HeapDestroy(HANDLE hHeap);
Trong , trng dwFlags c nh ngha ch vi gi tr HEAP_NO_SERIALIZE. Nu
thnh cng, hai hm ny u tr v gi tr khc 0. Ngc li, gi tr tr v l 0.
Chng ta khng minh ha cc hm s dng b nh heap trong ti liu ny.
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 a).
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.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 178
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 trong 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 xc nh cc trang xc nhn
trong vng a ch o ca tin trnh ang gi hoc tin trnh xc nh khc.
7.2.3.1 Cp pht vng nh 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.
LPVOID VirtualAlloc(LPVOID lpAddress, DWORD dwSize, DWORD
flAllocationType, DWORD flProtect);
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 GetSystemInfo. 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 trang cha mt hay
nhiu byte nm trong khong t lpAddress n lpAddress+dwSize. Ngha l, nu hai byte nm
hai trang th c hai trang u nm trong vng cp pht.
Trng flAllocationType xc nh dng cp pht, c th kt hp t cc c :
C ngha
MEM_COMMIT
Cp pht vng lu tr vt l trong b
nh hoc a. Cc trang c cp pht xc
nhn hoc kh cp pht u c th c cp
pht li m khng gy ra li.
MEM_RESERVE
dnh vng khng gian a ch o ca
tin trnh. Khng th cp pht vng dnh
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 179
bng cc hm cp pht b nh khc (malloc,
GlobalAlloc, ) cho n khi chng c gii
phng. Chng ch c cp pht bng hm
VirtualAlloc.
MEM_RESET
p dng cho Windows NT. Khi thit lp
vi gi tr ny, d liu c xem nh khng
quan trng, c th b vit chng ln. ng dng
khng hon chuyn d liu t b nh chnh vo
(ra) tp tin trang. Mt khc, khi thit lp gi tr
ny, h thng s b qua cc gi tr ca flProtect.
MEM_TOPDOWN
Cp pht vng nh ti a ch cao nht c
th.
Bng 7.2 Cc c xc nh dng cp pht flAllocationType.
Trng flProtect xc nh cch thc bo v truy cp vng nh. Nu cc trang c
cp pht xc nhn, mt trong cc c sau c th c thit lp, kt hp vi cc c
PAGE_GUARD v PAGE_NOCACHE :
C ngha
PAGE_READONLY
Ch cho php c cc trang cp pht (khng c ghi).
PAGE_READWRITE
Cho php truy cp c v ghi cc trang vng nh.
PAGE_EXECUTE
Cho php thc thi cc tin trnh, nhng khng c v
ghi.
PAGE_EXECUTE_READ
Cho php thc thi v c, nhng khng c ghi.
PAGE_EXECUTE_READWRITE
Cho php thc thi, c v ghi.
PAGE_GUARD
Cc trang trong vng tr thnh cc trang "lnh canh".
Nu ghi hoc c cc trang ny, h thng s pht sinh li
ngoi l STATUS_PAGE_GUARD v tt tnh trng
ca trang lnh canh. Xem thm v d trong phn
7.2.3.4.
PAGE_NOACCESS
Cm truy cp (c, ghi, thc thi) cc trang. Nu truy cp,
ta c li bo v chung.
PAGE_NOCACHE
Khng dng b nh m. Thch hp vi cc ch bo
v trang hn l NO_ACCESS.
Bng 7.3 Cc c xc nh dng bo v truy cp flProtect.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 180
Nu thnh cng, hm tr v a ch c s ca cc trang vng cp pht. Ngc li gi tr
tr v l NULL.
7.2.3.2 Gii phng vng nh o
gii phng vng nh o, ta dng hm VirtualFree. Hm gii phng hoc kh cp
pht (hoc c hai) cc trang trong khng gian a ch o ca tin trnh ang gi.
BOOL VirtualFree(LPVOID lpAddress, DWORD dwSize, DWORD dwType);
Trng lpAddress l con tr tr n vng cc trang cn gii phng. Nu dwType cha c
MEM_RELEASE, y phi l con tr tr v t hm VirtualAlloc.
Trng dwSize xc nh s byte kch vng nh cn gii phng. Nu dwType cha c
MEM_RELEASE, gi tr ny cn thit lp bng 0. Trong cc trng hp khc, vng nh hng
s l cc trang c t nht mt byte nm trong on lpAddress n lpAddress + dwSize. Ngha l,
nu c 2 byte nm bin hai trang khc nhau, th c hai trang u c gii phng.
Trng dwType xc nh cch gii phng, s dng gi tr MEM_DECOMMIT, hoc
MEM_RELEASE. Vi gi tr u, hm gii phng cc trang ch nh ( c xc nhn cp
pht). Nu cc trang cha c cp pht, ta vn c th kh cp pht (decommit) m khng gy ra
li. Vi gi tr sau, hm gii phng vng nh dnh. Trong trng 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 trang, cc trang phi cng tnh trng (cp pht hay dnh), v
tt c cc trang dnh bng hm cp pht VirtualAlloc cn gii phng ng thi. Nu mt s
trang dnh ban u c xc nhn cp pht, chng cn c kh cp pht trc khi gi
hm VirtualFree gii phng.
7.2.3.3 Thao tc trn cc trang vng nh
xc nh kch thc cc trang trn my tnh, ta s dng hm GetSystemInfo.
VOID GetSystemInfo(LPSYSTEM_INFO lpSystemInfo);
Trng lpSystemInfo tr n cu trc SYSTEM_INFO cha cc thng tin h thng.
typedef struct _SYSTEM_INFO // sinf
{
union
{
DWORD dwOemId;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 181
struct
{
WORD wProcessorArchitecture;
WORD wReserved;
}
};
DWORD dwPageSize;
LPVOID lpMinimumApplicationAddress;
LPVOID lpMaximumApplicationAddress;
DWORD dwActiveProcessorMask;
DWORD dwNumberOfProcessors;
DWORD dwProcessorType;
DWORD dwAllocationGranularity;
WORD wProcessorLevel;
WORD wProcessorRevision;
}SYSTEM_INFO;
xc nh thng tin v b nh, ta ch kho st mt s trng lin quan. Trng
dwPageSize cc nh kch thc cc trang theo dng c cp pht bng hm VirtualAlloc.
Trng lpMinimumApplicationAddress tr n a ch vng nh thp nht, v trng
lpMaximumApplicationAddress tr n a ch vng nh cao nht c th truy cp bi cc ng
dng v th vin lin kt ng. Trng dwAllocationGranularity xc nh phn nh m vng
nh o cp pht. C th, hm VirtualAlloc yu cu cp pht mt byte s dnh mt vng
khng gian b nh c kch thc l dwAllocationGranularity byte.
Tin trnh c th kho mt hay nhiu trang c cp pht (xc nhn) vo vng nh vt
l (RAM), ngn chn vic h thng hon chuyn cc trang vo (ra) tp tin trang bng cch dng
hm VirtualLock.
BOOL VirtualLock(LPVOID lpAddress, DWORD dwSize);
m kho cc trang b kho, ta dng hm VirtualUnlock, cho php cc trang c th
c hon chuyn vo (ra) tp tin trang trn a.
BOOL VirtualUnlock(LPVOID lpAddress, DWORD dwSize);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 182
Trng lpAddress tr n a ch c s ca vng cc trang cn c kho. Trng
dwSize xc nh s byte vng nh cn kho, gm cc trang cha tt c cc a ch t lpAddress
n lpAddress + dwSize.
Nu thnh cng, gi tr tr v khc 0. Ngc li, cc hm tr v 0.
S trang mc nh c cp pht ti a l 30 trang. Tuy nhin, chng ta c cng th thay
i s trang ti a ny.
Cc trang cn m kho khng nht thit phi l cc trang ca ln gi kho bng hm
VirtualLock trc , nhng u phi l cc trang ang b kho.
Khc vi cc hm GlobalLock v LocalLock c dng mt bin m m chui cc
ln kho vng nh, hm VirtualLock th khng. Do m kha, ta ch cn gi hm
VirtualUnlock mt ln m thi.
7.2.3.4 S dng cc hm qun l b nh o
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 VirtualAlloc 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 trang 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 trnh 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
INT PageFaultExceptionFilter(DWORD);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 183
VOID MyErrorExit(LPTSTR);
LPTSTR lpNxtPage;
DWORD dwPages = 0;
VOID UseDynamicVirtualAlloc(VOID)
{
LPVOID lpvBase;
LPTSTR lpPtr;
BOOL bSuccess;
DWORD i;
/* dnh cc trang trong khng gian a ch o ca tin trnh */
lpvBase = VirtualAlloc(
NULL, // h thng t xc nh a ch
PAGELIMIT*PAGESIZE,// kch thc vng cp pht
MEM_RESERVE, // cp pht di dng dnh
PAGE_NOACCESS); // cch thc bo v = khng truy cp
if (lpvBase == NULL )
MyErrorExit("VirtualAlloc reserve");
lpPtr = lpNxtPage = (LPTSTR) lpvBase;
/* S dng cu trc x l ngoi l try-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*PAGESIZE; i++)
{
try
{
lpPtr[i] = 'a'; // Ghi vo b nh
}
/* Nu xut hin li trang, c gng cp pht xc nhn trang khc */
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 184
except ( PageFaultExceptionFilter(GetExceptionCode() ) )
{
/* on ny ch thc hin khi hm lc khng th xc nhn trang k tip */
ExitProcess( GetLastError() );
}
}
/* Gii phng cc trang sau khi s dng. u tin l cc trang c cp pht xc nhn */
bSuccess = VirtualFree(
lpvBase, // a ch c s ca khi nh
dwPages*PAGESIZE, // s byte cc trang cp pht
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, // gii phng ton khi nh
MEM_RELEASE); // gii phng (hon ton)
}
}
INT PageFaultExceptionFilter(DWORD dwCode)
{
LPVOID lpvResult;
/* Nu xut hin li ngoi l, thot chng trnh */
if (dwCode != EXCEPTION_ACCESS_VIOLATION)
{
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 185
printf("exception code = %d\n", dwCode);
return EXCEPTION_EXECUTE_HANDLER;
}
printf("page fault\n");
/* Nu cc trang dnh c dng th thot */
if (dwPages >= PAGELIMIT)
{
printf("out of pages\n");
return EXCEPTION_EXECUTE_HANDLER;
}
/* Ngc li, cp pht xc nhn mt trang khc */
lpvResult = VirtualAlloc(
(LPVOID) lpNxtPage, // cp pht trang tip theo
PAGESIZE, // s byte kch thuc trang
MEM_COMMIT, // cp pht xc nhn cc trang
PAGE_READWRITE); // truy cp c-ghi
if (lpvResult == NULL )
{
printf("VirtualAlloc failed\n");
return EXCEPTION_EXECUTE_HANDLER;
}
/* Tng trang m, v chuyn lpNxtPage n trang tip */
dwPages++;
lpNxtPage += PAGESIZE;
/* Tip tc thc hin ni li trang xut hin */
return EXCEPTION_CONTINUE_EXECUTION;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 186
}
on chng trnh tip theo thc hin thao tc to trang "lnh canh". Trang ny cung cp
cnh bo khi truy cp cc trang vng nh. iu ny rt hu ch cho cc ng dng cn qun l s
m rng ca cu trc d liu ng.
to trang lnh canh, ta thit lp c PAGE_GUARD trong hm VirtualAlloc. C ny
c th dng 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 cng xo c PAGE_GUARD, loi b tnh
trng "lnh canh" ca trang vng nh. H thng s khng ngng truy cp trang vng nh vi li
ngoi l STATUS_GUARD_PAGE.
Nu mt li ngoi l xut hin trong 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.
Chng trnh sau minh ha cch thc hin ca mt trang lnh canh, v hin tng xut
hin li dch v h thng :
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
LPVOID lpvAddr;
DWORD cbSize;
BOOL vLock;
LPVOID commit;
cbSize = 512; // Vng nh cn cp pht.
/* Gi hm cp pht */
lpvAddr=VirtualAlloc(NULL,cbSize,MEM_RESERVE, PAGE_NOACCESS);
if(lpvAddr == NULL)
{
fprintf(stdout,"VirtualAlloc failed on
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 187
RESERVE with %ld\n", GetLastError());
}
/* Cp pht xc nhn vng nh */
commit = VirtualAlloc(NULL,cbSize,MEM_COMMIT,
PAGE_READONLY|PAGE_GUARD);
if(commit == NULL)
{
fprintf(stderr,"VirtualAlloc failed on
COMMIT with %ld\n", GetLastError());
}
else
{
fprintf(stderr,"Committed %lu bytes at address
%lp\n", cbSize,commit);
}
/* Kho vng nh xc nhn */
vLock = VirtualLock(commit,cbSize);
if(!vLock)
{
fprintf(stderr,"Cannot lock at %lp,
error = %lu\n", commit, GetLastError());
}
else fprintf(stderr,"Lock Achieved at %lp\n",commit);
/* Kho vng nh ln na */
vLock = VirtualLock(commit,cbSize);
if(!vLock)
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 188
{
fprintf(stderr,"Cannot get 2nd lock at %lp,
error = %lu\n", commit, GetLastError());
}
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
2nd Lock Achieved at 003F0000
Ch : Ln kho th nht tht bi, to li ngoi l STATUS_GUARD_PAGE. Tuy
nhin, trong ln kho th hai, hm thc hin thnh cng, do h thng loi b tnh trng "lnh
canh" ca trang.
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 tr 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 trong 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 To v m tp tin
Win32 API cung cp hm CreateFile to mt tp tin mi hoc m mt tp tin c
sn.
HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD
dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD
dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 189
Trng lpFileName tr n chui k t zero xc nh tn tp tin cn m hoc to.
Trng dwDesiredAccess xc nh cch thc truy cp i tng. Mt ng dng c th thc hin
truy cp c, ghi, c-ghi, s dng mt hay kt hp cc gi tr sau :
Gi tr ngha
0
Xc nh truy vn thit b n
mt i tng. Mt ng dng c th
truy vn thuc tnh thit b m khng
cn phi truy cp thit b.
GENERIC_READ
Xc lp hnh thc truy cp c.
D liu c th c t tp tin, ng thi
dch chuyn con tr tp tin. truy cp
c-ghi, ta kt hp vi c
GENERIC_WRITE.
GENERIC_WRITE
Xc lp hnh thc truy cp ghi.
D liu c th c ghi vo tp tin,
ng thi dch chuyn con tr. c
th truy cp c-ghi, ta kt hp vi c
GENERIC_READ.
Bng 7.4 Trng dwDesiredAccess xc nh cch truy cp i tng
Trng dwShareMode thit lp cc bit c xc nh cch chia s i tng (tp tin). Nu
dwShareMode bng 0, i tng khng th chia s. Khi , ta khng th thao tc trn i tng
cho n khi ng handle. chia s i tng, ta kt hp mt trong cc c sau :
FILE_SHARE_DELETE
S dng trong Windows NT :
Thao tc trn i tng ch thc hin
nu yu cu truy cp xo.
FILE_SHARE_READ
Thao tc trn i tng ch
thc hin nu yu cu truy cp c.
FILE_SHARE_WRITE
Thao tc trn i tng ch
thc hin nu yu cu truy cp ghi.
Bng 7.5 Trng dwShareMode xc nh cch chia s i tng
Trng lpSecurityAttributes tr n cu trc SECURITY_ATTRIBUTES xc nh
handle i tng c c chuyn cho cc tin trnh con hay khng. y chng ta khng dng,
v thit lp gi tr l NULL.
Trng dwCreationDisposition xc lp thao tc to tp tin mi hay m tp tin c.
Dng mt trong cc gi tr sau :
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 190
CREATE_NEW
To mi mt tp tin. Hm ny tht bi nu
tp tin c.
CREATE_ALWAYS
To mi mt tp tin. Nu tp tin tn ti,
hm s to chng ln, ng thi xo cc thuc tnh
hin hnh ca tp tin.
OPEN_EXISTING
M mt tp tin. Hm tht bi nu tp tin cha
c sn.
OPEN_ALWAYS
M mt tp tin nu c sn. Nu tp tin cha
tn ti, hm s to tp tin nh s dng c
CREATE_NEW.
TRUNCATE_EXISTING
M mt tp tin. Khi m, h thng khi to
kch thc tp tin li v 0 byte. Tin trnh gi cn m
tp tin t nht vi dng truy cp GENERIC_WRITE.
Hm tht bi nu khng tn ti tp tin.
Bng 7.6 Trng dwCreationDisposition xc lp thao tc tp tin
Trng dwFlagsAndAttributes xc nh cc thuc tnh v c cho tp tin. Ta c th kt
hp cc thuc tnh sau :
FILE_ATTRIBUTE_ARCHIVE
Tp tin archive. ng dng dng thuc tnh ny
nh du tp tin c th sao lu hoc loi b.
FILE_ATTRIBUTE_HIDDEN
Tp tin n. Khng hin th trong danh sch cc tp
tin thng thng trong cc th mc.
FILE_ATTRIBUTE_NORMAL
Tp tin khng c thuc tnh no khc. Thuc tnh
ny thng c dng duy nht.
FILE_ATTRIBUTE_OFFLINE
D liu tp tin khng c sn. D liu c ch nh
di chuyn vt l vo vng lu tr offline.
FILE_ATTRIBUTE_READONLY
Tp tin ch c. ng dng khng th ghi hoc xo
d liu trong tp tin.
FILE_ATTRIBUTE_SYSTEM
Tp tin l mt phn ca h iu hnh, hoc c s
dng c bit trong h thng.
FILE_ATTRIBUTE_TEMPORARY
Tp tin c dng cho vng lu tr tm. Sau khi
ng dng kt thc, tp tin s c xa.
Bng 7.7 Trng dwFlagsAndAttributes xc nh cc thuc tnh v c cho tp tin.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 191
Cc c xc nh tp tin kh phc tp, chng ta khng bn k y. Trng cui cng l
hTemplateFile xc nh handle truy cp GENERAL_READ n tp tin tm. Tp tin tm c vai
tr h tr cc thuc tnh tp tin v thuc tnh m rng cho tp tin c to. Trong Windows 95,
gi tr hTemplateFile cn c gn bng NULL.
Nu thnh cng hm tr v handle ca tp tin xc nh. Ngc li, gi tr tr v l
INVALID_HANDLE_VALUE.
Lu , vic thit lp gi tr dwDesiredAccess cho php ng dng c th truy vn cc
thuc tnh thit b m khng thc s truy cp thit b. iu ny rt hu dng, v d trong trng
hp ng dng mun xc nh kch thc cng cc nh dng a mm m khng cn phi c
a trong a.
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 dwFlagsAndAttributes
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
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 192
OPEN_EXISTING, // ch m tp tin c
FILE_ATTRIBUTE_NORMAL, //Tp tin thng
NULL); // khng c thc tnh tm
if (hFile == INVALID_HANDLE_VALUE)
{
ErrorHandler("Could not open file."); // li x l
}
xo tp tin trn, trc ht ta ng tp tin li.
CloseHandle(hFile);
DeleteFile("MYFILE.TXT");
Trong v d sau, hm to mt tp tin mi v m ch ghi.
HANDLE hFile;
hFile = CreateFile("MYFILE.TXT", // tp tin MYFILE.TXT
GENERIC_WRITE, // to ghi
0, // khng chia s
NULL, // khng bo mt
CREATE_ALWAYS, // ghi chng nu c
FILE_ATTRIBUTE_NORMAL | // tp tin bnh thng
FILE_FLAG_OVERLAPPED, // khng ng b I/O
NULL); // khng thuc tnh tm
if (hFile == INVALID_HANDLE_VALUE)
{
ErrorHandler("Could not open file."); // li x l
}

7.3.2 To tp tin tm
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 193
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.
Hm GetTempFileName to tn mt tp tin tm. Tn tp tin y gm ng dn ni
vi mt chui k t s thp lc phn th hin tn tp tin, v phn m rng l .TMP.
UINT GetTempFileName(LPCTSTR lpPathName, LPCTSTR lpPrefixString, UINT
uUnique, LPTSTR lpTempFileName);
Trng lpPathName tr n mt chui k t (kt thc bng k t NULL) xc nh ng
dn ca tp tin, dng cc k t ANSI. Nu trng ny bng NULL, hm tht bi.
Trng lpPrefixString 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 tin. 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 lpTempFileName 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 tr 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 tin 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. Nu tp tin c, h thng t tng ln mt s mi cho n
khi c mt tn duy nht.
Nu thc hin thnh cng, hm tr v con s duy nht xc nh trong trng uUnique.
Ngc li, gi tr tr v l 0.
thu nhn ng dn tp tin tm, ta dng hm GetTempPath.
DWORD GetTempPath(DWORD nBufferLength, LPTSTR lpBuffer);
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 194
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 d : C:\TEMP\.
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.
7.3.3 Sao chp v di chuyn tp tin
chp (copy) mt tp tin, ta cn m ch ch c. Sau dng hm CopyFile
chp vo mt tp tin mi.
BOOL CopyFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, BOOL
bFailIfExists);
Trng lpExistingFileName v lpNewFileName tr n chui (kt thc NULL) xc nh
tn tp tin c v tn tp tin mi. Trng bFialIfExists xc nh cch to tp tin vi tn mi
trn. Nu trng c thit lp l TRUE, v tp tin c tn lpNewFileName tn ti, hm tht
bi. Nu trng c thit lp l FALSE v tp tin tn ti, hm s to tp tin mi chng ln
tp tin c.
Nu thnh cng, hm tr v gi tr khc 0. Ngc li, gi tr tr v l 0.
di chuyn (move) mt tp tin, trc ht cn phi ng tp tin li (nu ang m). Ta
dng hm MoveFile. Hm ny thc hin thao tc i tn mt tp tin hay th mc (bao gm c
cc tp tin con trong th mc).
BOOL MoveFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName);
Hai trng trn ln lt tr n tn tp tin (th mc) hin c v tn tp tin (th mc) mi.
Tn tp tin (th mc) mi cn phi cha c trong ng dn ca n. Tn tp tin mi c th trn
mt h thng hay a khc, trong khi tn th mc mi phi cng a vi th mc c.
Nu thnh cng, gi tr tr v khc 0. Ngc li, gi tr tr v l 0.
V d sau minh ha vic to v s dng tp tin tm copy mt tp tin. u tin ng
dng m tp tin ORIGINAL.TXT bng cch s dng hm CreateFile. Sau ng dng s dng
hm GetTempFileName v CreateFile to tp tin tm. ng dng c tng khi 4K d liu
vo vng m, chuyn ni dung trong vng m sang ch hoa, v vit chng xung tp tin tm.
Sau khi chuyn ton b tp tin trn sang tp tin tm, ta i tp tin tm thnh ALLCAPS.TXT
bng cch dng hm MoveFile.
HANDLE hFile;
HANDLE hTempFile;
DWORD dwBytesRead, dwBytesWritten, dwPos;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 195
char szTempName[MAX_PATH];
char buffer[4096];
/* M tp tin c sn */
hFile = CreateFile("ORIGINAL.TXT", // tn tp tin
GENERIC_READ, // m c
0, // khng chia s
NULL, // khng bo mt
OPEN_EXISTING, // tp tin 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
GENERIC_READ | GENERIC_WRITE, // m dng 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
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 196
if (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
{
if (ReadFile(hFile, buffer, 4096, &dwBytesRead, NULL))
{
CharUpperBuff(buffer, dwBytesRead);
WriteFile(hTempFile, buffer, dwBytesRead, &dwBytesWritten, NULL);
}
} while (dwBytesRead == 4096);
/* ng c hai tp tin */
CloseHandle(hFile);
CloseHandle(hTempFile);
/* Chuyn tp tin tm vo tp tin mi ALLCAPS.TXT */
if (!MoveFile(szTempName, "ALLCAPS.TXT"))
{
ErrorHandler("Could not move temp. file.");
}
Hm CloseHandle ng mt tp tin ang m. Xem phn 7.3.6.
7.3.4 c v ghi d liu vo tp tin
Mi tp tin ang m c mt con tr tp tin xc nh byte k tip s c c hoc ghi.
Khi mt tp tin m ln u tin, h thng thit lp con tr tp tin ti v tr u tp tin. Mi khi
c hoc ghi vo mt byte, con tr tp tin t ng dch chuyn. thay i v tr ny, ta dng
hm SetFilePointer.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 197
DWORD SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG
lpDistanceToMoveHigh, DWORD dwMoveMethod);
Trng hFile l handle ca tp tin cha con tr tp tin cn di chuyn. Handle ny cn
c to di dng truy cp GENERIC_READ hoc GENERIC_WRITE.
Trng lDistanceToMove v lpDistanceToMoveHigh xc nh s byte con tr cn dch
chuyn. Nu lpDistanceToMoveHigh bng NULL, 32-bit thp ca lDistanceToMove xc nh s
byte cn di di con tr. Ngc li, hai trng trn thit lp mt gi tr 64-bit (khng du) th
hin s byte cn di di con tr.
Trng dwMoveMethod xc nh im gc m con tr cn di di. Nu 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.
Nu thnh cng, v lpDistanceToMoveHigh bng NULL, gi tr tr v l DWORD thp
ca con tr tp tin. Nu lpDistanceToMoveHigh khc NULL, hm tr v DWORD thp ca con
tr tp tin, v tr trng ny n DWORD cao ca con tr tp tin.
Nu hm tht bi v lpDistanceToMoveHigh bng NULL, gi tr tr v l 0xFFFFFFFF.
bit thm thng tin li, ta dng hm GetLastError. Nu hm tr v 0xFFFFFFFF v
lpDistanceToMoveHigh, c th hm thnh cng hoc tht bi, cn phi gi hm GetLastError
xc nh. on chng trnh sau trnh by vn ny :
/* Trng hp 1: Gi hm vi lpDistanceToMoveHigh == NULL */
/* C gng di chuyn con tr tp tin ca hFile mt on */
dwPtr = SetFilePointer(hFile, lDistance, NULL, FILE_BEGIN);
if (dwPtr == 0xFFFFFFFF) // Kim tra tht bi
{
dwError = GetLastError() ; // Nhn m li
. . . // X l li
} // Cui phn x l li

/* Trng hp 2: Gi hm vi lpDistanceToMoveHigh != NULL */
/* C gng di chuyn con tr tp tin hFile mt on di */
dwPtrLow = SetFilePointer(hFile, lDistLow, & lDistHigh, FILE_BEGIN);
/* Kim tra tht bi */
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 198
if (dwPtrLow==0xFFFFFFFF&&(dwError=GetLastError())!=NO_ERROR)
{
// X l li
// . . .
} // Cui phn x l li
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 tin. 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 SetEndOfFile(HANDLE hFile);
Trng hFile l handle ca tp tin cn di chuyn con tr n cui tp tin cn c to vi
dng truy cp GENERAL_WRITE. Nu thnh cng, hm tr v gi tr khc 0. Ngc li, gi tr
tr v l 0.
Hm ReadFile c d liu t mt tp tin, t im xc nh bi con tr tp tin. Sau khi
c, con tr tp tin dch chuyn mt on ng vi s byte tht s c c. 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 tr ny bng 0 trc khi thc hin cc
thao tc khc kim tra li.
Trng nNumberOfBytesToWrite xc nh s byte cn ghi. Nu trng ny bng 0, hm
khng ghi d liu, nhng vn c gi thc hin. Trng lpNumberOfBytesWritten 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.
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 199
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 tr hin ti v hm ch tr 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.
7.3.5 Kho v m kho tp tin
Mc d h thng cho php nhiu ng dng c th m v ghi vo cng mt tp tin, cc
ng dng khng nn thc hin song song. ngn chn ng dng khc ghi vo phn d liu ca
mnh, ta c th s dng hm LockFile. m kho tp tin, cho php cc ng dng khc truy cp
vng d liu, ta dng hm UnlockFile.
BOOL LockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD
dwFileOffsetHigh, DWORD nNumberOfBytesToLockLow, DWORD
nNumberOfBytesToLockHigh);
BOOL UnlockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD
dwFileOffsetHigh, DWORD nNumberOfBytesToUnlockLow, DWORD
nNumberOfBytesToUnlockHigh);
Trng hFile l handle ca tp tin c m di dng GENERAL_READ hoc
GENERAL_WRITE, hoc c hai.
Trng dwFileOffsetLow v dwFileOffsetHigh xc nh word thp v cao ca byte
offset u tin cn kho hay m kho.
Trng nNumberofBytesToLockLow (nNumberofBytesTo UnlockLow) v
nNumberOfBytesToLockHigh (nNumberOf BytesToUnlockHigh) xc nh word thp v cao
di khong byte cn kho hay m kha.
Nu thnh cng, hm tr v gi tr khc 0. Ngc li, gi tr tr v l 0.
V d sau y ni mt tp tin vo mt tp tin khc. ng dng s dng hm CreateFile
m tp tin ONE.TXT c, v TWO.TXT vit. Sau ng dng ni phn d liu ca tp
tin ONE.TXT vo cui tp tin TWO.TXT bng cch c (dng hm ReadFile) v ghi (dng hm
WriteFile) tng khi 4K d liu. Trc khi vit vo tp tin th hai, ng dng dch chuyn con
tr n cui tp tin bng cch dng hm SetFilePointer, sau kha vng cn ghi dng hm
LockFile. Sau khi thc hin thao tc ghi xong, ta m kho, dng hm UnlockFile, cc ng
dng khc c th s dng tp tin ny.
HANDLE hFile;
HANDLE hAppend;
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 200
DWORD dwBytesRead, dwBytesWritten, dwPos;
char buff[4096];
/* M mt tp tin c */
hFile = CreateFile("ONE.TXT", // m tp tin ONE.TXT
GENERIC_READ, // m c
0, // khng chia s
NULL, // khng bo mt
OPEN_EXISTING, // 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_WRITE, // 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
if (hAppend == INVALID_HANDLE_VALUE)
{
ErrorHandler("Could not open TWO."); // x l li
}
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 201
/* Ni tp tin th nht vo cui tp tin th hai. Kho tp tin th hai ngn chn cc tin trnh khc truy
cp khi ang ghi. M kho sau khi ghi xong */
do
{
if (ReadFile(hFile, buff, 4096, &dwBytesRead, NULL))
{
dwPos= SetFilePointer(hAppend, 0, NULL, FILE_END);
LockFile(hAppend, dwPos, 0, dwPos+dwBytesRead, 0);
WriteFile(hAppend, buff, dwBytesRead, &dwBytesWritten, NULL);
UnlockFile(hAppend, dwPos, 0, dwPos+dwBytesRead, 0);
}
} while (dwBytesRead == 4096);
/* ng c hai tp tin */
CloseHandle(hFile);
CloseHandle(hAppend);

7.3.6 ng v xo tp 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 mt tp tin, ta dng hm DeleteFile. Lu rng tp tin ny cn phi ng trc
khi b xa.
BOOL DeleteFile(LPCTSTR lpFileName);
Trng lpFileName tr n chui (kt thc bng k t NULL) xc nh tp tin cn xo.
Nu thnh cng, hm tr v kh tr khc 0. Ngc li, gi tr tr v l 0. Hm tht bi nu tp nu
T
e
c
h
2
4
.
v
n
NGN NG LP TRNH LP TRNH C TRN WINDOWS
Trang 202
tp tin cn xo khng tn ti. Trong Windows NT, hm khng th xo cc tp tin ang m. Tuy
nhin, trong Windows 95, tp tin ang m vn c th b xo.
7.3.7 X l th mc
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);
BOOL RemoveDirectory(LPCTSTR lpPathName);
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 trng 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 mt 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 tr 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 th
mc hin hnh, ng dng gi hm GetCurrentDirectory. thay i th mc 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 tr 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 tr v
xc nh kch thc cn thit ca vng m, gm c byte NULL ng du kt thc chui.
BOOL SetCurrentDirectory(LPCTSTR 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.

T
e
c
h
2
4
.
v
n

You might also like