Sei sulla pagina 1di 133

LE NGOC THANH

lntmail@yahoo.com









LAP TRNH WINDOWS VI MFC
Microsoft Visual C++ 6.0




















NHA XUAT BAN THONG KE
MUC LUC

CHNG 1 : MOT SO KHAI NIEM LAP TRNH
TRONG MOI TRNG WINDOWS
1.1 Chng trnh ( Program )
1.2 ng dung ( Application )
1.3 Tien trnh ( Process )
1.4 Tieu trnh (Thread )
1.5 Thong iep ( Message )
1.5.1 Nguon goc cua message
1.5.2 Cac loai message
1.5.3 So hieu message (Message Indentifier MessageID)
1.5.4 ac ta message
1.6 Ca so giao dien (window) cua ng dung
1.7 Message queue
1.8 Kien truc x ly cua ng dung trong Windows
1.9 Resource cua ng dung

CHNG 2 : TH VIEN MFC CUA MICROSOFT
& NG DUNG C BAN TRONG WINDOWS
2.1 Th vien MFC (Microsoft Foundation Class)
2.2 Tiep an MFC
2.3 Tao ng dung windows vi MFC nh the nao ?
2.4 Lp quan ly tieu trnh CwinThread
2.5 Lp quan ly tieu trnh giao dien chnh CwinApp
2.6 Thc hien ng dung n gian
2.7 Thc hien ng dung giao tac n gian
2.8 Tao mi Icon Resource cho ng dung
2.9 Lu tr chng trnh nguon
2.10 Lp Cstring cua MFC

CHNG 3 : CAC LP GIAO DIEN O HOA CUA MFC
3.1 Cac cong cu giao dien o hoa
3.2 Device Context
3.3 Toa o tren giao dien o hoa
3.4 Cac lp MFC ho tr GDI
3.4.1 Cac lp oi tng iem, hnh ch nhat
Trang
1
1
1
1
1
2
2
2
3
3
3
5
7
8


10
10
10
10
11
12
14
20
25
27
27

29
29
29
29
30
30
3.4.2 Lp Cpen
3.4.3 Lp CBrush
3.4.4 Lp CFont
3.4.5 Lp CBitmap
3.4.6 Lp CPalette
3.4.7 Lp CRgn
3.5 Lp CDC
3.6 Lp CImageList

CHNG 4 : CA SO GIAO DIEN LP VA LP CWnd
4.1 Ca so giao dien
4.2 Lp CWnd
4.3 S dung oi tng CWnd
4.3.1 S dung CWnd lam giao dien chnh cua ng dung
4.3.2 ng dung ch chay mot ban (instance) tai moi thi iem

CHNG 5 : X LY MESSAGES
5.1 Lp x ly message CCmdTarget:
5.2 Khai bao muc x ly message trong MessageMap
5.3 Cac lp ke tha CCmdTarget
5.4 MessageMap cua lp ke tha CWnd trong ng dung
5.4.1 Ca so cua ng dung co chc nang hoat ong
5.4.2 WM_PAINT va hanh vi OnPaint cua CWnd

CHNG 6 : NG DUNG CONG CU GDI
6.1 DC va BITMAP
6.2 ng dung vi ca so chnh hien th anh
6.3 Sao chep anh t DC en DC, phong to & thu nho anh
6.4 DC trong bo nh ( DC ao) vung ve em ly tng
6.5 Anh chuyen ong trong vung client
6.6 CImageList cong cu quan ly bo anh cung c
6.7 CRgn Ca so co hnh dang tuy y

CHNG 7 : MENU PHM TAT
7.1 nh ngha
7.2 Menu resoure
31
31
32
32
33
34
35
38

40
40
40
49
49
50

51
51
52
55
55
55
58

60
60
60
63
64
65
66
67

69
69
69
7.3 S dung menu resource
7.4 Muc x ly command message t muc chon cua menu
7.5 Phm tat (hot key ) cho muc chon tren menu
7.6 Lp quan ly menu CMenu
7.7 X ly ieu khien muc chon cua menu

CHNG 8 : CAC LP OI TNG NHAP LIEU
( WINDOWS CONTROLS )
8.1 CStatic
8.2 CEdit
8.3 CButton
8.4 ClistBox
8.5 CComboBox
8.6 CSpinButtonCtrl
8.7 CProgressCtrl
8.8 CscrollBar
8.9 CSliderBar

CHNG 9 : HOP HOI THOAI
9.1 Hop hoi thoai (Dialog)
9.2 Lp CDialog
9.3 Tao va s dung dialog trong chng trnh
9.3.1 Tao dialog resource
9.3.2 Khai bao lp ke tha CDialog s dung dialog resource
9.3.3 S dung dialog trong chng trnh
9.4 Lien ket gia dialog va cac thanh phan khac
9.5 S dung dialog lam giao dien chnh cua ng dung
9.5.1 Thc hien ng dung vi giao dien chnh la dialog
9.5.2 Dung MFC wizard tao ng dung vi giao dien dialog
9.6 Khai bao bien cho control tren dialog
9.7 Khai thac cac tien ch ho tr

CHNG 10 : KHUNG CA SO GIAO DIEN CHNH
10.1 Khung ca so giao dien (Frame Window)
10.2 Thanh trang thai (statusbar) & lp CStatusbar
10.3 Thanh cong cu (toolbar) & lp CToolBar
71
72
73
75
77


78
78
80
84
85
88
91
93
94
96

97
97
97
99
99
103
104
104
106
106
107
109
112

117
117
117
119
10.3.1 Thiet ke ToolBar resource
10.3.2 Dung toolbar resource cho CToolBar cua FrameWnd
10.4 Lp CFrameWnd
10.5 S dung frame window lam giao dien chnh
10.5.1 Thc hien ng dung vi giao dien frame window
10.5.2 String Table va CFrameWnd
10.5.3 Dung MFC wizard tao ng dung giao dien framewindow

CHNG 11 : CAC KIEN TRUC DOCUMENT VIEW
11.1 CDocument
11.2 CView
11.3 CFrameWnd
11.4 CDoctemplate
11.5 Ho tr t pha oi tng quan ly ng dung
11.6 Trnh t tao lap cac oi tng tham gia bo DVF
11.7 Text Document Appication
11.8 Rich Text Format (rtf) Document Appication
11.9 HTML Document View Appication
11.10 Mot so lp view ac biet
11.10.1 CListView
11.10.2 CTreeView
11.10.3 CSplitterWnd
11.10.4 S dung splitterwnd trong frame window
11.10.5 Cac v du thc hanh

CHNG 12 : MOT SO VAN E TRONG WINDOWS
12.1 Tap tin INI
12.2 System Registry
12.3 Vung Status Area tren Taskbar
12.4 ng dung ScreenSaver
12.4.1 ac iem
12.4.2 Tham so dong lenh
12.4.3 ac iem giao tac vi ngi dung
12.4.4 Thc hien ng dung ScreenSaver n gian
12.5 ng dung s dung nhieu tieu trnh
12.5.1 Tieu trnh x ly noi
120
121
121
123
123
124
130

134
134
135
136
136
137
138
139
143
146
149
149
150
152
154
155

158
158
160
162
167
168
168
170
171
175
175
12.5.2 Tieu trnh giao dien
12.5.3 Cac ham ho tr
12.6 Lap trnh Multimedia vi MCI
12.7 An nh mot so tnh nang cua Windows
12.8 Bay (hook) message (Windows Hook)
12.8.1 Cac kieu hook (Hook Type)
12.8.2 Danh sach hook (Hook Chain)
12.8.3 Thu tuc hook (Hook Procedure)
12.8.4 Cac dch vu lien quan hook
12.8.5 ng dung hook messages cua keyboard
12.9 Cai at che o thc hien ng dung t ong

CHNG 13 : MFC VI INTERNET
13.1 Giao thc truyen thong TCP/IP
13.1.1 Gii thieu
13.1.2 Kien truc cua giao thc TCP/IP tren mo hnh DARPA
13.1.3 a ch IP
13.1.4 Subnet
13.1.5 Subnet Mask
13.1.6 Host domain name
13.1.7 IP Routing
13.2 Lap trnh TCP/IP vi Winsock
13.2.1 Port
13.2.2 Socket
13.2.3 Mot so cau truc d lieu cua Winsock API
13.2.4 Mot so dch vu cua Winsock API
13.3 MFC vi lap trnh Winsock
13.3.1 Khi ong Winsock
13.3.2 Lp CAsyncSocket
13.4 Lap trnh Winsock cho giao thc UDP
13.5 Lap trnh Winsock cho giao thc TCP
13.6 TCP vi SMTP (Simple Mail Transfer Protocol)
13.6.1 Qui c gia ng dung gi mail va nhan mail
13.6.2 Thiet ke ng dung gi mail
13.7 TCP vi Pop3 (Post Office Protocol Version 3)
13.7.1 Qui c gia ng dung mail client va mail server
177
179
179
181
182
183
183
183
184
185
186

187
187
187
187
189
190
191
192
194
197
197
198
198
199
200
200
200
204
207
215
215
217
219
219
13.7.2 Thiet ke ng dung nhan mail
13.8 TCP vi HTTP va FTP
13.8.1 Lp CInternetSession
13.8.2 Lp CInternetFile
13.8.3 Lp CFtpConnection
13.8.4 Lp CFtpFindFile
13.8.5 Lp CHttpConnection
13.8.6 Lp CHttpFile
13.8.7 Thc hien ng dung FTP client n gian
13.8.8 Thc hien ng dung HTTP client n gian

Phu luc A: MOT SO VAN E
LAP TRNH HNG OI TNG
A.1 Lap trnh hng oi tng (OOP)
A.2 Cac khai niem
A.2.1 Lp (Class)
A.2.2 oi tng (Object)
A.2.3 Thuoc tnh (Attribute)
A.2.4 Hanh vi (Method)
A.2.5 Chng trnh (Program)
A.3 ac iem lap trnh hng oi tng
A.4 Phan loai thuoc tnh va hanh vi
A.5 Cac hanh vi ac biet
A.6 Khai bao lp, oi tng trong C++
A.6.1 Khai bao lp
A.6.2 Khai bao oi tng
A.6.3 S dung oi tng trong chng trnh
A.7 Ke tha trong C++
A.7.1 Ke tha hanh vi tao lap
A.7.2 Ke tha hanh vi huy bo
A.7.3 Thc hien hanh vi lp c s
A.8 Khai bao hanh vi toan t so hoc
A.9 Con tro this
A.10 Hanh vi virtual
A.11 Thuoc tnh va hanh vi tnh

220
223
223
224
225
227
228
229
231
232


234
234
234
234
234
234
235
235
235
236
236
236
236
238
238
239
239
240
240
241
243
243
244


LI M AU


Ngon ng lap trnh C++ c biet en nh la mot trong nhng ngon ng
lap trnh manh nhat nh kha nang cua no trong viec trien khai phan mem
cac mc o khac nhau. T mc he thong en mc ng dung, t lap trnh
cau truc en lap trnh hng oi tng, t lap trnh da tren thuat giai en
lap trnh tr tue nhan tao, va t lap trnh c s d lieu en lap trnh c s
tri thc, bat c au, khi ma ngi lap trnh muon the hien y tng khoa
hoc va nghe thuat cua mnh tren may tnh th C++ la mot ieu ngh en
trc tien.

Nhng du y tng co bay bong the nao i na th cung khong the bo qua
van e cai at ma moi trng cho ng dung la ieu phai quan tam. Vi xu
hng s dung he ieu hanh Microsoft Windows nh hien nay, chung ta
buoc phai ngh en viec cai at ng dung cua mnh trong moi trng nay
va khai thac no sao cho ng dung hoat ong hieu qua nhat.

Microsoft Visual C++, san pham cua Microsoft, vi kha nang bien dch u
viet va loi khai thac he thong rong m nh tap hp lp th vien MFC cho
C++ co ay u cac tien ch giup chung ta vet c moi ngo ngach cua
Windows hau phuc vu cho ng dung cua mnh.

T nhng nhan nh noi tren, cuon sach nay c thc hien e cung cac
ban bat au lam quen lap trnh trong Windows ap dung ky thuat lap trnh
hng oi tng vi C++, nham khai thac hieu qua th vien MFC va tng
bc du nhap vao the gii tuyet vi nay thong qua cac ng dung c sap
xep theo cac cap o tien trien phu hp.


Trong lan xuat ban au tien, cuon sach nay chac khong tranh khoi thieu
sot. Chung toi rat mong tiep thu y kien ong gop va trao oi cung ban oc.
Cuoi cung, chung toi xin chan thanh cam n ban be, ong nghiep a cung
cap nhng nhan xet va kien thc qu bau e thc hien cuon sach nay. Xin
cam n cac ban hoc vien-sinh vien, nhng ngi a cung lam viec vi
chung toi qua noi dung nay va a co nhng y kien khach quan giup chnh
sa cuon sach kp thi.
Thanh pho Ho Ch Minh, ngay 19.11.2002
Tac gia

TAI LIEU THAM KHAO

[1] Richard Simon, Windows 95 - Win32 Programming API-BIBLE,
Waite Group Press 1996.
[2] Jeff Prosise, Programming Windows 95 with MFC, Microsoft Press.
[3] M. Tracy, Professional Visual C++ ISAPI Programming, Wrox Press.
[4] Dr. GUI, Microsoft Developer Network - MSDN,
Microsoft Corporation Software.
[5] Dino Esposito,Visual C++ Windows Shell Programming, Wrox Press.



PHAN MEM CAN CAI AT:
- Microsoft Visual C++ 6.0 hoac Microsoft Visual C++ .NET.
- MSDN ( Microsoft Developer Network ), ban thang 10/2003.

MA NGUON:
Source Code cua cac v du minh hoa trong cuon sach nay va cua mot so
chng trnh tro chi ma chung toi mong muon chia xe cung ban oc
c lu trong a mem nh kem, va co the download t a ch:

http://thanh.andisw.com/?id=16&id2=85

WEB SITE:
Source Code ac sac cua nhieu tac gia tren the gii co the download:
- http://msdn.microsoft.com
- http://www.codeguru.com
- http://www.codeproject.com
- http://www.softechsoftware.it
- http://www.flipcode.com
- http://nps.vnet.ee

LIEN HE:
- Tac gia: Le Ngoc Thanh
- C quan: Khoa Tin Hoc Quan Ly, Trng HKT TP.HCM
a ch: 279 Nguyen Tri Phng Q10, TP.HCM.
- a ch e-mail: lntmail@yahoo.com
emp@ueh.edu.vn
Mot so khai niem lap trnh trong moi trng Windows 1
CHNG1:

MtskhinimLptrnh
TrongmitrngWindows

1.1CHNGTRNH(PROGRAM):
Chngtrnhmytnhltphpccchthiukhinhotngca
my, c b tr theo mt trnh t logic nhm phi hp thc hin mt
cng vic xc nh. Cc ch th c th hin di dng m ngun
(sourcecode)haymmy(machinecode).Chngtrnhmmycth
thc hin c trn my c b lnh tng thch, vi chng trnh m
ngunthphisdngmtngdngchuyndngchuynsangm
mytrckhithchin.
Vicchuynccchthdngmngunsangchthmmythc
hinctinhnhbngmttronghaicchsau:
Thng dch: Mi ch th m ngun c chuyn sang ch th m my
tngngvcthchinngay,sautiptcvichthktip.
Bindch:Ttcccchthmnguncchuynsangccchth
m my tng ng. Tp hp cc ch th m my ny gi l chng
trnhmmy.Chngtrnhmmyclulitrongtptinchng
trnhvvsautacththchinchngmtcchclptrnmy.

1.2NGDNG(APPLICATION):
Khimtchngtrnhccittrnmytnhsdng,tagi
lngdng,vdnhngdngNotePad,ngdngMicrosoftWord,....
Trongmitrngwindows,mingdngcthcthihnhnhiu
ln thnh nhiu bn khc nhau. Mi bn ang thc hin ca mt ng
dnggilthhin(instance)cangdng.

1.3TINTRNH(PROCESS):
Tin trnh l khi nim ch mt instance ang hot ng ca ng
dng. Khi ta double-click trn biu tng NotePad chy ng dng
ny,tacmttintrnhcangdngNotePad.

1.4TIUTRNH(THREAD):
Tiu trnh l mt nhnh x l c lp trong tin trnh. Khi mt ng
dngcthchintacthmmttintrnh.Dobnchtchngtrnh
lm nn ng dng bao gm chng trnh chnh (main hay WinMain)
v cc chng trnh con m tin trnh ng vi n c th tch thnh cc
nhnhxl:mtnhnhxlchnh(primarythread),ccnhnhxlph
(otherthreads).Ccnhnhxlnygilcctiutrnh.Chailoitiu
trnh:
2 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Tiutrnhgiaodin(user-interfacethread):Cnhimvxlccyu
cucangidngtrongqutrnhgiaotcvih.
Tiu trnh x l ni (worker thread): C nhim v thc hin cc x l
tnhtonbntrong,khngtrctipnhnyucucangidng.
Thcra,cthxemtiutrnhgiaodinnhlmttiutrnhxlni
nhngctnhnnggiaotcvingisdng.

1.5THNGIP(MESSAGE):
Thngip(message)lgitrphnnhmtnidunggiaotiphay
yucuxlgiahthng(windows)vngdng,giaccngdng
vinhauhocgiaccthnhphntrongcngmtngdng.
1.5.1Ngungcmessage:
Cwindowsvngdngucthphtsinhmessage.
Windows pht sinh message khi cn thng tin cho ng dng cc
hotngnhp-xut(hotnggphm,dichuynhayclickchut,
.cangidng),ccthayicahthng(fontch,chphn
giimnhnh,musc,...)hocnhngbinikhclinquann
ngdng.
ng dng pht sinh message khi x l iu khin cc thnh phn
bntrongngdngphihpthchinchcnnggiaotipvingi
dng,hockhingdngthchingiaotipviwindowshayvicc
ngdngkhcangthchintrongcnghthng.

1.5.2Ccloimessage:
Messagecnhnghabihthng:Lccmessagedohiu
hnhwindowstoranhmphcvhotngiukhintonbh
thng,xlthngtinvo-rahocccthngtinkhcchongdng.
Khi c nhu cu, ng dng c th s dng nhng message ny
phtngmtchcnngiukhinnocawindows.
Messagecnhnghabingidng:Lccmessagedongi
vit ng dng nh ngha nhm to knh lin lc c th gia cc
thnh phn trong ng dng, gia ng dng vi windows hoc vi
ccngdngkhcangthchintrongcnghthng.
Mot so khai niem lap trnh trong moi trng Windows 3
1.5.3Shiumessage(MessageIndentifier-MessageID):
C rt nhiu message khc nhau c s dng trong mi trng
windows. ng vi mi message xc nh, windows s dng mt gi tr
nguynkhngmct,gitrnygilshiumessage.
Cc message do windows nh ngha c s hiu c khai bo sn
v duy nht vi cc hng s xc nh v tn gi gi nh ca chng c
dngWM_xxx.Ccmessgesdongidngnhnghacngphing
kshiu.Shiungkkhngctrnglpvcgitrnhnht
bngWM_USER(mthngsdowindowsnhngha).
Shiumessagelcsphnbitccmessagelnnhau.

1.5.4ctmessage:
i tng nhn message c thm thng tin v hon cnh pht
sinh v nghacthcamessage,windowschophpmessagec
nhn thng qua mt cu trc cha s hiu message v cc thng s
kmtheo.CutrcnyckhaibothnhkiuMSGvinidungnh
sau:

typedefstructtagMSG{
HWND hwnd; //Gitrckchthc4bytes(long)
UINT message; //Shiucamessage
WPARAM wParam; //Gitrkhngmckchthc2bytes
LPARAM lParam; //Gitrkhngmckchthc4bytes
DWORD time; //Thiimsinhramesssge
POINT pt; //Tacursorkhimessagecgi.
}MSG;

Trnghwnd(windowhandle)cacutrcchath(handle)qunl
casgiaodinlinquannmessage.wParamvlParamlhaitham
s gi km theo message lm nhim v cha thng tin b sung. Hai
thamsnycdngkhimessagecnhiunghathctkhcnhau.
Windows s dng gi tr c kch thc 4 bytes qun l cc i
tng ca n. Gi tr ny gi l th qun l i tng (object handle).
ng vi mi loi i tng c th, windows s dng mt kiu handle
ring. HWND l kiu handle dng qun l i tng ca s giao din
trongwindows.

1.6CASGIAODIN(WINDOW)CANGDNG:
Ca s giao din l thnh phn quan trng trong vic to ra mi
trng giao din ha ca cc ng dng trong windows. Cng vi s
pht trin ca h iu hnh windows, hnh nh ca s giao din cng
thayitheovichiuhngsinhnghnvhnhthcvphongph
hn v chc nng. iu khng ch gp phn tng tnh thm m m
4 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
cn to s gn gi hn gia giao din ca ng dng trong windows vi
ngidng.
Dngthngthngcamtcasgiaodintrongwindows:

System Menu Box: Cha biu tng ca ng dng, l nt m hp


menuhthngviccmcdichuyn,thayikchthchocng
cas.
Captionbar:Thanhtiucangdng.
Menubar:Hthngmenuviccmclachnxl.
Minimize/MaximizeBox:Ntiukhinthunh/phngtocas.
RestoreBox:Ntkhiphckchthctrccacas.
Border:ngvinbaoquanhcas.
Clientarea:Vnglmviccacas,dnghinththngtin.
Scrollbar:Thanhcunnidungvnglmviccacas.
Window Procedure: Ngoi giao din ha, ca s ca windows c
kh nng tip nhn v xlmessage.Khnngnycthchin
thng qua hm x l message m ta gn cho ca s. Hm x l
nyckhaibonhsau:
LRESULTCALLBACKWindowProc(
HWNDhwnd, // Tham s cha Handle ca ca s lin
quan
UINTuMsg, //Thamschashiumessage
WPARAMwParam, //ThamsbsungthnhtkiuWORD
LPARAMlParam //ThamsbsungthhaikiuLONG
);Hmtrvmtgitrckchthcl32bits.
Khi mt yu cu x l c chuyn n ca s di dng message,
hm WindowProc gn vi ca s s cn c trn s hiu message
(uMsg)chnxlphhp.Theonguyntc,numessagec
xlhonttthhmtrvgitr0,ngcli(messagekhngthuc
Mot so khai niem lap trnh trong moi trng Windows 5
khnngxlcacas) hm phichuynmessagechowindows
x l thng qua li gi hm x l message mc nhin ca windows.
HmxlnyctngilDefWindowProcvikhaibonhsau:

LRESULTDefWindowProc( //DefaultWindowProcedure
HWND hWnd, //Viccthamscnghanhtrn
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
Khi , kt qu tr v ca DefWindowProc c dng lm kt qu
ca hm WindowProc. Qui tc ni trn cn phi c m bo, nu
khng, ng dng c th lm ri lon hot ng ca h iu hnh
windows.

1.7MESSAGEQUEUE:
Messagequeueldanhschthtccmessagedowindowstora
v c dng cha cc message ang ch c x l. Message
queuehotngtheonguyntcFIFO(First-In,First-Out:votrc,ra
trc).Chailoimessagequeuetrongwindows:
Message queue ca h thng (system queue): c windows dng
ringchoviclutrccmessgectthngtinnhp-xutlinquan
n thit b phn cng trong qu trnh h thng giao tc vi ngi
dng.
Messagequeuecangdng(applicationqueue):cwindowsto
ravcpchoccthhincangdng.Windowstngiuphi
ccmessagetsystemqueuesangapplicationqueuemtcchph
hp,nhmingdngcthtipnhnvthchinccyucu
x l ca ngidngthngquahthng.Cchnyngnccng
dng trong windows quyn truy cp trc tip cc thit b phn cng
camytnh.

Victruycpmessagequeuecangdngcthchinvish
trcacchmlinquandowindowscungcpnhsau:
Chvlymtmessagetmessagequeuecangdng:
BOOLGetMessage(
LPMSG lpMsg, //ContrnbinMSGnhnthngtin
HWND hWnd, //Handlecacaslinquan
UINT wMsgFilterMin, //Shiumessagenhnhtnhnc
UINT wMsgFilterMax //Shiumessagelnnhtnhnc
);
Hm t ng ch n khi pht hin c message cn x l trong
messagequeue.Khi,messagevotrcnhtsclyrakhi
hng ch v thng tin ca n c in vo bin kiu MSG ch bi
6 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
contrthamsplMSG.Khilycmtmessage,hmktthc
vtrvmtgitrnguyn.Numessagenhnclmessagekt
thcngdng(shiuWM_QUIT)thhmtrvgitr0.Ngcli,
hmtrvgitrkhc0.

Kimtravlymtmessagetrongmessagequeuecangdng:
BOOLPeekMessage(
LPMSGlpMsg; //.NhGetMessage
HWND hWnd;
UINT wMsgFilterMin;
UINT wMsgFilterMax;
UINT wRemoveMsg; //Cthchinxamessagekhng?
//PM_NOREMOVE:khngxa
);
Hmtrvgitr0numessagequeuerng.Ngcli,hmtrv
mt gi tr khc khng v thng tin v message c in vo bin
kiuMSGcchbithamskiucontrlpMSG.

DindchmessagecabnphmsangmphmASCII:
BOOLTranslateMessage(
CONSTMSG*lpMsg; //contrnbinchamessage
);
ThamslpMsglcontrchnbinkiu MSGchanidungc
tmessageclytmessagequeuevcndindch.

Hmtrvgitrkhc0numessagenhnctngngvimt
thao tc trn bn phm (nhn phm: WM_KEYDOWN,
WM_SYSKEYDOWN; thi nhn phm: WM_KEYUP,
WM_SYSKEYUP) hoc mt message c ngha tng ng m
vicdindchsangmphmASCIIlthnhcng.Khihmtng
tomessageWM_CHARchophmdindchc.Trongcctrng
hpkhc,hmtrvgitr0.
Mot so khai niem lap trnh trong moi trng Windows 7
iuphimessagencasgiaodinchnh:
Ca s giao din chnh ca ng dng c th tip nhn v x l
message thng qua hm WindowProc ca n (1.6). Nh vy, ta c
thiuphimessagelytmessagequeuecangdngncho
caschnhxl.Viciuphicthchinthngquahmsau:
LRESULTDispatchMessage(
CONSTMSG*lpmsg; //Contrnbinchamessage
);
Tham s lpMSG ch n bin kiu MSG cha thng tin c t
message c iu phi. Hm iu phi s ch n khi hm x l
message WindowProc ca ca s chnh x l xong messge, v ly
gitrktthccahmnylmgitrtrvcachnhn.

Qu trnh tip nhn v iu phi x l message t message queue


cangdngctinhnhlintcchonkhinhncmessage
kt thc ng dng (WM_QUIT). Qu trnh ny c tn gi l vng lp
nhnviuphimessage(MessageLoop).onchngtrnhnhn
viuphimessagetrongngdngccitnhsau:
MSGmsg; //binchanidungctmessagenhnc
while(GetMessage(&msg,NULL,0,0)!=0){
//NumessagenhnckhngphilWM_QUIT
TranslateMessage(&msg); //Dindchnulphm
DispatchMessage(&msg); //iuphichocaschnh.
}

1.8KINTRCXLCANGDNGTRONGWINDOWS:
Khingdngcthchin,windowstothmmttintrnhchoth
hin mi ca ng dng, ng thi xy dng mt message queue dng
ring cho th hin ny. Tiu trnh chnh ca tin trnh c to ra c
nhim v thc hin MessageLoop trn message queue dnh cho ng
dng,ngthikhitoccgiaodinvtiutrnhhtr(nucn).
Cc cch x l ca tiu trnh chnh khi nm quyn iu khin ng
dng:
Khngthchinxlnoc:ngdngktthc.
Thc hin MessageLoop nhng khng to ca s giao din chnh:
ngdngchnhnmessagenhngngidngkhnggiaotcc.
KhitomtcasvihmxlmessageWindowProcvchnca
s ny lm casgiaodinchnh:HmWindowProccacass
tipnhnvxlmessageciuphitMessageLoopcatiu
trnhchnh.Ngidngcthgiaotcvktthcngdngc.
Nhmcthba,ngthitoracctiutrnhphcv:ngdngc
khnngtipnhnvthchinngthinhiuyucuxl.

8 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Kintrcxlchungcangdngtrongmitrngwindows

1.9RESOURCECANGDNG:
ivimtchngtrnhtrongwindows,ngoiphnmlnhcacc
hmxl,resourcelmtthnhphnkhngkmphnquantrngcha
ccnidunghtrchovictrangtrhocphcvchomtmcchc
bitcangdng.Ccnidungphbintrongresourcenhsau:
Cursor: nh nh c t v tr lm vic ca thit b lin quan nh
mouse,pen,trackball.Khingidngtcnglnnhngthitbny
thwindowssdngcursorphnnhhintng.
Bitmap:Tpnhim(pixels)camtnh.Ccnhimnybtr
theoccdngvphihplmnnhnhnhcaitng.
Dialog: Thng tin m t khung giao din vi cc i tng nhp liu
bntrong,lcstoracchphithoitrongngdng.
Icon : nh nh c dng c t chc nng ca mt i tng,
ngdnghaymtnidungdliu.
HTML(HypertextMarkupLanguage):Ngnngdngtoranhngti
liu dng vn bnvinhngkphpvkthutnhdng m trnh
duyttngngcththhinmtcchxctch.
Mot so khai niem lap trnh trong moi trng Windows 9
Menu:Mtdanhschcclachnxlmngidngcthchn
nhmthchinmtxlxcnh
String Table: Bng cha cc chui c nh du phn bit bi cc
shiuvcsdngnhccthngbotrongchngtrnh.Vic
sdngStringTablegipngdngddngthayingnnggiao
dincanmkhngcnphicschnhsatrnphnmlnh.
ToolbarBitmap: Tp cc nh con xc nh cc nt c ci t trn
thanhcngccacashayhphithoitrongngdng.Mint
nylmtmcchn(cththaythmcchncamenu)giptora
ccmessagelnh(WM_COMMAND)vishiuphnbitcth
nnhxlcnthit.
Version:Phnkhaiboccthngtinlinquannngdng,tcgi.
Font:Chathngtinvbfontchclutrongtptinfnt.
Custom Resource: Bao gm cc ni dung khng thuc cc loi ni
dung resource chun ni trn. Ngi dng c th ty ci vo
resource ca ngdng,ngthiphitcit xlthchhpcho
ccresourcenytrongchngtrnh.

10 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
CHNG2:

ThvinMFCcamicrosoft
&ngdngcbntrongwindows

2.1THVINMFC(MICROSOFTFOUNDATIONCLASS):
Th vin MFC ca Microsoft bao gm cc lp c bn, ci t bng
ngnngC++,htrviclptrnhtrongmitrngwindows.Tcclp
ny,MFCxclpnntnghnhthnhngdngcawindows,baogm
vicnhnghabkhungngdng,cccngcchunvphbin
b sung vo b khung ni trn nhm to ra ng dng hon chnh. Vi
MFC, cng vic ca ngi lp trnh ch cn l vic la chn cc thnh
phn cn thit, iu chnh v phi hp chng hp l c c ng
dngktqumongmun.

Lp trnh windows vi MFC v MicroSoft Visual C++ 6.0 (VC) t


chiuqucaobikhngchkhaithccphinbnminhtca
MFCmcnnhncnhiutinnghilptrnhmVCcungcp.yl
conngngnvngin,cbitvingithc,vitngdng
windows.

2.2TIPCNMFC:
MFClthvinkhnglvikhong200lpitngmvichiu
r v vn dng chng trong mt khong thi gian ngn l khng th
c.Mctiucachngtalhiuvvndngnhngthnhphnph
bin nht ca th vin xy dng ng dng thng thng. Khi c
khnngnhtnhvsdngMFCthvitiliuMSDN,schngkh
khngtrongvicmrngkhaithcthvinngdngtrnnmnh
mvtinhthn.

Trong nhng phn trnh by sau, chng ta s ln lt tip nhn h


thngnidunghinngtnhlthuytmbocutrckinthc,v
phn thc hnh phi hp s gip chng ta kim nghim v hiu r vn
.

2.3TONGDNGWINDOWSVIMFCNHTHNO?:
Theomhnhkintrcngdngwindowsmc(1.8),vicgiiquyt
vntrnchnhlvicthchintrlicccuhisauy:
Lmthnotoitngtiutrnhchnhcangdng?
Lmthnotoitnggiaodincangdng?
Qunltngtcgiaitngngdngvitnggiaodin?
BngvicxemxtcclpMFClinquansgiplnltlgiicc
cuhictra.Tiptheo,chngtatmhiuxemnhnglpno
caMFCgipkhaiboitngtiutrnhtrongngdng.
Th vien MFC cua Microsoft & ng dung c ban trong windows 11

2.4LPQUNLTIUTRNHCWinThread:
CWinThreadlmtlpcaMFC,lpitngqunltiutrnhc
toratrongtintrnhcamtngdngangcthchin.Tiutrnh
cqunlcthlltiutrnhgiaodinhoctiutrnhxlni.Cc
dchvcbnphcvchoqunltiutrnhdoCWinThreadcungcp
thngquaccthuctnhvhnhvican.
DWORDm_nThreadID:Thuctnhlushiucatiutrnh.
CWnd* m_pMainWnd : Lu con tr i tng ca s giao din
chnh ca tiu trnh. Khi ca s giao din chnh chm dt hot
ng,tiutrnhlinquansktthc.Nutiutrnhthucloitiu
trnhxlnithgitrnykthattiutrnhgiaodincpcao
hn.
CWinThread();Hnhvitolp(constructor)itngtiutrnh.
virtual BOOL InitInstance( ); Khi to thng s cho i tng tiu
trnh v m nhn cc x l b sung khc ca ng dng. i vi
tiu trnh giao din, hnh vi ny c dng khi to i tng
ca s giao din v gn a ch ca i tng ca s cho
m_pMainWnd.
virtualintExitInstance();Hnhviktthccaitngtiutrnh.
Thngquahnhviny,itngqunltiutrnhthchinhon
trcctinguyncahthngmnngksdng.
virtual int Run( ); Hnh vi dnh ring cho tiu trnh giao din, n
thc hin vng lp nhn message, chuyn message cho hnh vi
PreTranslateMessage ca lp. Nu hnh vi ny tr v gi tr 0 th
message s tip tc c chuyn n cc hm din dch phm
TranslateMessagevhmiuphimessageDispatchMessage.
virtual BOOL PreTranslateMessage(MSG *pMsg); Hnh vi cho
php can thip trc trn cc message nhn c t message
queuecangdng.Thngqua,tiutrnhgiaodincththc
hincctinxlmessagectrngnhmpngyucut
rachongdng.

KhiCWinThreadcdngqunlitngtiutrnhchnhth
hm WinMain (ci sn bn trong lp bi th vin MFC) t ng thc
hincchnhviInitInstance(),Run()vExitInstance()theotht.
12 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
2.5LPQUNLTIUTRNHGIAODINCHNHCWinApp:
CWinApp,kthatCWinThread,llpitngchuyndngqun
l tiu trnh giao din chnh ca ng dng. ng dng windows ch c
phpsdngmtitngthuclpny.Ngoiccthuctnh,hnhvi
kthapublictCWinThread,CWinAppcccthuctnhvhnhvib
sungsau:
constchar*m_pszAppName:Luchuitncangdng.
LPTSTR m_lpCmdLine: Lu ni dung chui tham s dng lnh.
Tham s dng lnh l ton b phn ni dung m ngi dng g
vo ngay sau chui ng dn v tn chng trnh ng dng khi
h thc hin ng dng. i vi ng dng c nhiu ch hot
ngkhcnhauthvicsdngthamsdnglnhlmtcch
xclpccgiaocgiangdngvngidngchnch
sdngngdngthchhp.
intm_nCmdShow:Lugitrthngscdngkchhot
casgiaodinchnhcangdng.
CWinApp();Tolpitngtiutrnhchnh.
HCURSORLoadCursor(intnID);Npcursortresourcecang
dng vo b nh (nu cursor cha c np). nID l s hiu ca
cursor.Hmtrvgitrhandlequnlcursor.Gitrnyckiu
HCURSOR(handleofcursor)mwindowsdngqunlcursor.
HICON LoadIcon ( int nID ); Np icon t resource ca ng dng
vobnh.nIDlshiucaicon.Hmtrvgitrhandlequn
licon.GitrnyckiuHICON(handleoficon).
Hnhvihinthhpthngbovchnhnkinngidng:
virtualintDoMessageBox(
LPCTSTRlpszPrompt, //Nidungthngbo
UINTnType, //Dnghpthngbo
UINThlpIndex=0 //Shiumcgip(WinHelp)
);
Hnh vi ny c kch hot vi tham s tng ng mi khi trong
chng trnh s dng hm AfxMessageBox hin th hp thng
bo.
intAfxMessageBox(
LPCTSTRlpszPrompt,UINTnType,UINThlpIndex=0
);

nType:nnhdnghpthngbo.Gitrnylskthpgia
thng s qui nh biu tng hin th v cc nt chn b tr trong
hp.
Ccthngsquinhccntchnbtrtronghpthngbo:
Gitrthngs Ntchnbtrtronghp
Th vien MFC cua Microsoft & ng dung c ban trong windows 13
MB_OK OK
MB_OKCANCEL OK-Cancel
MB_YESNO Yes-No
MB_YESNOCANCEL Yes-No-Cancel
MB_ABORTRETRYIGNORE Abort-Retry-Ignore
MB_RETRYCANCEL Retry-Cancel

Ccthngsquinhbiutngdngtrongntchn:

Gitrthngs Biutng
MB_ICONHAND,MB_ICONSTOP,
MB_ICONERROR
MB_ICONQUESTION

MB_ICONEXCLAMATION,MB_ICONWARNING

MB_ICONASTERISK,MB_ICONINFORMATION

Shiuccntchncsdngtronghpthngbo:

Shiu Ntchn Shiu Ntchn


IDABORT Abort IDOK OK
IDCANCEL Cancel IDRETRY Retry
IDIGNORE Ignore IDYES Yes
IDNO No

Hnh vi DoMessageBox ch ngi s dng tr li bng cch


chn mt nt chn xc nh trong hp thng bo. Hnh vi kt
thcvigitrtrvlshiucantcchn.Kthahnh
vinychnvthchinxlctrng(sdngdnghp
thng bo ring) cho tt c cc li gi AfxMessageBox trong
ngdng.
Hm AfxMessageBox s dng DoMessageBox hin th hp
thngbovlygitrcahnhvinylmktqutrvca
n.

Vd: AfxMessageBox("ChaoBan",MB_ICONSTOP|MB_OK,0);
Hm trn thc hin hin th hp thng bo vi ni dung l
"ChaoBan",biutng ikm,vntchnOKktthc.
14 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
2.6THCHINNGDNGNGIN:
Trongphnny,chngtathchinngdngviitngthuclp
CWinApp qun l tiu trnh chnh. t tn cho d n ca ng dng l
VD0.

CcbcthchindnVD0nhsau:

KhingwindowsvihiuhnhWin95hocbnmihn.
Tomimtthmcchaccdn.VdC:\VC6.
ThchinngdngMicrosoftVisualC++6.0(VC).
ChnmcFile/NewththngmenucaVC.
TronghphithoiNew,chntrangProjects:

- Win32Application :Loingdngthchin.
- Location :ngdnthmccadn.
- ProjectName :Tndn.
SauchnOK.

Tiptheo,tronghphithoiStep1of1.
- Anemptyproject :Todnrng.
- Finish :Honttvickhitodn.
Th vien MFC cua Microsoft & ng dung c ban trong windows 15
VC hin th hp hi thoi New Project Information thng bo
ccthngtinlinquanndnvato.ChnOK.
Mtdnctoratrna.Vithngtinnhpnhtrn,
d n mi to ra c tn l VD0, ton b phn chng trnh
ngun ca d n c lu trong th mc VD0 thuc th mc
C:\VC6.

Tiptcthchinccbcsauhonttdntheoyucu.

ng k s dng lp CWinApp ca th vin MFC: Lp CWinApp


c khai bo trong afxwin.h ca MFC. B sung tp tin stdafx.h
vo d n v dng tp tin ny ng k cc th vin cn thit ca
MFC.
Vicbsungtptinstdafx.hvodnctinhnhnhsau:
ChnmcFile/NewththngmenucaVC.
TronghphithoiNew,chntrangFiles:

- C/C++HeaderFile :Loinidungtptin(.h).
- AddToProject :BsungtptinvodnVD0.
- FileName :Tntptin(StdAfx.h)
ChnOK,tiptcthchincccngvicsau.

Son tho tp tin stdafx.h, nhp cc nh hng bin dch v


ccchthsdngthvinMFCcnchodn:
16 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

#if!defined(_DU_AN_0_)
#define_DU_AN_0_

// _DU_AN_0_ gip trnh dch khng thc hin lp ch th


#include

#include<afxwin.h> //thvinchuncaMFC
#endif
Sau khi nhp xong ni dung tp tin stdafx.h, chn mc File /
Save(hocclickbiutung trnthanhcngc)lutptin.
Totptin ResourceScriptcadn:Tptinnychakhaibo
caccresourcecsdngtrongngdng.Khibindch,cc
resource ny s c nhng vo tp tin chng trnh (.EXE). Cc
bctotptinResourceScripttrongdnnhsau:
Chn mc File / New. Trong hp hi thoi New, chn trang
Files.

- ResourceScript :Loinidungtptin(.rc).
- AddToProject :Bsungtptinvodn.
- FileName :Tntptin,trngvitncadn.
SauchnOK.
ng k cc h tr ca MFC cho thao tc trn resource: Vic
ng k ny l c s to quan h gia cc ni dung ca
Th vien MFC cua Microsoft & ng dung c ban trong windows 17
resourcevitnglptrnhtngngcaMFCtrongdn.
Thchinnhsau:
- Right-clicktrnmctnresource(VD0Resource):

- ChnmcProperties:

Chnccmcnhtrn,gphmEnterktthc.
Sonthoresource:DnVD0chacnsdngresource,tp
tin resource script s tm thi b trng. Chn mc File / Save,
vngmnhnhsonthoresourcektthcbcny.
Chn phin bn bin dch: C hai phin bn bin dch chng
trnh.
Debugversion : Bin dch chng trnh vi thng tin
debug.
Releaseversion : Phin bn em giao, khng cha thng
tindebug.
ChnmcBuild/SetActiveConfigurations:

Chnphinbnbindch(chnghnWin32Debug).ChnOK.
18 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
nnhbindchvithvinMFC:ChnmcProject/Setting.

TronghphithoiProjectSettings,
- SettingFor: :Chnphinbnnnh(vd:Win32Debug),
- General :Ccnnhchungchodn.
Microsoft Foundation Classes: Cch lin kt th vin MFC vo
ngdng.Cthtychnmttronghaicchsau:
Use MFC in Shared DLL: Chng trnh s dng th vin
MFCtheocchlinktng.Tptinchngtrnhckch
thc nh nhng khi thc hin cn c cc tp tin th vin
(DLL)caMFCtrongthmchthngcawindows.
Use MFC in Static Library: Th vin MFC c nhng vo
chngtrnhtronglcbindch.Tptinchngtrnhckch
thclnhnnhngngdngcthhotngclp.
Saukhinnhxong,chnOK.
Khai bo i tng thuc lp CWinApp: Dng bt k tp tin CPP
nocadnthchincngvicny.VdnVD0angthc
hinychactptinCPP,chngtatomitptinCPPcho
dn.GistptinCPPnyctnlMAIN.CPP.Cchthchin
nhsau:
Chn mc File / New. Trong hp hi thoi New, chn trang
Files:
Th vien MFC cua Microsoft & ng dung c ban trong windows 19

- C++SourceFile :Loinidungtptin(.cpp).
- AddToProject :Bsungtptinvodn.
- FileName :Tntptin(MAIN).SauchnOK.
Trongmnhnhsonthocamain.cpp,nhpnidungtptin:
#include"stdafx.h" //TptinchangkthvincaMFC
CWinApptheApp; //itngqunltiutrnhchnh
Saukhinhpxong,chnmcFile/Savelutptin.
Bindchchngtrnh:ChnmcBuild/Build<projectname>.exe
hocchnmc trnthanhcngc.
Ta thc hin xong mt ng dng n gin trong mi trng
windows. Tp tin chng trnh c lu trong th mc DEBUG
(phinbnbindchdebug)hocRELEASE(phinbnbindch
release).
Chy chng trnh: C th chy chng trnh trc tip trong VC
bngcchnhnphmF5hocclickchn trnthanhcngc.

Nhnxt:ngdngVD0khngthchinmtgiaotchaycngvic
gcbinchlmtngdngkhung-cxydnghontont
lpCWinAppcaMFCmkhngcmtxlbsungno.
2.7THCHINNGDNGGIAOTCNGIN:
20 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Trongphnnytathitkmtngdngmkhithchinshinth
hpthngbo"DoYouwanttoStop"vibiutng vccntchn
YES-NO.ngdngktthckhingidngchnmcYES.
Nhnxt:ngdngchhonthnhcngvicxcnhkhiitng
qunltiutrnhchnhcangdngtinhnhxlthchhp.itng
nythuclpkthatlpCWinAppvixlbsungnhmthchin
cng vic mong mun. Hnh vi InitInstance ca CWinApp l hnh vi
thchhpchovickthavthchinccbsungny.
GisdncangdngctnlVD01.Ccbcthchinnh
sau:
To d n VD01 theo cc bc nh d n VD0 nhng dng li
bc "Khai bo i tng thuc lp CWinApp" (khng thc hin
bcny).Tiptcthchinccbcsauy.
To mi lp CEmpApp k tha t CWinApp: M mn hnh
Workspace ca d n (nu cha m) bng cch chn mc menu
View/Workspacehocclickchnbiutng trnthanhcngc.
ChntrangClassView:

Right-clicktrnmcVD01Classes,chnNewClass.
KhaibolpCEmpAppthngquahphithoiNewClass.
Th vien MFC cua Microsoft & ng dung c ban trong windows 21

Class Type = Generic Class: Chn loi lp thng thng v


MFCkhnghtrlpCWinApptrongClassWizardcan.
Name=CEmpApp:Tncalpmi.
Change: n nh tn tp tin cha khai bo (.h) v ci t
(.cpp) ca lp CEmpApp ( nn trng vi tn ca d n :
VD01):

SauchnOK.
DerivedFrom=CWinApp:ChnCWinApplmlpcs.
As=public:Kthapublic.ChnOKktthc.
Lp CEmpApp c b sung vo d n VD01 cng vi hai
tptinlVD01.HvVD01.CPP:
VD01.H :Chanidungkhaibo(header)calp.
VD01.CPP:Chanidungcit(implement)calp.
Cthmvchnhsanidungcctptincalpbngcch
thao tc trc tip trn cu trc ClassView ca mn hnh
Workspace.
22 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

iuchnhlpCEmpAppnhnchtrcaClassWizard:
M tp tin VD01.H cha khai bo ca lp, b sung cc ni
dung:

classCEmpApp:publicCWinApp{
public: CEmpApp();
virtual~CEmpApp();

//{{AFX_VIRTUAL(CEmpApp)
//}}AFX_VIRTUAL //Htrkthahnhvio

//{{AFX_MSG(CEmpApp)
//}}AFX_MSG // H tr n nh x l
message
DECLARE_MESSAGE_MAP() //ngkMessageMap
}

Lu://{{v//}}lkphpsdngcaClassWizard.

M tp tin VD01.CPP cha ci t ca lp, b sung ni


dung:

#include"stdafx.h"
#include"Emp.h"

BEGIN_MESSAGE_MAP(CEmpApp,CWinApp)
//{{AFX_MSG_MAP(CEmpApp) //Bngmessagemap,
//}}AFX_MSG_MAP //scpncc
END_MESSAGE_MAP() //phnsau

Phn b sung
B sung
Th vien MFC cua Microsoft & ng dung c ban trong windows 23
KhitothngtinClassWizard:Thaotcnylcskhaithc
tinchcaClassWizardtrongvicnhnghalp,khaibothng
tinktha,nnhxlmessage,nhnghabin,.
ChnmenuView/Classwizard:

ChnYes:

ChnAddAll,sauchnOK.
TronghphithoiMFCClassWizard,ChnOKktthc.
ThngtinClassWizardclutrongtptinccngtnvitn
cadnvphnmrngl.CLW.
KthahnhviInitInstancecalp CWinApp cho lpCEmpApp.
Dnghnhvinycitxlbsungnhyucucangdng:
24 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Trong mn hnh Workspace ca d n, chn ClassView, right-
clicktrntiucalpCEmpApp:

ChnmcAddVirtualFunction.

ChnhnhviInitInstance,sauchnmcAddandEdit.
Trong phn son tho ni dung ca hnh vi InitInstance thuc
lpCEmpApp,tacitonchngtrnhxlsau:

BOOLCEmpApp::InitInstance()
{
Th vien MFC cua Microsoft & ng dung c ban trong windows 25
UINTstop; //Binkimtrangdng?

do{
stop=AfxMessageBox("DoYouwanttostop",
MB_YESNO|MB_ICONQUESTION,0);
}while(stop==IDNO); //TiptclpnuchnNO
returnTRUE; //Xltinhnhbnhthng
}

DnglpCEmpAppkhaiboitngqunltiutrnhchnhca
ng dng: M tp tin VD01.CPP ca lp CEmpApp, b sung ni
dung:

#include"stdafx.h"
#include"Emp.h"
CEmpApptheApp; //itngkiuCEmpApp,dngqunl
//tiutrnhchnhcangdng.
//Khngchnhsaccnidungkhc!

Bindchvchychngtrnh.

2.8TOMIICONRESOURCECHONGDNG:
i vi ngdng trongwindows, icon khng ch l hnh nh trang tr
n thun m cn l yu t gi nh v ng dng tt nht. Windows s
dngiconcangdngidinchongdngttcnhngnino
mngidngcthnhnthyvkhaithcngdng.

Vic b sung icon resource vo d n ca ng dng c thc hin


thngquaccbcsau:

MdntrongVC.
M mn hnh Workspace ca d n, chn trang ResourceView.
right-clicktrntiuresourcecadn.

26 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
ChnmcInsert...

ChnmcIcon,sauchnNew:
Tanhncmnhnhthitkicon.Viconcnidungty.

n nh cc thng s
thuc tnh ca icon (s
hiu icon, tn th mc
v tn tp tin cha
icon)trongdn:Chn
ResourceView trong
Workspace ca d n,
rigth-clicktrniconmi
thm.
ChnmcProperties.
Th vien MFC cua Microsoft & ng dung c ban trong windows 27
Thchinnnhthngscaiconthngquahphithoisau:

- ID : Shiuicon.IDR_MAINFRAMElshiuquic
dngchoiconchnhcangdng.
- Filename :Tntptinchaicon.RESlthmcconsc
to trong th mc d n cha cc tp tin
resource.
Saukhinnhxong,gphmEnterktthc.
ngmnhnhthitkiconresource.
Bin dch d n. Dng Windows Explorer xem tp tin VD01.exe
trong th mc debug ca d n. Lc ny, ng dng VD01 c
iconring.

2.9LUTRCHNGTRNHNGUN:
Sau khi hon tt d n, mt vic rt thng xuyn l lu gi li
chng trnh ngun ca d n. Cng vic ny i hi phi loi b khi
thmcdncctptinkhngcnthit.lcctptinsau:
Thmcdn :Cctptin.NCB,.PLG,.OPT,.APS.
ThmcDebug :Ttccctptin,trtptin.execngiali.
ThmcRelease :Ttccctptin,trtptin.execngia
li.

2.10LPCStringCAMFC:
CString l lp i tng ca MFC cho php qun l mt ni dung
chuitrongbnhvinhngctnhuvitsau:
- Nidungchuilutrcdilnvicchsdngbnhti
u.
- Xy dng da trn kiu TCHAR nn thch nghi vi b m
UNICODE.
- Cchnhvixlsnsngchocctcvchuithngthng.
MtshnhvicsdngphbincaCStringnhsau:
CString();Hnhvitolpitngchui.
intGetLength()const;Trvsochiudichui.
28 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
voidEmpty();Xarngnidungitngchui.
BOOLIsEmpty()const;TrvTRUEnunidungchuilrng.
TCHARoperator[](intnIndex)const;TrvktvtrnIndex.
voidSetAt(intnIndex,TCHARch);tktchvovtrnIndex.
operatorLPCTSTR()const;ChuynvkiuchuicaC.
CString::operator=;Phptongnchuichoitng.
CString::operator+;Phptoncngchui.
CString::operator+=;Phptonnichuimivoitng.
CStringComparisonOperators;TrongOperatorslphpton
quanhthngthngnh:==,<,<=,>,>=,!=.
CStringMid(intnFirst[,intnCount])const;Trchchuicongia.
CStringLeft(intnCount)const;Trchchuiconbntri.
CStringRight(intnCount)const;Trchchuiconbnphi.
nCountlchiudi(skt)cachuiconctrchra.
void MakeUpper( ) / void MakeLower( ); Vit hoa / thng ni
dung.
voidFormat(LPCTSTRlpszFormat,...);Tonidungchochui.
voidTrimLeft()/voidTrimRight();Hykhongtrngtri/phi.
BOOL LoadString( UINT nID ); Gn ni dung cho chui bi mt
hng chui trong string table resource. nID l s hiu ca hng
chui.

THCHNH:
1.Vitngdngchophphinthngdnntptinchngtrnhv
chuithamsdnglnhthcthin.
2. Vit ng dng c ci t DoMessageBox sao cho hm
AfxMessageBoxsdngtrongngdnghinthhpthngboviicon
ringcangdng.
HD:Sdnghm:intMessageBoxIndirect(LPMSGBOXPARAMSpMsg
);
typedefstruct{
UINT cbSize; //Kchthc,=sizeof(MSGBOXPARAMS)
HWND hwndOwner; //Handlecacascha,cth=NULL
HINSTANCE hInstance; // Handle ng dng =
AfxGetInstanceHandle()
LPCTSTR lpszText; //Nidungchuithngbo
LPCTSTR lpszCaption; //Nidungchuitiu
DWORD dwStyle; //Dnghp,chathngsMB_USERICON
LPCTSTR lpszIcon; //Chuitniconchintrtronghp
DWORD_PTRdwContextHelpId; //Shiugip
MSGBOXCALLBACKlpfnMsgBoxCallback; //Hmxl
DWORD dwLanguageId; //Shiungnngsdng
}MSGBOXPARAMS,*PMSGBOXPARAMS;
Cac lp giao dien o hoa cua MFC 29
CHNG3:

CclpGIAODINhacaMFC

3.1CCCNGCGIAODINHA:
h tr ng dng trong vic trang tr giao din ha (Graphic
Device Interface - GDI) nh mn hnh, my in., windows cung cp mt
hthngcccngchacbnnhsau:
Pen :Cngcvimhocngthng.
Brush :Cngctmu.
Font :Cngcquinhkiuktchonidungvnbn.
Bitmap:Cngcqunlvngnhim.
Palette:Cngcqunlbmuhinth.
Region:Cngcqunlvnghinthcdngbtk.
Thngquacccngcnitrn,ngdngtrongwindowscththc
hincctcvhacbnmtcchddngmkhngphibntm
ncutrcvtlcathitbhinth.Cccngcnygilcngc
GDI.

3.2DEVICECONTEXT:
Vic khai thc kh nng ca cc cng c GDI c thc hin thng
quamtcutrcchathngtinqunlthitbhinth:DeviceContext
(DC).Timithiim,miDCcphpgnvimtthitbhinth
havsdngmtbcccngcGDIduynht.Munsdngmt
cng c GDI mi th DC phi chm dt s dng cng c tng ng m
nangdng.
MikhimtDCctomi,hthngtngchunbmtbcng
cGDI(trbitmap)mcnhinchon.ngdngcthtynghithayi
cccngcnychophhpvinhucucangdng.

3.3.TATRNGIAODINHA:
Vicnhvtrngiaodinhacthchindatrnhtrcta
c gc (0,0) l gc tri-trn (top-left corner) ca giao din ha,
chiudngcatrchonh(trcx)hngttrisangphi,chiudng
ca trc tung (trc y) hng t trn xung di. Trn mt phng giao
dinha:
im:Biudinbngcpta(x,y).
Hnh ch nht: Biu din bng cp nh gc tri trn v gc phi
di.
Thng tin v im, vng hnh ch nht v kch thc ca cc i
tngtrongmtphnggiaodinhacctthngquacccu
trcsau:
30 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Cutrcqunl1im:
typedefstruct_POINT{
int x,y //Ta(honh,tung)caim
}POINT;
Cutrcqunl1vnghnhchnht:
typedefstruct_RECT{
int top,left; //Tagctritrnhnhchnht.
int right,bottom; //Tagcphidihnhchnht.
}RECT;
Cutrcqunlchiurngvchiucaovnghnhchnht:
typedefstruct_SIZE{
int cx,cy; // Chiu rng, chiu cao vng hnh ch
nht.
}SIZE;

3.4CCLPMFCHTRGDI:
MCFcungcpmththngphongphcclpviychcnng
nhmhtrngidngtiatronglptrnhGDI.Vivicvndngk
thut OOP trn cc lp GDI ca MFC, ngi dng d dng to ra ng
dng mong mun m khng phi vit qu nhiu m lnh trong chng
trnh.

3.4.1Cclpitngim,hnhchnht:
CPoint:Lpitngim,tngngvicutrcPOINT.
CRect : Lp i tng vng hnh ch nht trn giao din ha,
tngngvicutrcRECT.CRectccchnhvictrngsau:
CRect();Tolpitngvnghnhchnhtrng.
CRect (int left, int top, int right, int bottom); To lp i tng
vnghnhchnhtcthngsxcnh.
intWidth()const;Trvrngvnghnhchnht.
intHeigth()const;Trvcaovnghnhchnht.
void NormalizeRect( ); Hp l ha cc thnh phn ta ca
rectmkhnglmthayivtrvkchthccan.
VD:Giskhitomtrectkhnghplnhsau:
CRectrect(100,0,0,50); //rect.left=100>rect.right=0
rect.NormalizeRect();
recttrnnhplvi:rect(0,0,100,50);

CSize:Lpitngkchthc,tngngvicutrcSIZE.

3.4.2LpCPen:
CPenllpitngqunlpen,mtcngcGDIquantrngca
DC. Thng qua i tng ny, DC c th thay i mu sc, nt v ca
Cac lp giao dien o hoa cua MFC 31
im hay ng thng m DC s trc hin. CPen c cc hnh vi c
trngsau:
CPen();Tolpitngpenrng.Chngtaphikhitotham
schoitngnytrckhisdng.
CPen( //Tolpitngpenvithams
intnPenStyle, //Kiuntv
intnWidth, //rngntv(=1:mcnhin)
COLORREFcrColor //Musccantv
);
nPenStylecthnhnmttrongccgitrsau:
PS_SOLID: PS_DASH:
PS_DOT: PS_DASHDOT:
crColorcthnhngitrtmacrophimuRGB()nhsau:
RGB(intmu_,intmu_xanh_l_cy,intmu_xanh_dng
)
Mimucctrngbngmtgitrtrongon0255phn
nh sng ca n. B phi mu theo qui tc phi mu t
nhin.
BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor
);Khitothngschoitngpen.nghathamsnhtrn.
operator HPEN() const; Ton t chuyn kiu, tr v handle ca
pen(HPEN)qunlbiitng.

3.4.3LpCBrush:
CBrush l lp i tng qun l brush, cng c GDI ca DC. Thng
qua i tng ny, DC c th thay i mu sc, dng ca nt t trong
mtvnghnhchnhtmDCstrchin.CBrushccchnhvic
trngsau:
CBrush();Tolpitngbrushrng.
CBrush(COLORREFcrColor);Tolpitngbrushcmut
tngngvimuquinhbithamscrColor.
CBrush(intnIndex,COLORREFcrColor);Tolpitngbrush
cmutcrColor,vnttnIndex.
Gi tr nt t c th l: HS_VERTICAL (ng k sc ng),
HS_HORIZAONTAL(ngkscngang).
BOOL CreateSolidBrush( COLORREF crColor ); To c tnh t
cvimucrColorchoitngbrushchacthngs.
operatorHBRUSH()const;Tontchuynkiu,trvhandleca
brush(HBRUSH)qunlbiitng.

3.4.4LpCFont:
CFontllpitngqunlfont,cngcGDIcaDC.Thngqua
itngny,DCthchinnnhfont,kiudng,kchthccabk
32 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
tcsdngchovichinthccnidungvnbn.Cchnhvic
trng:
CFont();Tolpitngfontrng.
CFont(const LOGFONT* lpLogFont ); To lp i tng font vi
thng s y . Gi tr thng s c n nh bi tham s kiu
cutrcLOGFONTchathngtin.LOGFONTckhaibonh
sau:
typedefstructtagLOGFONT{
LONGlfHeight; //chiucaocakt
LONGlfWidth; //chiurngtrungbnhcckt
LONGlfEscapement; //gc(1/10)giahnginvtrcX
LONGlfOrientation; //gc(1/10)giaktvtrcX(No9x)
LONGlfWeight; //mcmcafontch(0-1000)
BYTElfItalic; //=TRUE:Chnghing
BYTElfUnderline; //=TRUE:Chgchdi
BYTElfStrikeOut; //=TRUE:Chgchngangthn
BYTElfCharSet; //bkt(=DEFAULT_CHARSET)
BYTElfOutPrecision; //=OUT_DEFAULT_PRECIS
BYTElfClipPrecision; //=CLIP_DEFAULT_PRECIS
BYTElfQuality; //=DEFAULT_QUALITY
BYTElfPitchAndFamily;//=DEFAULT_PITCH|FF_DONTCARE
TCHARlfFaceName[LF_FACESIZE];//Chuitncafont
}LOGFONT;
Win9xchdnglfEscapement.
int GetLogFont( LOGFONT * pLogFont ); Ly thng tin ca font
qun l bi i tng font ch. Kt qu c in vo bin kiu
LOGFONTchbithamskiucontrLOGFONT*:pLogFont.
operator HFONT( ); Ton t chuyn kiu, tr v handle ca font
cqunlbiitng.
BOOLCreateFontIndirect(LOGFONT*lpLogFont);Khitothng
s cho i tng font t thng tin lu trong cu trc ch bi
lpLogFont.

3.4.5LpCBitmap:
CBitmapllpitngqunlbitmap,mtcngcGDIquantrng
gip qun l vng nh im (pixels)ca DC. Thng qua i tng ny,
DC c th d dng to ni dung trang tr trn giao din ha t ni
dungnhcsnclutrongtptin,ngthithchincctcvx
lnhcbntrnnidung.CBitmapcungcpcchnhvictrng
sau:
CBitmap();Tolpitngbitmaprng.
Cac lp giao dien o hoa cua MFC 33
BOOL LoadBitmap( UINT nIDResource ); To ni dung cho i
tng bitmap vi thng tin c ly t mt nh trong resource.
nIDResource:shiucanhbitmaptrongresourcecachng
trnh.
BOOLCreateCompatibleBitmap(
CDC*pDC, //ContritngDCtngng
intnWidth, //Chiurng,
intnHeight //chiucaotnhbngpixelcabitmapcto.
);Tonidungchoitngbitmapvithngtinvmusc,
phngiitngngviDCchbicontrthamspDC.
int GetBitmap( BITMAP* pBitMap ); Ly thng tin v bitmap c
qunlbiitng.Ktqunhncscinvobinc
kiuBITMAPchbithamskiucontrBITMAP*:pBitmap.
CutrcBITMAPbaogmcctrngcnghanhsau:

typedefstructtagBITMAP{/*bm*/
intbmType; //Kiubitmap,
intbmWidth; //Chiurngbitmaptnhbngpixel
intbmHeight; //Chiucaobitmaptnhbngpixel
intbmWidthBytes; //Kchthc1dngpixeltrongbitmap
BYTEbmPlanes; //Smu.
BYTEbmBitsPixel; //Sbitmuca1pixel
LPVOIDbmBits; // a ch vng nh cha pixel ca
bitmap
}BITMAP;
operatorHBITMAP()const;Tontchuynkiu,trvhandleca
bitmapcqunlbiitng.

3.4.6LpCPalette:
CPalette l lp i tng qun l palette, mt cng c GDI ca DC.
Thngquaitngny,DCcth to racc hiungmutrngiao
dinhabngcchthayiccbmumtcchphhp.
CPalette();Tolpitngpaletterng.
CreatePalette(LPLOGPALETTElpLogPalette);Khitothngs
cho i tng palette rng. Con tr tham s lpLogPalette ch n
binkiucutrcLOGPALETTEchathngtinbmudngkhi
to.
typedefstructtagLOGPALETTE{
WORDpalVersion; //Shiupalettehthng
WORDpalNumEntries; //Smusdng
PALETTEENTRYpalPalEntry[1]; //Chaccgitrmu,
//csphntmngbngpalNumEntries
}LOGPALETTE;
34 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

MiphntcapalPalEntryckiuPALETTEENTRYphnnh
gitrmudnghinthmuchmc(colorindex)tngngviv
trthtcan.CutrcPALETTEENTRYcnidungnhsau:

typedefstructtagPALETTEENTRY{
BYTEpeRed; //Gitrthnhphnmu
BYTEpeGreen; //Gitrthnhphnmuxanhlcy
BYTEpeBlue; //Gitrthnhphnmuxanhdng
BYTEpeFlags; //Vaitrmutronghthng.
}PALETTEENTRY;

operator HPALETTE( ) const; Ton t chuyn kiu, tr v handle


capalettequnlbiitng.

3.4.7LpCRgn:
CRgn l lp i tng qun l region, mt cng c GDI quan trng
gipDCnnhvngnhxlchnhdngtytrngiaodinha
can.
CRgn();Tolpitngvngnhrng.
BOOLCreateRectRgn(intx1,inty1,intx2,inty2);Khitothng
schoitngvngnhbng1hnhchnhtvitagctri
trnvgcphidilnltl(x1,y1)v(x2,y2).
BOOL CreateEllipticRgn( int x1, int y1, int x2, int y2 ); Khi to
thngschoitngvngnhbihnhellipsenitiphnhch
nhtcgctritrn(x1,y1)vgcphidi(x2,y2).
BOOLCreatePolygonRgn(
LPPOINTlpPoints, //Mngchataccimziczac
intnCount, //SphntPOINTtrongmngtrn
intnMode //=WINDING
);
Khi to thng s cho i tng vng nh bi mt ng ziczac
khp kn qua cc im c ta xc nh v c lu trong mt
mng.
intCombineRgn(
CRgn*pRgn1, //Contritngqunlvngnhthnht
CRgn*pRgn2, //Contritngqunlvngnhthhai
intnCombineMode //Cchkthphaivngnh
);Tothngschoitngvngnhtrncskthphaivng
nhc.ThamsnCombineModecthl:
RGN_AND: Vng nh kt qu l vng giao nhau gia hai vng
nh.
RGN_OR :Vngnhktqulvnghpgiahaivngnh.
RGN_DIFF:Vngnhktqulvngbgiahaivngnh.
Cac lp giao dien o hoa cua MFC 35
operator HRGN() const; Ton t chuyn kiu, tr v handle ca
vngnhqunlbiitng.

3.5LPCDC:
CDCllpitngqunlDC.ThngquaitngDC,khnng
ca cc cng c ha c khai thc cho vic trang tr giao din
haqunlbiDC.CDCccchnhvictrngnhsau:
CDC();TolpitngDCrng.
virtual BOOL CreateCompatibleDC( CDC* pDC ); Khi to thng
schoitngDCmtcchtngthchvimtDCcsnc
chbicontrthamspDC.
virtualBOOLDeleteDC();HybitngDC.
CPen*SelectObject(CPen*pPen);ChncngcvmichoDC.
pPen:contrnitngpenscdngchoDC.
HmtrvcontrchnitngpenmDCangsdng.
Cthsdnghnhvinychocccngctrangtrkhcca
DC.Ktqutrvlcontrnitngangdngtngng.
CPent* GetCurrentPen( ); Trv gi tr con trca i tng pen
angcsdngbiDC.
Mtcchtngtchocccngctrangtrkhc.
virtual COLORREF SetBkColor( COLORREF crColor ); t mu
nnchoDC.crColorlgitrmut.
COLORREFGetBkColor();TrvgitrmunncaDC.
virtual COLORREF SetTextColor( COLORREF crColor ); n nh
mucsdnghinthccnidungvnbntrnDC.
COLORREFGetTextColor();Trvgitrmuhindnghin
thccnidungvnbntrnDC.
int SetBkMode ( int nBkMode ); nnh ch hin th nn k t
biudinnidungvnbn.nbkModechathngsnnh:
TRANSPARENT:Nnchhinthtrongsut.
OPAQUE :Chhinthcmunn.
intGetBkMode();LychhinthchcaDC.
virtualBOOLTextOut(
intx,y, //Tabtuhinth
LPCTSTRlpszString, //Nidungchuihinth.
intnCount //Chiudichui.
);HinthnidungchuivnbnlngiaodinhacaDC.
virtualintDrawText(
LPCTSTRlpszString,//Nidungchuihinth
intnCount, //Chiudichui
LPRECTlpRect, //ContrnbinkiuRECT
36 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
UINTnFormat // Cha thng tin canh chnh chui hin
th.
); In ni dung chui ln giao din ha ca DC vi cc canh
chnh.
lpRect:ChnbinkiuRECTchathngtingiihnvnghin
th.
nFormat:Chophpkthpmtcchhplcccanhchnhtrong
vnghnhchnhtgiihn.Ccthngscanhchnhcthl:
DT_CENTER :Chnhgiatheochiungang
DT_VCENTER :Chnhgiatheochiudc
DT_RIGHT :Chnhphi.
CPointMoveTo(intx,inty);nnhimvhinhnh.
BOOLLineTo(intx,inty);Vngthngtimvhinhnh
nimcta(x,y).
voidFillRect(
LPCRECTlpRect,//ContrchnbinkiuRECT.
CBrush*pBrush //Contrnitngbrushdngtmu.
); T mu vng hnh ch nht c xc nh bi cc gi tr cha
trongbinkiuRECTdothamslpRectchn.
voidDraw3dRect( //Vhnhchnht3chiu
LPCRECTlpRect, //ContrnbinRECT
COLORREFclrTopLeft, //Muvcnhtrivcnhtrn.
COLORREFclrBottomRight // Mu v cnh phi v cnh di
);
BOOLDrawEdge(
LPRECTlpRect, //ContrnbinkiuRECT.
UINTnEdge, //Cchvtrnccg(trong,ngoi)cnh.
UINTnFlags //Cccnhcv.
);Vkhungchnhtvihiung3chiu.
nEdgecthkthpccgitrsau:
BDR_RAISEDINNER :Vnigtrong
BDR_SUNKENINNER :Vchmgtrong
BDR_RAISEDOUTER :Vnigngoi
BDR_SUNKENOUTER :Vchmgngoi
nFlagscthkthpccgitrsau:
BF_RECT :Vttccccnh
BF_TOPLEFT :Vcnhtrivcnhtrn
BF_BOTTOMRIGHT :Vcnhphivcnhdi
BOOLDrawState(
CPointpt, //imtgctritrncanhtrnDC
CSizesize, //Kchthcvnghinthnh
CBitmap*pBitmap, //Contritngbitmapcv
Cac lp giao dien o hoa cua MFC 37
UINTnFlags, //=DST_BITMAP(vbitmap)
CBrush*pBrush //ContritngBrush,sdngkhiv
//Bitmapn:nFlags|=DSS_DISABLED
);VbitmaphociconlnDC.
BOOLBitBlt(
intx,inty, //Tagctritrnv
intnWidth,intnHeight, //kchthcvngnhnnh.
CDC*pSrcDC, //ContritngqunlDCngun.
intxSrc,intySrc, // Gc tri trn phn nh ngun c
chp.
DWORDdwRop //Cchchppixeltnhngun.
); Chp ni dung phn nh bt u t v tr (xSrc,ySrc) trong DC
ngun sang vng nhn nh bt u t v tr (x, y), vi kch thc
(nWidth,nHeight)trongDCqunlbiitng.
Gi tr pixelc chuyn vo vng nhn nh ty thuc vo gi tr
tham s dwRop. Mt s gi tr dng cho tham s ny c th nh
sau:
SRCCOPY :Gitrpixellytrctiptpixelcanhngun.
SRCPAINT :LktquORcapixelnhngunvnhnhn.
SRCAND : L kt qu AND ca pixel nh ngun v nh
nhn.
BOOLMaskBlt(
intx,inty, //Tagctritrnv
intnWidth,intnHeight, //Kchthcvngnhnnh
CDC*pSrcDC, //ContritngqunlDCngun
intxSrc,intySrc, //Gctritrnphnnhcchp
CBitmap&maskBitmap,//Contritngbitmapmtn
intxMask,intyMask, //Gctritrnvngnhlmmtn
DWORDdwRop //Cchchppixeltnhngun.
); Tng t BitBlt nhng s dng mt n lc pixel. i tng
maskBitmap s dng nh trng en (monochrome bmp) m mi
pixel "en" s ngn vic chuyn pixel v tr tng ng t DC
ngunsangDCqunlbiitng,ccvtrkhccchuyn
bnhthng.
BOOLStretchBlt(
intx,inty, //Tagctritrnv
intnWidth,intnHeight, //Kchthcvngnhnnh.
CDC*pSrcDC, //ContritngDCngun.
intxSrc,intySrc, //Tagctritrnv
intnSrcWidth,intnSrcHeight, // Kch thc phn nh c
chp.
38 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
DWORDdwRop //Cchchppixeltnhngun.
); Tng t BitBlt nhng nh ch v nh ngun c th c kch
thc khc nhau nn to hiu ng co dn nh chp c so vi
nhngun.
BOOLDrawIcon(
intx,inty, //TagctritrnniticontrnDC
HICONhIcon //Handlecaicon
);ViconhIconlnvtr(x,y)caDCqunlbiitng.

3.6LPCImagelist:
CImageListllpitngimagelist.Miimagelistchophpqunl
danhschnhccngkchthcvhtrnhiutinchtrnchng.
CImageList();Tolpitngimagelistrng.
BOOLCreate(
UINTnBitmapID, // S hiu ca resource bitmap cha cc
nh
intcx, //rngminhtrongbitmapnitrn
intnGrow, //Snhtrongbitmap
COLORREFcrMask//Mumtn(khnghinth)
);Khitonidungchoitngtmtbitmaptrongresource.
intGetImageCount();Snhcaimagelistqunlbiitng.
intAdd(
CBitmap*pbmImage, // Con tr i tng bitmap ca nh
mi.
CBitmap*pbmMask| //itngbitmapmtnhoc
[COLORREFcrMask] //mumtncanhmi.
);Thmmtnh(bitmap)voimagelist.
BOOL BeginDrag( int nImage, CPoint ptHotSpot ); Chun b
chuynnhthnImagetrongimagelistvivtrbtuptHotSpot.
static BOOL DragEnter( CWnd* pWndLock, CPoint point ); Cm
caspWndLock,nimimagelistangthchinchuynnh.
static BOOL DragMove(CPoint pt); Chuyn nh nImage n v tr
pt.
staticBOOLDragLeave(CWnd*pWndLock);Chmdttnhtrng
bcmcacaspWndLock.
staticvoidEndDrag();Chmdttcvchuynnh.
staticBOOL DragShowNolock(BOOLbShow);Hinthhocche
nhtrongqutrnhchuynhnh.
BOOLDraw(
CDC*pdc, //itngDCdngvhnh
intnImage, //Sththnhcvtrongimagelist
POINTpt, //Tagctritrnnivhnh
Cac lp giao dien o hoa cua MFC 39
UINTnStyle //Kiuv=ILD_NORMAL
);VhnhnImagecaimagelistqunlbiitnglnDC.
BOOLDrawIndirect(
CDC*pDC,intnImage,POINTpt, //TngtDraw
SIZEsz, //Kchthcvngnhnnh
POINTptOrigin, //Gctritrnphnnhcv
UINTfStyle, //Kiunh(=ILD_NORMAL)
DWORDdwRop, //Cchchppixel(=SRCCOPY)
COLORREFrgbBack,//Muvngblc=CLR_DEFAULT

COLORREFrgbFore //MuphihpchofStylecthngs
//ILD_BLEND25hocILD_BLEND50(=CLR_DEFAULT)
);VhnhnImage.

itngGDIckhitotrongchngtrnhbihnhviCreatexxx
cn c hy b khi chm dt s dng trnh lng ph b nh h
thng:
- CcitngcngcGDI,sdnghnhvi:DeleteObject();
- Ccitngqunlthitbha,sdnghnhvi:DeleteDC(
);
40 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
CHNG4:

CasgiaodinvlpCWnd

4.1CASGIAODIN:
Casgiaodinlthnhphnquantrngcangdng.Nkhng
ch ng vai tr trung gian trong trao i thng tin gia ng dng vi
ngi dng bi giao din ha d nhn m cn l cng c x l
messagehiuquvkhngththiuchocchiuphimessageca
ngdngwindows.
Bn cnh , ca s giao din cn lm chc nng nhn din ng
dng,lththnghnhchongdngtronghnhtrnhtnti,hotng
clpcngnhphihptraoidliuviccngdngkhctrong
windows.

4.2LPCWnd:
CWnd l lp i tng qun l ca s ca windows. Thng qua cc
thuctnhvhnhvicalpCWnd,MFCcungcpccdchvcnthit
cho php to lp v khai thc cc tnh nng ca ca s windows mt
cchddng.
HWNDm_hWnd:Thuctnhluhandlecacas.
CWnd();Hnhvitolpitngcas.
virtualBOOLCreate(
LPCTSTRlpszClassName, //Tnngkcalpcas
LPCTSTRlpszWindowName, //Tncas.
DWORDdwStyle, //Ccthngsvdngcas
constRECT&rect, //Quinhvtr,kchthccas
CWnd*pParentWnd, //Contritngcascha
UINTnID, //Shiucas
CCreateContext*pContex=NULL
);Khitothngschocasqunlbiitng.
Tham s dwStyle qui nh c im v kiu dng ca s. Gi tr
dngchothamsnycthkthpmtstrongccgitrsau:
WS_POPUP :Casctolcaschnh.
WS_CHILD :Casctolcascon.
WS_TABSTOP :Cascon,chuyncbngphmtab.
WS_OVERLAPPED :Caschnh.
WS_SYSMENU :Caschpmenuhthng.
WS_BORDER :Cascvin.
WS_CAPTION :Casctiu(caption)
WS_DISABLED :Casbcm.
WS_DLGFRAME :Cascvinmkiuhpthoi,
Ca so giao dien va lp CWnd 41
WS_HSCROLL :Cascthanhtrtngangbin.
WS_VSCROLL :Cascthanhtrtdcbin.
WS_MAXIMIZEBOX : C hp phng to trn caption ca ca
s.
WS_MINIMIZEBOX :Chpthunhtrncaptioncacas.
WS_THICKFRAME : Vin cho php thay i kch thc ca
s.
WS_VISIBLE :Casnhnthyc(hinth).
Vd:WS_POPUP|WS_CAPTION:Caschnhctiu.

lpszClassName l mt tn ng k cho lp ca s. Ngoi cc


tn m windows ng k nh STATIC, BUTTON, EDIT, ...
(chng 8), ta c th ng k tn lp ca s ring ca mnh mt
cchty.Vicngktnlpcascththchinbngmt
tronghaicchsau:
ngktrctip:
LPCTSTRAFXAPIAfxRegisterWndClass(
UINTnClassStyle, //Thngsdngcacas
HCURSORhCursor=0, //Cursorhinthtrongcas
HBRUSHhbrBackground=0,//Brushdngtnncas
HICONhIcon=0 //Icontrntiucacas
); Tr v chui tn lp ca s c ng k. Cc ln ng k
tnlpcascthamsgingnhausnhncmttnduy
nht.
ThamsnClassStylecthkthptccgitrsau:
CS_HREDRAW :Cascvlikhichiurngthayi.
CS_VREDRAW :Cascvlikhichiucaothayi.
CS_NOCLOSE :Cmhpng[]trntiucacas.

Vd:ngklpcascnnmuxanhdng.
CString myClassName;
CBRUSH myBrush;
myBrush.CreateSolidBrush(RGB(0,0,255));
myClassName=AfxRegisterWndClass(
CS_VREDRAW|CS_HREDRAW,
NULL,myBrush,NULL);

ngkquacutrcchaccthngs:

BOOLAFXAPIAfxRegisterClass(WNDCLASS*lpWndClass);
Hm tr v gi tr TRUE nu tc v ng k thnh cng. Thc
hin ng k theo cch ny trnh c s dng chung tn lp
cashaingdngkhcnhaukhihaingdngnytnhc
ngkcctnlpcasgingnhauvthngs.
42 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
lpWndClass l con tr ch n bin c kiu cu trc
WNDCLASS.

typedefstruct_WNDCLASS{
UINTstyle; //Dngcalpngk
WNDPROClpfnWndProc; //ContrhmWindowProcca
// ca s. C th ly hm do
MFC
//khaibosn:AfxWndProc
intcbClsExtra; //Dnhringcahthng
intcbWndExtra; //Dnhringcahthng
HINSTANCEhInstance; // Instance handle ca ng
dng
HICONhIcon; //Handlecaicon
HCURSORhCursor; //Handlecacursor
HBRUSHhbrBackground; //Handlecabrushvnn
LPCTSTRlpszMenuName; // Chui tn menu trong
resource
LPCTSTRlpszClassName; //Tnlpcasngk
}WNDCLASS;
BOOLCreateEx(
DWORDdwExStyle, //Ccthngsdngmrng
LPCTSTRlpszClassName, //Tnlp
LPCTSTRlpszWindowName, //Tncas
DWORDdwStyle, //Dngcas
intx,inty, //Tagctritrncacas
intnWidth,intnHeight, //Chiurngvcaocacas
HWNDhwndParent, //Handlecacascha
HMENUnIDorHMenu, //Handlecamenugnvicas
LPVOIDlpParam=NULL
);Khitocasvivicsdngccthngsmrngvdng.
ThamsdwExStylequinhdngmrngcacascthkt
hptccgitrsau:
WS_EX_TOPMOST :Caskhngbchekhut.
WS_EX_TOOLWINDOW :Caskhnghinthtrntaskbar.
WS_EX_TRANSPARENT:Cascnntrongsut.
WS_EX_CLIENTEDGE :Cascgquanhvngclient.
virtualBOOLPreCreateWindow(CREATESTRUCT&cs);Hnhvi
c thc hin trc khi windows khi to thng s cho ca s.
ThambincskiuCREATESTRUCTchathngskhito.

typedefstructtagCREATESTRUCT{
Ca so giao dien va lp CWnd 43
LPVOIDlpCreateParams; // Con tr vng cha thng s ca
s
HANDLEhInstance; //Handlecangdng
HMENUhMenu; //Handlecamenugnvicas
HWNDhwndParent; //Handlecacascha
intcy;intcx; //Chiurngvcaocacas
inty;intx; //Tagctritrncacas
LONGstyle; //Thngsnnhdngcas
LPCSTRlpszName; //Tncascto
LPCSTRlpszClass; //Tnlpcasdngchocas
DWORDdwExStyle; //Thngsnnhdngmrng
}CREATESTRUCT;
Trong cc lp k tha CWnd, hnh vi ny c dng can
thipcitccnnhringtrncutrcthngscscaca
s.
BOOL EnableWindow( BOOL bEnable = TRUE ); Cho php hoc
cmhotngcacas.
BOOL ShowWindow( int nCmdShow ); n nh trng thi hin th
ca ca s trn mn hnh. Gi tr cho tham s nCmdShow c th
l:
SW_HIDE :Ducas
SW_MINIMIZE :Thunhcas
SW_RESTORE :acasvtrngthitrc
SW_SHOW :Hinthcas
SW_SHOWNA : Hin th nhng khng kch hot ca
s
SW_SHOWMAXIMIZED :Hinthvphngtocas
SW_SHOWMINIMIZED :Hinthvthunhcas
BOOLSetWindowPos(
constCWnd*pWndInsertAfter, //Contrcaslmmc
intx,inty, //Tagctritrncacas
intcx,intcy, //Kchthccas
UINTnFlags //Thngstrngthi
);nnhvtrcastrnmnhnh.
Gi tr pWndInsertAfter qui nh v tr t ca s theo chiu th 3
(z-order).Gitrnycthnhsau:
wndBottom :Casctdimicas.
wndTop :Cascttrncccasthngthng.
wndTopMost :Cascttrnmicas.
ThamsnFlagsquinhtrngthimicacas:
SWP_SHOWWINDOW :Hinthcas.
44 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
SWP_DRAWFRAME :Vliframecacas.
SWP_NOREDRAW :Khngcpnhtlithngtincas.
voidMoveWindow(
intx,inty, //Tamichogctritrn
intnWidth,intnHeight, //Chiurngvchiucaocacas
BOOLbRepaint=TRUE //Yucuwindowsvlicas
);Thayivtrvkchthccacas.
voidGetWindowRect(LPRECTlpRect);Lythngtinta,kch
thccacas,lpRectchnbinkiuRECTchaktqu.
void GetClientRect( LPRECT lpRect ); Ly thng tin ta , kch
thc vng client ca ca s, lpRect ch n bin RECT cha kt
qu.
int GetWindowRgn(HRGN hRgn); Xc nh vng hin th ca ca
s.
intSetWindowRgn(
HRGNhRgn, //Handlecaregionqunlvngnnh
BOOLbRedraw //Vlicas(TRUE)haykhng(FALSE)
);nnhvnghinthcacastheodngcaregion.
voidGetWindowText(CStringrString);Lynidungchuitiu
cacasvluvobinitngchuirString.
intGetWindowTextLength();Trvchiudicachuitiu.
void ClientToScreen( LPPOINT lpPoint / LPRECT lpRect );
Chuyn ta im hay vng hnh ch nht trong client ca ca
ssanghtrctacamnhnh.
void ScreenToClient( LPPOINT lpPoint / LPRECT lpRect );
Chuyn ta im hay vng hnh ch nht trn mn hnh sang
htrctacavngclienttrongcas.
HICONGetIcon(BOOLbBigIcon);Trvhandlecaiconmca
sangsdng.GitrthamsbBigIconcnghanhsau:
TRUE :Handlecaiconhinthtrntaskbar(bigIcon)
FALSE :Handlecaiconhinthtrncaption(smallIcon)
HICONSetIcon(
HICONhIcon, //handlecaicon
BOOLbBigIcon //TRUE(tbigIcon),FALSE(tsmallIcon)
);ticonmichocas.
static CWnd* PASCAL GetFocus( ); Tr v con tr ch n i
tngCWndangcphpnhnthngtinnhptbnphm.
CWnd*SetFocus();Kchhotcas.Hmtrvcontrcai
tngCWndckchhottrc.
CFont*GetFont();Trvitngfontchcacas.
voidSetFont(
CFont*pFont, //Contrnitngfontch
Ca so giao dien va lp CWnd 45
BOOLbRedraw=TRUE //Vlicassautcvtfont?
);nnhfontchchocas.
CMenu* GetMenu( ); Tr v con tr i tng menu gn vi ca
s.
BOOLSetMenu(CMenu*pMenu);Gnmenuchocas.
CWnd*GetParent();Trvcontrnitngcascha.
int GetScrollPos( int nBar ); Tr v v tr hin hnh ca nt cun
trnthanhcun.nBarchashiuthanhcunquantm.nBarc
thl:
SB_HORZ :Thanhcunngang.
SB_VERT :Thanhcundc.
intSetScrollPos(
intnBar, //Thanhcuncchn
intnPos, //Vtrt
BOOLbRedraw=TRUE //Vlithanhcunsautcvt
);tvtrntcunchothanhcuntngng.
UINTSetTimer(
UINTnIDEvent, //Shiucatimer,phnbitduynht
UINTnElapse, //Chuktimer(tnhbngmili-second)
NULL //SdnghnhviOnTimerxltimer
); t bin c nh thi (timer) cho ca s qun l bi i tng.
Mi khi ht mt chu k ca timer, h thng gi WM_TIMER km
theoshiucatimernchocas.
BOOLKillTimer(intnIDEvent);HybtimercshiunIDEvent.
afx_msgvoidOnTimer(UINTnIDEvent);HnhvixlWM_TIMER
cacas.ThamsnIDEventchashiucatimerlinquan.
void Invalidate( BOOL bErase = TRUE ); Kch hot c ch v li
vngclientcacas.NubErase=FALSE,windowskhngthc
hinxathngtintrongvngcnvli.
void InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );
Kchhotcchvlimtvngtrongclientcacas.Thngtin
vvtrvkchthccavngcnvliclutrongbinkiu
RECTchbilpRect.ThamsbErasecnghanhInvalidate.
intMessageBox(
LPCTSTRlpszText, //Nidungthngbo
LPCTSTRlpszCaption=NULL //Tiuhpthngbo
UINTnType=MB_OK //Dnghpthngbo
);Hinthhpthngbovtrvshiucantcchn.
LRESULTSendMessage(
UINTmessage, //Shiumessage
WPARAMwParam=0, //ThamskiuWORD
LPARAMlParam=0 //vkiuLONGkmtheomessage
46 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
); Gi message v tham s km theo n hm WindowProc ca
casqunlbiitng,vchnkhihmWindowProcx
lxong.
BOOLPostMessage(UINTmessage,
WPARAM wParam = 0, LPARAM lParam=0
);tmessagevccthamskmtheovomessagequeueca
ngdng.Hnhviktthcmkhngchmessagecxl.
afx_msg void OnSize( UINT nType, int cx, int cy ); Hnh vi x l
WM_SIZE, message do windows gi n ca s khi mt tc v
thayikchthccashontt.cx,cychakchthcmica
cas.
afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct );
HnhvixlWM_CREATE,messagedowindowsgincas
khitcvkhitothngschocascthchinxong.
afx_msgvoidOnClose();HnhvixlWM_CLOSE,messagedo
windowsgincaskhitcvngcasangxyra.
afx_msg void OnDestroy( ); Hnh vi x l WM_DESTROY,
message do windows gi n ca s khi tc v hy b ca s
angxyra.
afx_msgvoidOnKeyDown(
UINTnChar, //Mphm
UINTnRepCnt, //Slngphm
UINTnFlags //Trngthiccphmkmtheo
); Hnh vi x l WM_KEYDOWN, message do windows gi n
caskhicasangckchhot,ngthicphmvac
nxungmkhngcssdngphmAltkmtheo.
afx_msgvoidOnKeyUp( //Ccthamstngtnhtrn
UINTnChar,UINTnRepCnt,UINTnFlags
);HnhvixlWM_KEYUP.MtcchtngtWM_KEYDOWN.
afx_msgvoidOnChar(
UINTnChar, //MASCII
UINTnRepCnt, //Slng
UINTnFlags //Trngthiccphmkmtheo
);HnhvixlWM_CHAR,messagedowindowsgincas
khimtphmktcg.
afx_msgvoidOnLButtonDblClk(
UINTnFlags, //Chagitrphmcnhnkm
CPointpoint //Vtrdouble-clickchut
);HnhvixlWM_LBUTTONDBLCLK,messagedowindowsgi
ncaskhingidngdouble-clickvontchuttri.
ThamsnFlagcthlkthpcaccgitrsau:
MK_CONTROL :PhmCTRLcnhnkmtheo
Ca so giao dien va lp CWnd 47
MK_SHIFT :PhmSHIFTcnhnkmtheo
afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);Hnh
vixlWM_LBUTTONDOWN,messagedowindowsginca
skhingidngnntchuttri.Ccthngtinnhtrn.
afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);Hnhvi
xlWM_LBUTTONUP,messagedowindowsgincaskhi
ngidngnhntchuttri.Ccthngtinnhtrn.
Mt cch tng t cho cc hnh vi x l message ca nt chut
phi.
afx_msg void OnMouseMove( UINT nFlags, CPoint point ); Hnh
vixlWM_MOUSEMOVE,messagedowindowsgincas
khi ngi dng di chuyn chut trong ca s. Cc thng tin nh
trn.
intGetDlgCtrlID();Trvshiucaitngcascon.
afx_msg void OnPaint( ); Hnh vi x l WM_PAINT, message do
windows gi n ca s khi h thng hoc ng dng c nhu cu
trangtrlimtphnhaytonbgiaodincacas.

CngvicthngthngcaOnPaintlvliccnidungcnduy
tr trn b mt giao din ca ca s. thc hin vic ny,
OnPaintsdngmtitngCDCvdngnchoccthaotc
hacnthitnhmhonthnhyucunitrn.
BccxlthngthngcahnhviOnPaintnhsau:

PAINTSTRUCTps; //Binchathngtintrangtr
CDC*pDC=BeginPaint(&ps); //LyDCcagiaodincas
. //Xltrangtrgiaodinha
EndPaint(&ps); //Chmdt.

afx_msgvoidOnHScroll(
UINTnSBCode, //Shiughinhncimtcng
UINTnPos, //Vtrntcun/nttrttrnmc
CScrollBar*pScrollBar//Contritngqunlmc
);HnhvixlWM_HSCROLL,messagedowindowsginca
s khi c mt mc l thanh cun hay thanh trt t ngang
(horizontal scrollbar hoc horizontal sliderCtrl) trong ca s b tc
ng.
nSBCodeghinhncimtcnglnntcun/trtnhsau:
SB_LEFT :Gimntvvtrthpnht
SB_ENDSCROLL :Chmdttcvchuynnt
SB_LINELEFT :Gimntmtvtr
SB_LINERIGHT :Tngntmtvtr
SB_PAGELEFT :Gimntmton
48 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
SB_PAGERIGHT :Tngntmton
SB_RIGHT :Tngntnvtrcaonht
SB_THUMBPOSITION:Chuynntbngchut
SB_THUMBTRACK :angchuynntbngchut.
nPoscsdngtrongcctcvnhvnttuyti().
Dng hnh vi GetDlgCtrlID ca i tng ch bi pScrollBar
xc nh s hiu ca mc pht sinh message WM_HSCROLL.
y l c s gip phn bit mc ny vi cc mc khc trong
cng ca s giao din nhm la chn x l thch hp cho
WM_HSCROLL.
afx_msgvoidOnVScroll(
UINTnSBCode, //Shiughinhncimtcng
UINTnPos, //Vtrntcun/nttrttrnmc
CScrollBar*pScrollBar//Contritngqunlmc
);HnhvixlWM_VSCROLL,messagedowindowsginca
s khi c mt mc l thanh cun hay thanh trt t thng ng
(verticalscrollbarhocverticalsliderCtrl)trongcasbtcng.

XlcahnhvinyccittngthnhviOnHScroll.
afx_msgBOOLOnSetCursor(
CWnd*pWnd, //Contrnitngcaschacursor
UINTnHitTest, //Thngtinvvtrcursor
UINTmessage //Chaccshiumessageclinquann
//trngthihinthicaccntconchut
);HnhvixlWM_SETCURSOR,messagedowindowsgin
caskhiwindowscnnnhlihnhdngcursorchophhp
vivtrhinthicantrncas.
nHitTestchathngtinvtrhinthicacursor:
HTBORDER :Cursorhinnmtrnbincas
HTCLIENT :Cursorhinnmtrongvngclient
HTCAPTION :Cursorhinnmtrntiucacas
virtualLRESULTWindowProc(UINTmessage,
WPARAMwParam,LPARAMlParam);
Hnhvixlccmessagegincas.Mcnhin,hnhviny
davobngMessageMapchuynmessagenhnhvixl
messagetngngcaitngqunlcas.

4.3SDNGITNGCWnd:
4.3.1SdngCWndlmgiaodinchnhcangdng:
TodnVD02nhdnVD01.Thchinccbsungsau:
ToiconcshiulIDC_MAINFRAME.Thamkho(2.8).
TocursorcshiulIDC_MAINFRAME:
Tomicursor:Thchintngtnhtomiicon,(2.8).
Ca so giao dien va lp CWnd 49
t im ch (hotpot) ca cursor: Trong mn hnh thit k
cursor:
- Clickchnbiutng trnthanhcngc.
- Clicktivtrhotpotcacursortrnmnhnhthitk.
Dng i tng CWnd lm ca s giao din chnh ca ng dng:
c thc hin bi hnh vi InitInstance (xem 2.4) ca i tng
CEmpApp qun l tiu trnh chnh. K tha hnh vi ny t
CWinAppcholpCEmpApp(xem2.7).Nidungcitcahnh
vinhsau:

CWnd*main=newCWnd(); //ContritngCWnd.
HICON myIcon; //Khaibobinqunl
HCURSOR myCursor; //handlecacursorvicon
CBrush myBrush;

//Npcursorvicontresourcevobnh.
myIcon=LoadIcon(IDR_MAINFRAME);
myCursor=LoadCursor(IDR_MAINFRAME);
//TobrushtnncasvimuRGB(190,190,0)
myBrush.CreateSolidBrush(RGB(190,190,0));

//Khitothngschoitngcasmain
main->CreateEx(WS_EX_TOPMOST,
AfxRegisterWndClass(
CS_HREDRAW|CS_VREDRAW,
myCursor,myBrush,myIcon),
"Emp.Example2",
WS_SYSMENU|WS_VISIBLE|WS_MINIMIZEBOX,
100,100,300,200,NULL,NULL);
//Dngmainlmcasgiaodinchnh
m_pMainWnd=main;
main->ShowWindow(SW_SHOW); //Kchhotcasmain

Khi i tng ca s main ngng hot ng th ng dng cng kt


thc.
XemVD02:CasmainviExStylelWS_EX_TOPMOSTcthni
trnmicaskhcngayckhinkhngphilcaskchhot.Vi
ExStyle l WS_EX_TOOLWINDOW, ca s s khng hin th trn
taskbar.

4.3.2ngdngchchymtbn(instance)timithiim:
ngdngchcthchinvi1bnduynht,tacitcch
nhduvkimtra.Trongchngtrnhcangdng,taquicng
50 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
kvsdngmttnduynhtchocaschnh.Khichngtrnhc
thchin,nkimtraxemtncngkchathngquahm
sau:

HANDLECreateMutex(NULL,FALSE,LPCTSTRTn);

Hm tr v gi tr ERROR_ALREADY_EXISTS nu Tn c
ng k. Trong trng hp ny ta c th khng nh mt instance ca
ngdngcthchin,chngtrnhktthcchchophpmt
instanceduynht.
HycitcchnychongdngVD02(ThamkhoVD03).

THCHNH:
1. Vit ng dng windows ch cho php thc hin ti a hai bn
(instance).
2. Ci t hnh vi PreCreateWindow cho lp k tha CWnd ca ng
dngcasgiaodinlunckchthc100100vtiul"Hello
!" bt chp gi tr kch thc v tiu dng cho khi to thng s ca
itngcas.
X ly Message 51
CHNG 5:

X l message

5.1 LP X LY MESSAGE CCmdTarget:
Windows la moi trng ma phan ln giao tac gia cac bo phan da tren c
che gi-nhan message. Viec tao ra oi tng co kha nang x ly va ieu phoi
messages la rat can thiet khong ch oi vi he thong ma vi ca ng dung.
Tren quan iem o, MFC cung cap lp oi tng CCmdTarget phuc vu x ly
va ieu phoi messages trong pham vi ng dung, gia ng dung vi he thong
va vi cac ng dung khac. Cac hanh vi ac trng cua lp nh sau:
void BeginWaitCursor( ); Hien th cursor ch x ly (ong ho cat).
void EndWaitCursor( ); Cham dt hien th cursor ch x ly.
nh hng x ly message: C che nh hng x ly message do MFC
cung cap cho phep bo sung muc x ly message cho cac lp oi tng
ke tha lp CCmdTarget. Cac macro giup cai at c che nay nh sau:
DECLARE_MESSAGE_MAP( ): An nh ac tnh x ly message
cho lp oi tng x ly message thong qua cac cai at bo sung sau:
- Thuoc tnh private kieu cau truc mang cha cac phan t co kieu
AFX_MSGMAP_ENTRY. Moi phan t cua mang c dung lu
tr mot muc x ly message ma lp ke tha khai bao bo sung.
- Thuoc tnh protected kieu cau truc AFX_MSGMAP vi ten la
MessageMap ch en bang cac muc x ly message noi tren.
- Hanh vi protected: virtual AFX_MSGMAP GetMessageMap( );
tra ve a ch cua bang MessageMap cha cac muc x ly.
DECLARE_MESSAGE_MAP c at cuoi phan khai bao lp:
class MyClass : public CCmdTarget { // Tap tin .H cua lp
// Cac noi dung khai bao cua lp
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP( Ten_lp_ke tha, Ten_lp_c_s ): Bat
au noi dung khai bao cac muc x ly cua bang MessageMap.
END_MESSAGE_MAP( ): Ket thuc khai bao bang MessageMap.
Toan bo noi dung khai bao cua bang MessageMap c at trong
tap tin cai at (.CPP) cua lp, nen at au tap tin e tien theo doi.
virtual BOOL OnCmdMsg (
52 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
UINT nID, // So hieu command message
int nCode,
void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo
); ieu phoi command message. Neu ban than oi tng la ca so giao
dien chnh th cac WM_COMMAND c u tien gi en cho oi
tng. Thong qua hanh vi nay, oi tng co the ieu phoi command
message cho cac oi tng khac (ng dung, cac control, view). Lu y
la oi tng c ieu phoi co the khong co chc nang x ly command
message gi en, do o can kiem tra ket qua cua hanh vi OnCmdMsg
tren oi tng c ieu phoi. Bo cuc x ly ieu phoi nh sau:
if (oi_tng->OnCmdMsg(...) != 0) {
return; // oi tng c ieu phoi a x ly message
}
// Chu the phai x ly message

5.2 KHAI BAO MUC X LY MESSAGE TRONG MESSAGE MAP:
Muc x ly message trong bang MessageMap cho phep an nh mot x ly
duy nhat cho mot message. Cac loai message khac nhau co kieu muc x ly
message khac nhau. Cac kieu muc x ly message pho bien nh sau:
Cac message cua he thong, c bieu dien bi cac hang so bat au
bang WM_ *, muc x ly message tng ng co dang ON_WM_* ().
V du: WM_PAINT ON_WM_PAINT()
WM_SIZE ON_WM_SIZE()
Cac message cua ngi dung: So hieu message c chon tuy y trong
oan WM_USER WM_USER+07FFF. Muc x ly message cho cac
message cua ngi dung co dang nh sau:

ON_MESSAGE( userMessageID , UserFuncName )

Trong o:
- userMessageID : So hieu message do ngi dung chon trc
- UserFuncName : Ham x ly message, co khai bao nh sau:

afx_msg LRESULT UserFuncName (
WPARAM wParam, // Tham so kieu WORD va
LPARAM lParam // Tham so kieu LONG kem theo message
);
X ly Message 53
Cac message co ang ky cua ngi dung: Ngoai cac message t nh
ngha va s dung theo qui c trong mot ng dung, windows cho phep
ng dung ang ky message e message o co the s dung tren nhieu
ng dung khac nhau. Viec ang ky c thc hien thong qua ham sau:

UINT RegisterWindowMessage (LPCSTR Chuoi_ten_message );

Ham tra ve so hieu ang ky c cua message. Gia tr nay nam trong
oan 0C0000FFFF. Cac ng dung ang chay tren mot he thong co
the chia xe message dung rieng vi ieu kien chung phai thc hien
thao tac ang ky cung mot chuoi ten message e lay so hieu message.
Muc x ly message cho cac message co ang ky cua ngi co dang:

ON_REGISTERED_MESSAGE(UserRegMessageID, UserFuncName)

Sau ay la mot v du:

// ang ky message vi ten la MY_MESS
const UINT myMess =RegisterWindowMessage(MY_MESS);
// Khai bao muc x ly cho message c ang ky
BEGIN_MESSAGE_MAP ( CMyWnd, CMyBasedWndClass )
//{{AFX_MSG_MAP ( CMyWnd )
ON_REGISTERED_MESSAGE ( myMess, myFunc )
// ...
//}}AFX_MSG_MAP
END_MESSAGE_MAP ( )

Message WM_COMMAND: Khi WM_COMMAND c gi en oi
tng x ly message th tham so wParam kem theo cha so hieu
(CommandID) cua oi tng phat sinh message. Muc x ly message
WM_COMMAND an nh x ly tng ng, va co dang nh sau:

ON_COMMAND ( CommandID, FunctionName )

Co the cai at x ly ieu khien oi vi oi tng lam phat sinh
WM_COMMAND thong qua muc x ly ieu khien message nh sau:

ON_UPDATE_COMMAND_UI( CommandID, PreFunctionName )

PreFunctionName la hanh vi thc hien x ly ieu khien tren oi tng
phat sinh WM_COMMAND, tham so nhan c la gia tr con tro en
oi tng CCmdUI*. Hanh vi Enable ( BOOL isEnabled ) cua oi
tng nay c dung e cam hoac cho phep hoat ong oi vi oi
tng phat sinh WM_COMMAND. X ly cua hanh vi nay co the la:
54 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
void [ClassName::]PreFunctionName (CCmdUI* pCmdUI ) {
pCmdUI->Enabled (FALSE ); // Cam oi tng hoat ong
}

Cac message do oi tng con (controls) gi en ca so cha: Tham so
wParam cha so hieu control, gia tr WORD cao cua tham so lParam
cha thong tin ve trang thai control thi iem gi message en ca so
cha (v du BN_CLICKED la mot trang thai cua button control,). Muc
x ly message cho message gi t control co dang nh sau:

ON_CONTROL (Trang_thai_control, So_hieu_Control, Ham_x_ly )

V du: Ta co v du minh hoa nh hng x ly message nh sau:

* Khai bao lp (tep tin .H):

class CMyClass: public CBasedWnd {
public: CMyClass();
void myProc(void);
void mySerach();
void myWork();
void PremyWork();
void OnExit(void);
DECLARE_MESSAGE_MAP()
}

* Phan cai at cua lp (tep tin .CPP):

#define MY_MESSAGE WM_USER +1
static UINT NEAR MY_MESS =RegisterWindowMessage(MY_MESS);
BEGIN_MESSAGE_MAP(CMyClass, CDerivedWnd)
//{{AFX_MSG_MAP(CMyClass)
ON_WM_PAINT() // WindowsMessage
ON_MESSAGE (MY_MESSAGE, myProc) // UserMessage
ON_REGISTERED_MESSAGE(MY_MESS,OnSearch)
// UserRegMessage
ON_COMMAND(ID_DO, myWork) // CommandMessage
// Command Preprocess
ON_UPDATE_COMMAND_UI(ID_DO, PremyWork)
//Control IDC_EXIT
ON_CONTROL(BN_CLICKED, IDC_EXIT, OnExit)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

Cac muc x ly message do Classwizard quan ly at gia //{{ va //}}
X ly Message 55
5.3 CAC LP KE THA CCmdTarget:
Cac lp oi tng cua MFC ke tha t CCmdTarget co chc nang x ly
message la CWnd, CWinApp, CDocument. ng dung co the da tren nhng
lp nay e xay dng cac lp ke tha am nhan chc nang x ly message phu
hp vi yeu cau cua ng dung.

5.4 MESSAGE MAP CUA LP KE THA CWnd TRONG NG DUNG:
5.4.1 Ca so cua ng dung co chc nang hoat ong:
Trong phan nay, ta thc hien ng dung vi ca so giao dien chnh co tieu
e cha noi dung ch chay theo kieu bang ch ien t.
Lp CWnd cua MFC khong cung cap tien ch nay. Chung ta can xay dng
lp ca so mi vi nhng kha nang phu hp; co cac chc nang nh CWnd e
lam giao dien, ong thi co kha nang t thay oi noi dung tieu e (caption)
theo thi gian (timer). Lp ca so nay ke tha t lp CWnd, t cai at timer
(SetTimer) khi bat au (OnCreate) hoat ong, x ly thay oi noi dung tieu e
moi chu ky Timer (OnTimer) va huy bo Timer (KillTimer) khi cham dt
hoat ong (OnDestroy). Sau ay la cac bc thc hien d an:
Tao d an VD04 tng t d an VD03.
Bo sung lp CEmpWnd (ten lp ca so mi) ke tha t CWnd: Thc
hien nh bo sung lp CEmpApp trong muc (2.7). Lu y trong hop hoi
thoai New Class : chon Class Type = MFC Class ; BaseClass = CWnd.
Cai at cac hanh vi x ly message can thiet cho lp CEmpWnd tren c
s ke tha t lp CWnd cua MFC:
Hanh vi OnCreate thc hien cac an nh can thiet cho CEmpWnd
trc khi i vao hoat ong. Bo sung va cai at hanh vi nh sau:
- Trong man hnh Workspace cua d an, chon trang ClassView.
- Right-click tren tieu e cua lp CEmpWnd:

- Chon muc Add Windows Message Handler... :
56 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

- Chon WM_CREATE. Sau o chon Add and Edit.
- Hanh vi OnCreate vi tham so thch hp c bo sung vao lp
CEmpWnd, ong thi muc x ly ON_WM_CREATE() c at
vao bang MessageMap. Cai at noi dung cua OnCreate nh sau:

int CEmpWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) ==-1) return -1;
// at timer so hieu 100, chu ky 250 ms
SetTimer(100, 250, NULL);
return 0;
}

Hanh vi OnTimer x ly WM_TIMER, cho phep x ly yeu cau moi
chu ky cua timer. Viec bo sung hanh vi nay c thc hien tng t
OnCreate. Noi dung cai at cua hanh vi nh sau:
void CEmpWnd::OnTimer( UINT nIDEvent )
{
X ly Message 57
if (nIDEvent ==100) { // Timer do chung ta cai at
char s[200], ch;
GetWindowText(s, 200); // Lay tieu e ca so
ch =s[0];
for (UINT i=0; i<strlen(s)-1; i++)
s[i] =s[i+1]; // Dch noi dung chuoi
s[i] =ch;
SetWindowText(s); // at tieu e ca so
}
CWnd::OnTimer(nIDEvent); // Thc hien hanh vi lp c s
}

Hanh vi OnDestroy x ly WM_DESTROY:
void CEmpWnd::OnDestroy()
{
KillTimer (100 ); // So hieu timer (TimerID)
CWnd::OnDestroy(); // Goi hanh vi lp c s.
}

Dung lp CEmpWnd cho oi tng ca so chnh cua ng dung: M
hanh vi InitInstance cua CEmpApp, thc hien cac chnh sa sau:
Thc hien ch th sau au tap tin chng trnh:
#include "EmpWnd.h" // Tap tin khai bao cua lp CEmpWnd
Dung CEmpWnd lam kieu cho bien con tro oi tng main.
Bien dch d an va chay th ng dung.

Lu y: D an VD04 s dung 100 lam so hieu timer. Viec s dung gia tr hang
nh the khong gi nh va kem linh hoat trong s dung. Ta nen khai bao mot
ten rieng cho hang e tranh cac han che tren. Cach thc hien nh sau:
Chon trang ResourceView trong man hnh Workspace.
Right-click tren project resources:

Chon Resource Symbols...:
58 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Ta nhan c hop hoi thoai Resource Symbols cha danh sach cac gia
tr a khai bao. Co the thc hien them, xoa cac gia tr khai bao nay.


Chon muc New:

Nhap ten cua gia tr khai bao trong hop Name, nhap gia tr khai bao
trong hop Value. Sau o chon OK
ong hop hoi thoai Resource Symbol e ket thuc.
Thong tin khai bao lu trong tap tin resource.h cua d an. Khi o, trong
chng trnh, thay v viet gia tr hang cu the cho so hieu cua Timer (chang
han 100), ta s dung ten khai bao cua no (theo v du la ID_TIMER).

5.4.2 WM_PAINT va hanh vi OnPaint cua CWnd:
e duy tr thong tin hien th tren be mat ca so, he thong thng xuyen
gi WM_PAINT en cho ca so moi khi co hien tng xam pham en noi
dung hien th cua no. ng dung cung co the kch hoat he thong phat sinh
message nay thong qua mot trong cac hanh vi sau:
X ly Message 59
void Invalidate(BOOL bErase = TRUE ); Yeu cau cap nhat toan bo
vung client cua ca so. Neu tham so bErase = FALSE th he thong se
khong t ong xoa ho phan noi dung cu trong ca so.
void InvalidateRect (
LPCRECT lpRect, // Con tro en bien kieu RECT cha
// thong tin vung c cap nhat
BOOL bErase = TRUE // Co y ngha nh Invalidate ()
); Yeu cau cap nhat mot vung gii han trong client cua ca so.

Hanh vi OnPaint cua CWnd dung x ly WM_PAINT. Viec s dung hanh
vi nay trong cac lp ke tha CWnd nham thc hien cac trang tr rieng theo
bo cuc muc OnPaint trong (4.2). Toan bo thao tac x ly nay c MFC
thc hien thong qua lp CPaintDC nh sau:
CPaintDC dc(this); // Device context e ve len
... // Thc hien cac tac vu ve tren dc

THC HANH:
1. Tng t VD04. Khi ngi dung ket thuc ng dung, chng trnh hien th
hop thong bao "Are you sure to exit this program ?" vi hai muc YES-NO.
Neu ngi dung chon YES th ket thuc:
HD: Cai at hanh vi OnClose x ly message WM_CLOSE cho CEmpWnd.
Dung hanh vi MessageBox cua CWnd e hien th cau thong bao. Neu ngi
dung ong y th thc hien hanh vi OnClose cua CWnd e ket thuc, ngc lai
khong thc hien x ly g ca (xem VD05)
2. Tng t VD04 vi phan demo la anh vien bi chay trong client cua ca so.
HD: Dung timer e lien tuc phat WM_PAINT bang hanh vi Invalidate theo
moi chu ky. Hanh vi OnPaint thc hien ve vao vung client cua ca so chnh
mot dong ch co noi dung chay kieu bang ch ien t. (xem VD06).
3. Thc hien ng dung cho phep hien th mot vat the co hnh dang bat ky
trong vung client. Cac phm , , , cho phep dch chuyen vat the nay.
HD: Nh bai tap 2 nhng khong s dung timer. Dung hanh vi OnKeyDown x
ly message WM_KEYDOWN. Hanh vi nay kiem tra gia tr phm nhan c
nChar vi cac gia tr hang phm VK_LEFT (phm ), VK_UP (phm ),
VK_RIGHT (phm ), VK_DOWN (phm ) e thay oi toa o vat the cho
phu hp. Sau cung phat sinh message WM_PAINT e ve lai vat the.
60 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
CHNG 6:

ng dung cong cu GDI

6.1 DC VA BITMAP:
Van e trang tr thiet b o hoa c tien hanh thong qua oi tng DC
quan ly thiet b, tren c s khai thac chc nang cac cong cu GDI lien quan.
Ket qua trang tr tren DC c quan ly bi oi tng Bitmap ma DC ang s
dung. Bitmap la cong cu lam nen khong the thieu cho cac DC.
Viec khi tao noi dung cho oi tng bitmap trong ng dung co the c
thc hien bang cach lay anh bitmap t resource (LoadBitmap) hay tao mi
noi dung cho bitmap da tren mot DC xac nh (CreateCompatibleBitmap).
Thong thng, ng dung o hoa phai chuan b san cac anh can thiet trong
resource cua ng dung. phan x ly, cac resource nay c tai vao bo nh
lam noi dung cho cac oi tng bitmap. T cac oi tng bitmap nay, anh se
c ve len cac thiet b hien th o hoa thong qua oi tng DC tng ng.

6.2 NG DUNG VI CA SO CHNH HIEN TH ANH:
Trong phan nay ta thc hien ng dung co chc nang hien th mot anh xac
nh trong vung client cua ca so chnh. Cac bc tien hanh d an nh sau:
Tao d an VD07 tng t d an VD06.
Tao mot anh bitmap trong resource vi so hieu la IDB_MYPICT: Noi
dung anh nay co the c tao mi hoan toan hoac lay t noi dung cua
mot tap tin bitmap (.bmp) a co. Chon mot trong hai cach sau:
Cach 1 anh bitmap c tao mi: Tng t tao mi icon (2.8).
Cach 2 anh bitmap c lay t noi dung tap tin bitmap (.bmp):
- Chon trang ResourceView trong man hnh Workspace.
- Right-click tren Project Resource:

- Chon Insert:
ng dung cong cu GDI 61

- Chon Bitmap, Import. Sau o chon tap tin cha anh bitmap thong
qua hop hoi thoai File-Folder.
- An nh cac thong so cua bitmap (so hieu la IDB_MYPICT).
Bo sung oi tng thuoc tnh m_myPict kieu CBitmap cho CEmpWnd:
- Chon trang ClassView trong man hnh Workspace cua d an.
- Right-click tren tieu e cua lp CEmpWnd:

- Chon Add Member Variable :

- Nhap cac thong tin ve kieu, ten va loai cua thuoc tnh. Chon OK.
Dung hanh vi OnCreate cua CEmpWnd e lay anh bitmap t resource
lam noi dung cua m_myPict. X ly c cai at nh sau:
62 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

int CEmpWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) ==-1)
return -1;

// Khi ong bitmap t bitmap resource IDB_MYPICT
mypict.LoadBitmap( IDB_MYPICT );
return 0;
}

Dung hanh vi OnPaint cua CEmpWnd, ve anh bitmap trong m_myPict
thong qua hanh vi DrawState cua oi tng CPaintDC dc.
void CEmpWnd::OnPaint()
{
CPaintDC dc(this);
RECT rect;
GetClientRect( &rect ); // Kch thc vung client
// draw on client
dc.DrawState ( CPoint(0,0), /* Goc trai tren cua anh */
CSize (rect.right-rect.left, rect.bottom-rect.top),
&m_myPict, DST_BITMAP);
}
Hanh vi OnDestroy cua CEmpWnd giai phong oi tng m_myPict.

void CEmpWnd::OnDestroy()
{
CWnd::OnDestroy();
m_myPict.DeleteObject();
}

Lu y: e x ly trang tr o hoa trong vung client cua ca so giao dien khong
gay ra hien tng "chp", ta co the s dung mot so giai phap sau:
- Khong s dung oi tng brush cho ca so lien quan: Dung gia tr NULL
cho tham so nay trong hanh vi khi tao thong so cua oi tng ca so.
- Dung tham so FALSE cho yeu cau cap nhat vung client cua ca so (5.4.2)
- Dung mot DC trong bo nh lam cong cu trang tr trung gian. Thc hien cac
noi dung trang tr can thiet len DC nay. Sau khi hoan tat cac tac vu trang
tr can thiet th chuyen noi dung DC cong cu len DC cua man hnh.
6.3 SAO CHEP ANH T DC VAO DC, PHONG TO & THU NHO ANH:
ng dung cong cu GDI 63
oi tng DC cho phep sao chep lai noi dung trang tr o hoa tren thiet b
hien th o hoa c quan ly bi mot oi tng DC khac len thiet b hien th
o hoa c quan ly bi chnh no thong qua mot so hanh vi sau:
- BitBlt : Sao chep va gi nguyen ty le trong noi dung anh.
- StretchBlt : Sao chep va thay oi ty le trong noi dung anh.
Trong phan nay ta xay dng ng dung co cac ac iem sau:
- Ca so chnh cua ng dung co the thay oi kch thc.
- Noi dung anh hien th trong vung client cua ca so t ong thay oi
kch thc mot cach phu hp khi kch thc ca so thay oi.
Viec thc hien can lu y cac bc sau:
- Ca so chnh cua ng dung co thuoc tnh WS_THICKFRAME.
- Dung mot DC ao e long anh bitmap thong qua oi tng CBitmap. Ve
anh bitmap t DC nay len DC hien th.
Cac bc thc hien nh sau:
Tao d an VD08 tng t d an VD07.
Hanh vi OnPaint cua CEmpWnd s dung DC trong bo nh e long anh
bitmap, t o ve len vung client cua ca so. X ly cai at nh sau:
void CEmpWnd::OnPaint()
{
CPaintDC dc(this);
RECT rt;
CDC memDC;
CBitmap *oldBmp;
BITMAP bmpInfo;

GetClientRect(&rect); // Kch thc vung client
mypict.GetBitmap(&bmpInfo); // Lay thong tin cua anh bitmap
memDC.CreateCompatibleDC(&dc);
// Long bitmap m_myPict vao memDC va lu lai bitmap cu cua no.
oldBmp =memDC.SelectObject(&m_myPict);
// Chep anh t memDC len DC quan ly vung client cua ca so: dc
dc.StretchBlt( 0, 0, rt.right-rt.left, rt.bottom-rt.top, &memDC,
0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight,
SRCCOPY);
// Phuc hoi anh bitmap cu cua memDC
memDC.SelectObject(oldBmp); memDC.DeleteDC();
} // Xem VD08
6.4 DC TRONG BO NH (DC AO) - VUNG VE EM LY TNG:
64 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Neu viec trang tr gom nhieu thao tac phc tap th nen thc hien chung
tren DC ao, sau o chuyen ket qua ra DC hien th. Ch mot lan duy nhat cho
moi noi dung trang tr, nh the se cai thien ang ke chat lng o hoa.
ng vi moi DC ao tao ra trong bo nh, ngoai oi tng CDC quan ly, ta
can s phoi hp cua oi tng bitmap lam nen thay the oi tng bitmap
tng trng khong s dung c ma he thong gan cho DC khi tao lap. Bo cuc
x ly cua hanh vi OnPaint co s dung oi tng DC ao nh sau:

CClientDC dc(this); // oi tng DC hien th
RECT rect;
CDC memDrawDC; // oi tng DC ao e ve trung gian
CBitmap memDrawBmp;
CBitmap *memDrawOldBmp;
GetClientRect ( &rt );
int CX =rect.rightrect.left ; int CY =rect.bottomrect.top;
memDrawBmp.CreateCompatibleBitmap( &dc, CX, CY );
memDrawDC.CreateCompatibleDC( &dc );
memDrawOldBmp =memDrawDC.SelectObject( &memDrawBmp );
... // Trang tr memDrawDC
// Chuyen noi dung DC ao sang dc:
dc.StretchBlt ( 0, 0, CX,CY, &memDrawDC, CX,CY, SRCCOPY );
// Huy bo cac oi tng GDI:
memDrawDC.SelectObject(&memDrawOldBmp);
memDrawBmp.DeleteObject();
memDrawDC.DeleteDC();
Phan tiep theo ta thc hien ng dung tng t VD08, ong thi tao dong
ch chay theo kieu bang ch ien t trong vung client cua ca so chnh.
Tao d an VD09 tng t d an VD08.
X ly Trang tr memDrawDC trong OnPaint cua CEmpWnd nh sau:

BITMAP bmpInfo;
m_myPict.GetBitmap( &bmpInfo );
memDrawDC.StretchBlt( 0, 0, CX, CY, &memDC,
0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight,
SRCCOPY );
memDrawDC.SetTextColor( RGB(255,0,0) ); // text color
memDrawDC.SetBkMode( TRANSPARENT ); // transparent
memDrawDC.TextOut( 30, 100, Chuoi, I );
Xem VD09.
ng dung cong cu GDI 65
Vi cac oi tng GDI c s dung thng xuyen th viec lap i lap lai
cac thao tac tao va huy bo chung trong cac hanh vi trang tr cua CEmpWnd se
lam lang ph tai nguyen cua he thong. Nen chuyen tat ca cac thao tac o ve
hai hanh vi OnCreate va OnDestroy cua CEmpWnd mot cach phu hp.
Ban hay th ap dung ieu lu y nay cho VD09.

6.5 ANH CHUYEN ONG TRONG VUNG CLIENT:
c thc hien mot cach n gian bang ky thuat hoat hnh. Ta chuan b
mot so anh c ban cua chuoi hoat ong o, sau o thc hien hien th va trao
anh theo trnh t vi khoang thi gian ch hp ly.
Cac anh trong noi dung hoat hnh c quan ly bi cong cu GDI thch hp:
CBitmap: Moi bitmap quan ly c mot anh. Ta dung nhieu bitmap.
Anh ve bang hanh vi DrawState cua oi tng DC quan ly thiet b hien
th. Kch thc anh hien th khong thay oi.
CDC: Long tat ca cac anh vao mot DC. T DC nay ta co the chep bat
ky phan anh can ve nao sang DC hien th. Co the thay oi kch thc
anh tuy y: StretchBlt.
CImageList: Lp oi tng quan ly tap hp nhieu anh co cung kch
thc. Kha nang thao tac tren danh sach anh cua CImageList la rat tot.
Trong phan nay ta xay dng ng dung vi hnh anh chu bm bay trong
vung client cua ca so. Tap tin butterfly.bmp trong th muc BMP cha cac
anh chuyen ong cua bm. Ta dung cach th 2, long cac anh vao DC va
ve len DC hien th. Cac bc thc hien d an nh sau:
Tao d an VD10 tng t d an VD09.
Bo sung bitmap resource vi so hieu IDB_ANIMATION ma noi dung
c lay t tap tin cha cac anh hoat hnh. Ghi nh so anh trong bitmap
o. Chang han, chon tap tin butterfly.bmp trong th muc BMP. Tap tin
nay co 4 anh, kch thc 32x28.
Bo sung cac oi tng thuoc tnh protected cho lp CEmpWnd:
- m_butterDC : oi tng CDC, quan ly DC long anh.
- m_butterBmp : oi tng CBitmap, quan ly cac anh hoat hnh.
- m_butterOldBmp : oi tng CBitmap*, quan ly con tro ch en
oi tng bitmap cu cua m_butterDC.
- m_pictNo : Kieu int, quan ly so th t cua hnh ang c
hien th trong cac anh hoat hnh noi tren.
Hanh vi OnCreate cua CEmpWnd thc hien cac chuan b:

int CEmpWnd::OnCreate( LPCREATESTRUCT lpCreateStruct )
66 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
{
if (CWnd::OnCreate(lpCreateStruct) ==-1)
return -1;

// TODO: Add your specialized creation code here
SetTimer( IDD_TIMER, 250, NULL );
m_myPict.LoadBitmap( IDB_MYPICT );
// Animation objects by EX10
m_butterBmp.LoadBitmap( IDB_ANIMATION );
m_butterDC.CreateCompatibleDC( NULL );
m_butterOldBmp =butterDC.SelectObject( &m_butterBmp );
m_pictNo =0;
return 0;
}

Hanh vi OnPaint ve hnh va t tang v tr chon hnh cho lan ve sau o:

memDrawDC.StretchBlt( 20, 50, 32, 28, &m_butterDC,
m_pictNo*32 , 0 , 32 , 28 , SRCCOPY );
m_pictNo++; // Chon anh ke tiep
if (m_pictNo >=4) m_pictNo =0;

Hanh vi OnDestroy huy bo cac thuoc tnh GDI:

m_butterDC.SelectObject(m_butterOldBmp);
m_butterBmp.DeleteObject();
m_butterDC.DeleteDC();

Nhan xet: Phan nen cua anh hoat hnh che khuat anh nen. e khac
phuc ta s dung mot anh bitmap lam mat na cho anh hoat hnh e an
nh phan noi dung c ve tren anh hoat hnh.

Hanh vi MaskBlt cua CDC cho phep dung monochrome bitmap lam li
loc anh iem phan noi cua anh khi chep anh t DC nguon len DC ch
(95/98/Me unsupported). Ban hay th thc hien vi VD10 nh bai tap.

6.6 CImageList - CONG CU QUAN LY BO ANH CUNG C:
Xay dng d an VD11 tren c s cai tien VD10; bo anh hoat hnh se c
quan ly bi oi tng CImageList:

Tao d an VD11 tng t d an VD10.
Bo sung oi tng thuoc tnh m_butterImg kieu CImageList lam nhiem
vu quan ly cac anh. Xoa cac thuoc tnh m_butterBmp, m_butterDC va
m_butterOldBmp v khong con can thiet.
ng dung cong cu GDI 67
Hanh vi OnCreate cua CEmpWnd thc hien cac chuan b nh sau:

int CEmpWnd::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
if (CWnd::OnCreate(lpCreateStruct) ==-1)
return -1;
// TODO: Add your specialized creation code here
SetTimer(IDD_TIMER, 250, NULL);
m_mypict.LoadBitmap(IDB_MYPICT);
// animation object by EX10
m_butterImg.Create(IDB_ANIMATION,32,4,RGB(255,255,255));
m_pictNo =0;
return 0;
}

Hanh vi OnPaint s dung hanh vi Draw cua m_butterImg ve anh:

m_butterImg.Draw( &memDrawDC, m_pictNo, CPoint(30, 170),
ILD_NORMAL);
m_pictNo++;
if (m_pictNo >=4) m_pictNo =0;
Hanh vi OnDestroy huy bo oi tng CImageList:


m_butterImg.DeleteImageList();


6.7 CRgn CA SO CO HNH DANG TUY Y:
Khuon dang cua region co the dung lam khuon dang cua ca so thong qua
hanh vi SetWindowRgn cua oi tng ca so. Phan sau ay minh hoa cho van
e tren va c cai at trong hanh vi OnCreate cua ca so (VD12).


CRgn newShape;
newShape.CreateEllipticRgn( 0, 0, 200, 100 );
SetWindowRgn( newShape, TRUE );


THC HANH:
1. Viet ng dung vi ca so giao dien chnh co hnh tam giac.
2. Viet ng dung vi ca so giao dien chnh co hnh ngoi sao nam canh.
3. Viet ng dung hien th noi dung cua nhieu anh theo th t luan phien. S
chuyen tiep gia hai anh bat ky c thc hien bang ky thuat pha tron anh.
4. Viet ng dung hien th anh cuon (scroll) t trai sang phai.
68 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
5. Viet ng dung hien th anh zoom t be en ln va ngc lai.
6. Viet ng dung hien th mot dong ch bat ky theo hnh anh cuon (scroll).
7. Viet ng dung vi hnh anh chu bm bay th than trong vung client.
8. Viet ng dung ScreenSaver va s dung no cho may tnh cua ban.
9. Viet ng dung vi man hnh chnh cha cac dong ch troi t ay len nh
man hnh, lien tuc en khi ket thuc ng dung.
HD: Tao DC ao va viet cac dong ch len DC nay. Sau o chep phan noi dung
thch hp cua DC ao sang DC thc.
- Chieu rong DC ao bang chieu rong DC thc. Chieu cao DC ao bang
chieu cao DC thc + 2 lan chieu cao mot dong ch tren DC.
- Viet cac dong ch hp le (toa o hien th nam trong gii han DC ao)
len DC ao. Sau moi lan hien th, tnh tien v tr ve len pha tren mot
oan tuy y, neu v tr tnh tien lam tat ca cac dong ch ri ra ngoai DC
ao th an nh lai v tr ay cuoi DC ao.
10. Chnh sa bai tap 9 nh sau:
- Hien th cac dong ch vi o sang giam dan t dong di len dong tren
e tao hieu ng 3 chieu.
- Tac vu chep s dung ham StretchBlt tren tng dong pixel e anh xa
anh ch nhat t DC ao thanh anh tam giac can tren DC thc.
Ket qua nhan c la hnh anh troi cac dong ch theo chieu th 3.
11. Viet ng dung vi man hnh chnh hien th "thien thach vu tru".
HD: Moi thien thach c quan ly bang toa o 3 gia tr (x, y, z).
- Toa o z tien dan ve pha ngi dung sau moi lan hien th.
- Toa o x, y tng ng thay oi theo z:
x = Hoanh o tam vung Client + x * 100 / z;
y = Tung o tam vung Client + y * 100 / z;
- o sang phu thuoc vao z.
- Dung hanh vi Circle cua DC e ve cac thien thach.
12. Ket hp hai bai tap 10 va 11 e co mot ng dung vi man hnh chnh nh
man hnh StarWar.
13. Dung lp oi tung CTime cua MFC e lay gi hien hanh cua he thong.
Thc hien ng dung hien th mot chiec ong ho analog (ong ho kim) chay
theo thi gian.
Menu & Phm tat 69
CHNG 7:

MENU & PHM TAT

7.1 NH NGHA:
Menu la he thong cac muc chon tng ng vi cac x ly xac nh. Thong
qua menu, ngi dung co the de dang an nh thc hien x ly mong muon.
Xem mot ng dung vi he thong menu nh sau:


- Game va Exit la cac muc chon cua menu bar.
- Muc chon Game gan vi mot menu popup co ba muc chon: Start,
Option, About va dau ngan cach muc (separator).

7.2 MENU RESOURCE:
e tien viec s dung va chnh sa menu trong chng trnh, VC cho phep
soan thao va lu cau truc menu vao resource cua ng dung mot cach oc lap,
phan chng trnh se dung cac lenh can thiet e nap va s dung menu.
Cach tao menu trong resource:
Tao mi menu resource: Thc hien tng t viec tao mi icon (2.8).
Lu y: Chon Resource Type la Menu.
at so hieu cho menu (v du IDR_MAINFRAME vi menu chnh).
Thiet ke menu thong qua man hnh thiet ke ma ta va nhan c t
bc tren. Cac thao tac c ban nh sau:
Cai at muc popup: Double-click (hoac go phm
Enter) tren v tr d nh cai at muc popup:
Ta nhan c hop hoi thoai Menu Item Properties:
70 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

- Caption: Noi dung thong bao. & dung at trc ky t phm tat.
- anh dau chon muc Pop-up. Cuoi cung, go Enter ket thuc.
Cai at muc lenh: Thc hien tng t nh tren nhng phan an nh
trong hop Menu Item Properties nh sau:

- Prompt: Noi dung giai thch (c hien th tren StatusBar) va noi
dung giai thch van tat (Tiptext tren thanh cong cu). Gia hai noi
dung nay c ngan cach bang ky t \n.
- ID: So hieu cua muc chon (menu-ID). Nen at ten gi nh.
Cai at dau ngan cach: Thc hien tng t nh tren. anh dau chon
Separator trong hop Menu Item Properties.
Chen muc vao gia cac muc chon a co: a vet sang en v tr
chen, sau o nhan phm Insert.
Xoa muc cai at: a vet sang en v tr xoa, go phm Delete.

Tao mi d an VD13 nh VD12, sau o thiet ke menu resource vi so
hieu IDR_MAINFRAME. So hieu cac muc chon lan lt la:
- Start = ID_GAME_START
- Option = ID_GAME_OPTION
- About = ID_GAME_ABOUT
- Exit = ID_EXIT
Menu & Phm tat 71
7.3 S DUNG MENU RESOURCE:
Menu resource la c s khi tao he thong menu dung trong ng dung. He
thong menu co the c gan vao ca so giao dien e tien s dung. Qua trnh
nay c thc hien thong qua cac bc sau:
Nap menu resource vao bo nh:
HMENU LoadMenu (
HINSTANCE hInstance, // Handle cua ng dung
LPCTSTR lpMenuName // Chuoi ten resource cua menu
); Ham tra ve handle cua menu trong bo nh.
- Gia tr handle cua ng dung nhan c t ham sau:
HINSTANCE AfxGetInstanceHandle( );
- Moi oi tng trong resource c nhan dien bang mot so hieu hoac
chuoi ten. Ham sau ay giup chuyen so hieu cua oi tng resource
sang chuoi ten tng ng:
LPTSTR MAKEINTRESOURCE( UINT resourceID );
Gan menu vi ca so giao dien: Dung handle cua menu lam tham so
cho hanh vi khi tao thong so CreateEx cua oi tng ca so. Hanh vi
InitInstance cua oi tng quan ly ng dung am nhan viec nay:

BOOL CEmpApp::InitInstance()
{
CEmpWnd *main =new CEmpWnd;
HICON myIcon =LoadIcon(IDR_MAINFRAME);
HCURSOR myCursor =LoadCursor(IDC_MAINFRAME);
CBrush myBrush;
CString myClassName ="Emp.WndClassName";
myBrush.CreateSolidBrush(RGB(190, 190, 0));
m_pMainWnd =main;
main->CreateEx( WS_EX_TOPMOST,
AfxRegisterWndClass( CS_VREDRAW | CS_HREDRAW,
myCursor, myBrush, myIcon ),
_T("Emp.Example 13"), WS_SYSMENU | WS_VISIBLE |
WS_MINIMIZEBOX | WS_THICKFRAME,
100, 100, 300, 200, NULL,
LoadMenu( AfxGetInstanceHandle(),
MAKEINTRESOURCE( IDR_MAINFRAME )) );
main->ShowWindow(SW_SHOW);
return TRUE;
}// Xem VD13 (he thong menu cha co x ly)
72 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
7.4 MUC X LY COMMAND MESSAGE T MUC CHON CUA MENU:
e muc chon cua menu co y ngha s dung ta phai cai x ly cho chung.
Khi ngi dung chon mot muc tren menu, he thong lap tc gi
WM_COMMAND en ng dung vi tham so wParam cha so hieu (ID) cua
muc menu c chon. Bat c oi tng nao trong ng dung co chc nang x
ly mesage eu co the am nhan viec x ly cac message nay.

Tiep theo, ta xay dng ng dung vi he thong menu nh VD13. Muc chon
About hien th hop thong bao gii thieu tac gia va san pham.

Tao d an VD14 nh VD13.
Dung lp CEmpWnd cai at
muc x ly message:
- Trong man hnh Workspace,
chon ClassView. Right-click
tren tieu e lp CEmpWnd:

- Chon Add Windows Message Handler...

- Chon so hieu ID_GAME_ABOUT, click chon COMMAND. Sau o
chon muc Add and Edit.
Menu & Phm tat 73

- at ten hanh vi x ly message WM_COMMAND. Chon OK.
- Noi dung cai at cua hanh vi nay nh sau:

void CEmpWnd::OnGameAbout()
{
MessageBox( "The program was written by Mr.EMP\n"
"This product is a not-licensed one.",
"About",
MB_OK | MB_ICONINFORMATION );
}
Xem bang MessageMap cua lp CEmpWnd, muc ID_GAME_ABOUT ?

7.5 PHM TAT (HOT KEY) CHO MUC CHON TREN MENU:
Phm tat la to hp phm cho phep th c hien nhanh mot muc chon xac nh
tren he thong menu. Cac phm tat c nh ngha trong phan resource cua
ng dung. Chng trnh se dung lenh e nap bang phm tat khi can.
Trong phan nay, ta viet ng dung tng t VD14 vi cac phm tat Ctrl+S,
Ctrl+P, Ctrl+A va Ctrl+E cho cac muc menu: Start, Option, About va Exit.
Tao d an VD15 tng t VD14.
Tao mi bang phm tat trong resource (Accelerator resource): Thc
hien tng t viec tao mi icon (2.8). Resource Type = Accelerator.
at so hieu cho Accelerator ( gia s la IDR_MAINFRAME ).
Thiet ke bang phm tat. Cac thao tac c ban nh sau:
Bo sung nh ngha phm tat: Double-click tren dong rong:


74 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
- ID : So hieu muc menu s dung phm tat.
- Key : Phm tat.
- Modifier : Cac phm he thong phoi hp.
- Type : ASCII Phm ky t ; VirtKey Phm bat ky.
Sau khi an nh xong go phm Enter.
Chnh sa nh ngha phm tat: Double-click tren dong phm tat,
ieu chnh cac thong tin can thiet. Go phm Enter e ket thuc.
Xoa nh ngha phm tat: Chon dong nh ngha phm, go phm Del.
Lu noi dung bang phm tat va ong man hnh soan thao phm tat.
S dung phm tat trong chng trnh: Thc hien tuan t hai bc sau:
Nap bang phm tat vao bo nh:
HACCEL LoadAccelerators (
HINSTANCE hInstance, // Handle cua ng dung
LPCTSTR lpTableName // Chuoi ten resource
); Ham tra ve handle cua bang phm tat trong bo nh.
Dch phm tat tren message nhan c t hang ch cua ng dung:
int TranslateAccelerator (
HWND hWnd, // Handle ca so giao dien dung phm tat
HACCEL hAccTable, // Handle cua bang phm tat
LPMSG lpMsg // Con tro bien cha message ieu phoi
); Ham nay phai c thc hien tren tat ca cac message ma ng
dung nhan c. Do o, no c long vao vong lap MessageLoop
cua ng dung. Lp CWinThread (xem 2.4) cho phep cai at ac tnh
nay thong qua hanh vi sau cua lp:
BOOL CWinThread::PreTranslateMessage( MSG *pMsg );
Trong cac lp ke tha CWinThread, cai at nay co bo cuc nh sau:

BOOL CEmpApp::PreTranslateMessage (MSG *pMsg)
{ // CEmpApp la lp ke tha CWinApp (t CWinThread)
// Thc hien ham dch tren message nhan c.
TranslateAccelerator( m_pMainWnd->m_hWnd,
m_hAccel, pMsg );
// m_hAccel : Handle cua bang phm tat.
return CWinApp::PreTranslateMessage( pMsg );
}

Ap dung cho d an VD15: Bo sung mot so thuoc tnh va hanh vi cho
lp CEmpApp:
Menu & Phm tat 75
- Thuoc tnh m_hAccel kieu HACCEL lu handle bang phm tat.
- Hanh vi InitInstance: Bo sung lenh nap bang phm tat va gi gia
tr handle cua no vao bien m_hAccel e s dung sau nay:

m_hAccel =LoadAccelerators( AfxGetInstanceHandle(),
MAKEINTRESOURCE( IDR_MAINFRAME ) );

- Hanh vi ke tha PreTranslateMessage co cai at nh tren.

7.6 LP QUAN LY MENU - CMenu:
e tien thao tac tren menu, MFC cung cap lp oi tng CMenu cho phep
quan ly menu thong qua cac thuoc tnh va hanh vi ac trng sau:
CMenu( ); Hanh vi tao lap oi tng menu.
BOOL LoadMenu( UINT nIDResource ); Khi tao thong so cho oi
tng menu t menu resource.
BOOL DestroyMenu( ); Huy bo oi tng menu.
BOOL DeleteMenu( UINT nPosition, UINT nFlags ); Xoa mot muc
chon trong menu. Bo gia tr (nPosition, nFlags) xac nh muc chon.
nFlags = MF_BYCOMMAND : nPosition la so hieu cua muc chon
(menu-ID).
= MF_BYPOSITION : nPosition la v tr th t cua muc
chon (em t 0).
BOOL AppendMenu (
UINT nFlags, // ac iem muc chon
UINT nIDNewItem = 0, // So hieu muc chon
LPCTSTR lpszNewItem=NULL // Chuoi thong bao cua muc
); Them muc chon vao cuoi he thong menu.
nFlags = MF_SEPARATOR : Cac tham so khac khong co y ngha.
= MF_STRING : Cac thong so c hieu nh tren.
= MF_POPUP : nIDNewItem la handle cua menu popup.
BOOL InsertMenu (
UINT nPosition, // V tr c chen.
UINT nFlags, // Cac thong tin khac
UINT nIDNewItem = 0, // tng t AppendMenu().
LPCTSTR lpszNewItem = NULL
); Chen them muc chon vao trc muc c ch bi nPosition.
UINT CheckMenuItem (
UINT nIDCheckItem, // So hieu | v tr muc chon
76 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
UINT nCheck // Cach thc anh dau muc chon
); anh dau hoac huy bo anh dau muc chon tren menu.
nCheck la gia tr ket hp cua hai noi dung:
- Cach anh dau muc: = MF_CHECKED : anh dau
= MF_UNCHECKED : Bo anh dau
- Cach ch nh muc: = MF_BYPOSITION : Theo v tr
= MF_BYCOMMAND : Theo so hieu muc
nIDCheckItem tng ng cha so hieu hoac v tr cua muc chon.
UINT EnableMenuItem (
UINT nIDEnableItem, // So hieu | v tr muc chon (nh tren)
UINT nEnable // Cach thc an nh muc chon.
); Cam hoac cho phep muc chon hoat ong.
nIDEnableItem la gia tr ket hp cua hai noi dung:
- Cach nh v muc chon: Nh tren.
- Trang thai muc: = MF_ENABLED : Cho phep muc hoat ong.
= MF_DISABLED : Cam muc hoat ong.
= MF_GRAYED : Che m muc chon.
int GetMenuString (
UINT nIDItem, // So hieu muc chon
CString& rString, // Tham bien nhan ket qua
UINT nFlags // Cach nh v muc chon
); Lay noi dung thong bao cua mot muc chon.
BOOL ModifyMenu (
UINT nPosition, // So hieu | v tr cua muc chon
UINT nFlags, // Cach nh v muc chon
UINT nIDNewItem = 0, // So hieu | vi tr mi cua muc chon
LPCTSTR lpszNewItem = NULL // Thong bao mi cua muc chon
); Thay oi cac thong so lien quan en muc chon.

Lu y: Hanh vi GetMenu cua CWnd tra ve con tro en oi tng menu
gan vi ca so. Gia tr tra ve = NULL neu ca so khong gan vi menu nao.

Gia s co yeu cau viet ng dung VD16 tng t VD15; trong o muc chon
Start t ong chuyen thanh Stop va ngc lai moi khi ngi dung chon
muc nay. Cong viec tren c thc hien thong qua muc x ly command
message ID_GAME_START. Ban hay th thc hien ng dung nay (xem
VD16).
7.7 X LY IEU KHIEN MUC CHON CUA MENU:
Menu & Phm tat 77
Trong phan nay, ta xay dng ng dung nh VD16. Khi chon muc Start
(Star Stop), ng dung khong cho phep ngi dung chon muc Option.
Cach th nhat: Cai at x ly cho muc chon Start ( Stop ) e thc hien
cam hoac cho phep muc chon Option mot cach phu hp.
Cach th hai: Dung trang thai hien hanh cua muc chon Start e quyet
nh cho phep hay cam hoat ong cua muc Option. Cach lam nay da
tren c che x ly ieu khien oi tng phat sinh command message la
muc Option. Thong tin trang thai cua muc Start c lu trong thuoc
tnh m_isStop. Thong qua gia tr nay, hanh vi x ly ieu khien chon gia
tr tham so thch hp dung cho hanh vi Enable cua oi tng CCmdUI
ch bi con tro lam tham so; TRUE (cho phep) , FALSE (cam). Cac
bc thc hien d an theo cach th hai nh sau:
Tao d an VD17 tng t VD16. Chnh sa lp CEmpWnd nh sau:
Bo sung thuoc tnh protected m_isStop kieu BOOL cho lp CEmpWnd.
Khong dung bien cuc bo isStop nh VD16, thay the bien nay bang
m_isStop, chnh sa cac lenh lien quan. Thong qua hanh vi OnCreate,
gan gia tr khi au cho m_isStop la FALSE.
Khai bao x ly ieu khien cho muc Option: Thc hien tng t muc
(7.4). Lu y chon so hieu muc chon ID_GAME_OPTION, sau o chon
UPDATE_COMMAND_UI. Cuoi cung chon Add and Edit.
at ten cho hanh vi x ly ieu khien. Cai at cua hanh vi nay nh sau:

void CEmpWnd::OnUpdateGameOption (CCmdUI* pCmdUI)
{
pCmdUI->Enable( !m_isStop ); // pCmdUI con tro tham so.
}

THC HANH:
1. T VD15, bo sung hanh vi PreTranslateMessage va cai at x ly s dung
bang phm tat cho lp CEmpWnd.
2. Cai at hanh vi x ly muc chon thoat (Exit) cho lp CEmpWnd.
HD: e cham dt ng dung, ta dung hanh vi PostMessage ma CEmpWnd
ke tha t CWnd e gi WM_QUIT en ca so cua no nh sau:
PostMessage( WM_QUIT, 0, 0 );
3. Thc hien yeu cau muc (7.7) bang cach th nhat.
78 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
CHNG 8:

Cac lp oi Tng nhap lieu

Lp oi tng nhap lieu, ke tha t lp CWnd, cho phep quan ly cac muc
nhap lieu (controls) tren ca so giao dien. Ca so cha cac control goi la ca
so cha. Hnh anh sau la mot ca so cha vi mot so loai control pho bien:



8.1 CStatic:
CStatic la lp oi tng quan ly muc thong bao hoac anh tren ca so giao
dien. Cac thuoc tnh va hanh vi ac trng cua lp nay nh sau:
CStatic( ); Tao lap oi tng rong.
BOOL Create (
LPCTSTR lpszText, // Noi dung thong bao cua muc
DWORD dwStyle, // Thong so dang muc thong bao
const RECT& rect, // Toa o, kch thc cua muc
CWnd* pParentWnd, // Con tro oi tng ca so cha
Cac lp oi tng nhap lieu 79
UINT nID = 0xFFFF // So hieu muc thong bao, duy nhat.
); Khi tao thong so cho oi tng muc thong bao.
dwStyle: Phai cha cac thong so qui nh oi vi control:
WS_CHILD | WS_VISIBLE [ | WS_DISABLED ]
va cac thong so bo sung cho ac trng cua muc nh sau:
SS_BITMAP : Co chc nang hien th anh bitmap.
SS_ICON : Co chc nang hien th anh icon hoac cursor.
SS_xxx : Mot so thong so khac, xem MSDN.
Mau nen oi tng CStatic do MFC ang ky, muon thay oi phai
xay dng lp ke tha CStatic, cai at hanh vi PreCreateWindow.
HBITMAP SetBitmap (
HBITMAP hBitmap // Handle cua anh bitmap
); Dung anh bitmap lam noi dung cua muc thong bao.
HBITMAP GetBitmap ( ); Tra ve handle cua anh bitmap ang dung.
HICON SetIcon (
HICON hIcon // Handle cua icon
); Dung icon lam noi dung cua muc thong bao.
HICON GetIcon( ); Tra ve handle cua icon ang dung.
HCURSOR SetCursor (
HCURSOR hCursor // Handle cua cursor
); Chon cursor cho muc thong bao. Windows lay cursor nay lam hnh
dang con chuot khi no di chuyen vao vung gii han cua muc.
HCURSOR GetCursor( ); Tra ve handle cua cursor ang dung.
Co the dung hanh vi CreateEx (lp CStatic ke tha t CWnd) khi tao
thong so muc thong bao vi dang m rong (WS_EX_xxx). Trong trng
hp nay, gia tr cho tham so lpszClassName la _T("STATIC").
Phan nay, ta thc hien ng dung VD18 tng t VD15; cai at hai muc
thong bao tren ca so giao dien chnh: muc th nhat co noi dung "My Icon
is", muc th hai hien th icon cua ng dung.
Dung hai oi tng thuoc lp CStatic e tao va quan ly hai muc thong
bao. oi tng CEmpWnd lay chung lam thuoc tnh e tien quan ly.
D an c thc hien qua cac bc sau:
Tao d an VD18 tng t VD15. Chnh sa lp CEmpWnd nh sau:
Bo sung hai oi tng thuoc tnh protected: m_staticIcon va
m_staticText co kieu CStatic.
Hanh vi OnCreate thc hien khi tao thong so cho hai oi tng nay:
80 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
int CEmpWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) ==-1)
return -1;
m_staticText.Create( _T("This is my Icon:"),
WS_CHILD|WS_VISIBLE,
CRect(10, 15, 120, 35), this );
m_staticIcon.Create( _T(""),
WS_CHILD | WS_VISIBLE | SS_ICON,
CRect( 125,7,157,39 ), this );
m_staticIcon.SetIcon (
AfxGetApp()->LoadIcon(IDR_MAINFRAME) );
return 0;
}
Bien dch va chay th ng dung.

8.2 CEdit:
CEdit la lp oi tng quan ly hop nhap tren ca so giao dien. Ngoai viec
ho tr x ly cac hoat ong nhap lieu, CEdit co kha nang thong tin cho ca so
cha cua hop nhap ve tnh hnh nhap lieu ang dien ra trong hop.
CEdit( ); Tao lap oi tng rong.
BOOL Create (
DWORD dwStyle, // Thong so dang hop nhap
const RECT& rect, // Toa o va kch thc hop nhap
CWnd* pParentWnd, // Con tro oi tng ca so cha
UINT nID // So hieu hop nhap, phai duy nhat
); Khi tao thong so cho oi tng hop nhap lieu.
dwStyle: Gom thong so qui nh oi vi control va cac dang bo sung:
ES_MULTILINE : Hop nhap cho phep nhieu dong.
ES_PASSWORD : Hop nhap dung nhap password.
ES_READONLY : Hop nhap ch xem noi dung.
ES_xxx : Xem thong tin trong MSDN.
void GetRect (
LPRECT lpRect // Con tro en bien RECT cha ket qua
); Lay thong tin ve toa o, kch thc hop nhap.
BOOL GetModify( ); Tra ve TRUE neu noi dung hop nhap thay oi.
void SetModify( BOOL bModified = TRUE ); Xac lap hoac xoa c
hieu ghi nhan s thay oi noi dung trong hop nhap.
Cac lp oi tng nhap lieu 81
void SetMargins (
UINT nLeft, // Le trai va
UINT nRight // le phai tnh bang pixel
); An nh bien trai va bien phai cua hop nhap.
DWORD GetMargins( ); Tra ve gia tr cha thong tin bien trai (WORD
thap) va bien phai (WORD cao) cua hop nhap.
void GetSel (
int& nStartChar, // Bien cha v tr ky t au tien va
int& nEndChar // ky t cuoi cung cua oan van ban.
); Lay thong tin ve oan van ban ang c anh dau trong hop nhap.
void SetSel (
int nStartChar, // V tr ky t au tien
int nEndChar, // V tr ky t cuoi cung cua oan van ban
BOOL bNoScroll = FALSE
); anh dau mot oan van ban trong hop nhap.
BOOL SetReadOnly( BOOL bReadOnly = TRUE ); Xac lap trang thai
ch xem oi vi d lieu cua hop nhap.
void Copy( ); Chep noi dung oan van ban ang c anh dau trong
hop nhap vao vung nh he thong (clipboard).
void Paste( ); Chen noi dung van ban trong clipboard vao hop nhap bat
au t v tr ang chon (hoac v tr dau carret).
void Clear( ); Xoa noi dung oan van ban ang c anh dau.
void Cut( ); Thc hien cac thao tac Copy va Clear.
void SetPasswordChar (
TCHAR ch // Ky t c chon
); at ky t che cho noi dung cua password trong hop nhap.
int GetLineCount( ); Tra ve so dong van ban trong hop nhap.
int GetLine (
int nIndex, // Ch so dong van ban trong hop nhap
LPTSTR lpszBuffer, // Vung em cha ket qua
int nMaxLength // Chieu dai vung em
); Lay noi dung mot dong van ban trong hop nhap.
int GetFirstVisibleLine( ); Tra ve ch so dong van ban c nhn thay
au tien trong hop. Cac dong trc dong nay trong noi dung van ban
la b che khuat.
82 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
int LineFromChar (
int nIndex = -1 // Ch so ky t. 1 la ky t cuoi cung.
); Tra ve ch so dong van ban cha ky t (Hop nhap co nhieu dong).
int LineIndex (
int nLine = -1 // Ch so dong van ban, -1 la dong cuoi cung
); Tra ve ch so cua ky t au tien trong dong van ban lam tham so.
int LineLength (
int nLine = -1 // Ch so dong. 1 la dong ang cha carret.
); Tra ve so ky t trong noi dung cua dong van ban.
CPoint PosFromChar (
UINT nChar // Ch so ky t trong hop nhap
); Tra ve toa o iem goc trai tren cua ky t.
int CharFromPos (
CPoint pt // Toa o cua iem
); Tra ve ch so cua ky t gan iem ang xet nhat.
void LineScroll (
int nLines, // So dong cuon doc, < 0 la cuon xuong.
int nChars = 0 // So ky t cuon ngang, < 0 la cuon trai.
); Cuon noi dung van ban ang hien th trong hop nhap.

Hop nhap va ca so cha: oi tng hop nhap co the gi message en ca
so cha e thong bao tnh hnh nhap lieu trong hop. Ca so cha nh hng
x ly cac message thong qua muc x ly message co dang nh sau:
ON_Notification ( ID, memberFxn )
Trong o: - ID : So hieu muc oi tng edit
- memberFxn : Ten hanh vi x ly message, khai bao nh sau:
afx_msg void memberFxn( void );
ON_Notification co the la mot trong cac muc x ly cu the sau:

Muc x ly message Y ngha cua message c x ly
ON_EN_CHANGE Noi dung edit ang thay oi.
ON_EN_HSCROLL Ngi dung click chon thanh trt ngang.
ON_EN_VSCROLL Ngi dung click chon thanh trt doc.
ON_EN_KILLFOCUS Edit cham dt hoat ong.
ON_EN_MAXTEXT Noi dung vt qua chieu dai cho phep.
ON_EN_SETFOCUS Edit bat au hoat ong.
ON_EN_UPDATE D lieu nhap ang c cap nhat cho edit.
Cac lp oi tng nhap lieu 83
Thc hanh 1: Viet ng dung vi muc thong bao "Enter your name:" va hop
nhap d lieu ben canh tren man hnh giao dien chnh.
Tao d an VD19 tng t VD18. Chnh sa CEmpWnd nh sau:
Bo sung hai thuoc tnh protected: m_staticName kieu CStatic va
m_editName kieu CEdit.
Trong hanh vi OnCreate, thc hien khi tao hai oi tng nay:

int CEmpWnd::OnCreate (LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) ==-1)
return -1;
m_staticName.Create( _T("Enter your name:" ),
WS_CHILD | WS_VISIBLE,
CRect(10, 75, 130, 95), this );
m_editName.Create( WS_CHILD | WS_VISIBLE | WS_BORDER,
CRect(135, 75, 280, 95), this, -1 );
return 0;
}

Thc hanh 2: Chnh sa ng dung e khi ngi dung sa ten trong hop
nhap th noi dung nay lap tc chuyen len lam tieu e cua ca so chnh.
HD: Ca so cha co hanh vi x ly message thong bao s thay oi d lieu
trong hop nhap thong qua muc x ly message ON_EN_CHANGE.
Tao d an VD20 tng t VD19, Chnh sa lp CEmpWnd nh sau:
Bo sung hanh vi x ly: afx_msg void OnYourNameChange()

void CEmpWnd::OnYourNameChange ()
{
CString yourname;
m_editName.GetWindowText(yourname);
SetWindowText(yourname);
}

Tao mi so hieu resource: IDC_YOURNAME, dung gia tr nay lam so
hieu cho oi tng m_editName. Trong hanh vi OnCreate:

int CEmpWnd::OnCreate ( LPCREATESTRUCT lpCreateStruct )
{
if (CWnd::OnCreate(lpCreateStruct) ==-1) return -1;
m_staticName.Create ( _T("Enter your name:"),
WS_CHILD | WS_VISIBLE,
CRect( 10, 75, 130, 95 ), this );
84 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
m_editName.Create( WS_CHILD | WS_VISIBLE | WS_BORDER,
CRect( 135, 75, 280, 95 ), this, IDC_YOURNAME );
return 0;
}

Trong bang MessageMap, bo sung muc x ly message:

BEGIN_MESSAGE_MAP(CEmpWnd, CWnd)
//{{AFX_MSG_MAP(CEmpWnd)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_PAINT()
//}}AFX_MSG_MAP
ON_EN_CHANGE( IDC_YOURNAME, OnYourNameChange )
END_MESSAGE_MAP()

8.3 CButton:
CButton la lp oi tng quan ly nut chon tren ca so giao dien. Trong
windows, cac nut chon co the hoat ong oc lap hay theo nhom.
CButton( ); Tao lap oi tng nut chon rong.
BOOL Create (
LPCTSTR lpszCaption, // Noi dung thong bao
DWORD dwStyle, // Thong so dang nut (BS_PUSHBUTTON)
const RECT& rect, // Toa o, kch thc nut chon
CWnd* pParentWnd, // Con tro ca so cha
UINT nID // So hieu nut chon
); Khi tao thong so cho oi tng nut chon.
HBITMAP GetBitmap( ) const ; Handle cua anh bitmap ang dung.
HBITMAP SetBitmap(HBITMAP hBitmap); Gan anh bitmap vao nut.
HICON GetIcon( ) const; Handle cua icon ang dung.
HICON SetIcon( HICON hIcon ); Gan icon vao nut.
virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );
Hanh vi ke tha e thc hien trang tr rieng tren nut chon.

Nut chon va ca so cha: Nut chon co the gi message en ca so cha.
Muc ON_Notification ma ca so cha dung x ly message t nut chon la:

Muc x ly message Y ngha cua message c x ly
ON_BN_CLICKED Ngi dung click tren nut.
ON_BN_DOUBLECLICKED Ngi dung double-click tren nut
Muc bo sung
Cac lp oi tng nhap lieu 85
Thc hanh 1: Viet ng dung nh VD19. Bo sung nut chon "Nhap xong",
ma khi chon, se dung hop thong bao e hien th noi dung va nhap.
Tao d an VD21 nh VD19. Chnh sa cho CEmpWnd nh sau:
Bo sung hanh vi x ly: afx_msg void OnClickNhapxong()

void CEmpWnd::OnClickNhapxong ()
{
CString yourname;
m_editName.GetWindowText( yourname );
MessageBox ( yourname, "Hello !",
MB_OK | MB_ICONEXCLAMATION );
}

Khai bao ID resource: IDC_NHAPXONG, bo sung oi tng thuoc tnh
protected m_buttonNhapxong kieu CButton. Trong OnCreate:

int CEmpWnd::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
if (CWnd::OnCreate(lpCreateStruct) ==-1)
return -1;
m_staticName.Create( _T("Enter your name:"),
WS_CHILD | WS_VISIBLE,
CRect(10, 75, 130, 95), this );
m_editName.Create( WS_CHILD | WS_VISIBLE | WS_BORDER,
CRect( 135, 75, 280, 95 ), this, -1 );
m_buttonNhapxong.Create (
_T("Nhap xong"), WS_CHILD | WS_VISIBLE,
CRect(10, 115, 90, 140), this, IDC_NHAPXONG );
return 0;
}

Trong bang MessageMap cua CEmpWnd, bo sung muc x ly message:


ON_BN_CLICKED ( IDC_NHAPXONG , OnClickNhapxong )


8.4 CListBox:
CListbox la lp oi tng quan ly hop nhap cha danh sach cac muc chon
tren ca so giao dien. Tuy theo loai listbox ma khi s dung, ngi dung c
phep anh dau chon mot hoac nhieu muc ong thi trong listbox.
CListBox( ); Tao lap oi tng rong.
86 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
BOOL Create (
DWORD dwStyle, // Thong so an nh dang listbox
const RECT& rect, // Toa o, kch thc cua listbox
CWnd* pParentWnd, // Con tro oi tng ca so cha
UINT nID // So hieu cua listbox
); Khi tao thong so cho oi tng ListBox.
dwStyle: Gom thong so qui nh oi vi control va cac dang bo sung:
LBS_MULTIPLESEL : Cho phep chon nhieu muc ong thi
LBS_NOTIFY : Thong tin cho ca so cha
LBS_SORT : Cac muc c xep th t
LBS_MULTICOLUMN : Co nhieu cot cha cac muc
LBS_STANDARD : = LBS_NOTIFY | LBS_SORT
int GetCount( ); Tra ve so muc chon trong Listbox.
int GetCurSel( ); Tra ve ch so cua muc c chon (single).
int SetCurSel (
int nSelect // Ch so muc c chon
); An nh muc chon trong listbox.
int GetSelCount( ); Tra ve so muc c chon trong mot listbox. Ch
dung cho listbox cho phep chon nhieu muc.
int GetSelItems (
int nMaxItems, // So muc c chon va
LPINT rgIndex // mang cha cac ch so cua chung
); Lay ch so cua cac muc c chon trong listbox.
int AddString (
LPCTSTR lpszItem // Thong bao cua muc
); Them mot muc vao listbox. Neu listbox khong co ac tnh xep th t
th muc mi them c at vao cuoi danh sach cac muc.
int DeleteString (
UINT nIndex // Ch so cua muc b xoa
); Xoa mot muc trong listbox.
int InsertString (
int nIndex, // V tr chen, -1 la v tr cuoi listbox
LPCTSTR lpszItem // Thong bao cua muc
); Chen mot muc vao listbox tai v tr xac nh.
void ResetContent( ); Xoa tat ca cac muc hien co trong listbox, lam
rong noi dung listbox quan ly bi oi tng.
Cac lp oi tng nhap lieu 87
virtual void DrawItem (
LPDRAWITEMSTRUCT lpDrawItemStruct
); Hanh vi ke tha nham thc hien trang tr cac muc theo cach rieng.
virtual void MeasureItem (
LPMEASUREITEMSTRUCT lpMeasureItemStruct
); Lay thong tin lam c s cho viec t trang tr cac muc trong listbox.
virtual void DeleteItem (
LPDELETEITEMSTRUCT lpDeleteItemStruct
); Hanh vi ke tha e tuy nghi x ly khi mot muc b xoa khoi listbox.
virtual int VKeyToItem (
UINT nKey, // Ma phm (virtual key) c go
UINT nIndex // Ch so muc hien hanh trong listbox
); Hanh vi ke tha cho phep tuy nghi x ly tren phm.
virtual int CharToItem (
UINT nKey, // Ma phm (character) c go
UINT nIndex // Ch so muc hien hanh trong listbox
); Hanh vi ke tha cho phep tuy nghi x ly phm ky t.

ListbBox va ca so cha: ListBox vi thong so dang LBS_NOTIFY co the
gi message en ca so cha e thong bao tnh trang hoat ong cua no.
Muc ON_Notification ma ca so cha dung x ly message t listbox la:

Muc x ly message Y ngha cua message c x ly
ON_LBN_DBLCLK Ngi dung double-click tren listbox.
ON_LBN_KILLFOCUS Ket thuc hoat ong nhap.
ON_LBN_SELCANCEL Huy bo thao tac chon.
ON_LBN_SELCHANGE Thay oi muc chon trong listbox.
ON_LBN_SETFOCUS Bat au nhap lieu tren listbox.
ON_WM_CHARTOITEM Dung cho ownerDraw listbox.
ON_WM_VKEYTOITEM X ly WM_KEYDOWN

Thc hanh: Viet ng dung tng t VD21, them listbox co ba muc chon:
"Ong A", "Ba B" va "Co C". Khi ngi dung click chon mot muc trong
listbox th noi dung cua muc ay c ien vao hop nhap Name.
HD: Dung ON_LBN_SELCHANGE nh hng x ly message lien quan.

Tao ng dung VD22 nh VD21. Chnh sa lp CEmpWnd nh sau:
Bo sung hanh vi protected: afx_msg void OnSelectDanhsach()
void CEmpWnd::OnSelectDanhsach()
88 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
{
CString info;
int iSel =m_listboxDanhsach.GetCurSel();
if (iSel ==LB_ERR) // Khong co la chon
iSel =0; // Xem nh chon muc au tien
m_listboxDanhsach.GetText( iSel, info );
m_editName.SetWindowText( info );
}

Khai bao ID resource: IDC_DANHSACH, thuoc tnh protected
m_listboxDanhsach kieu CLisBox quan ly listbox.
Hanh vi OnCreate thc hien cac khi tao can thiet cho listbox.

int CEmpWnd::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
if (CWnd::OnCreate(lpCreateStruct) ==-1) return -1;
... // Thc hien tng t d an VD21,
// Va bo sung cac noi dung sau:
m_listboxDanhsach.Create (
WS_CHILD | WS_VISIBLE | WS_BORDER |
LBS_NOTIFY | WS_VSCROLL,
CRect( 195, 7, 280, 65 ), this, IDC_DANHSACH );
m_listboxDanhsach.AddString( "Ong A" );
m_listboxDanhsach.AddString( "Ba B" );
m_listboxDanhsach.AddString( "Co C" );
return 0;
}

Trong MessageMap cua CEmpWnd, bo sung muc x ly message:

ON_LBN_SELCHANGE( IDC_DANHSACH, OnSelectDanhsach )


8.5 CComboBox:
CComboBox la lp oi tng quan ly hop nhap va phan ho tr nhap vi
danh sach cac muc thong tin cho trc. Cach ket hp gia hop nhap va danh
sach ho tr tao thanh cac dang khac nhau cua comboBox:
- Drop-list : Gia tr nhap ch c chon t danh sach.
- Simple : Nh Drop-list ma danh sach hien th thng trc.
- Drop-down : Nh Drop-list va co the nhap noi dung mi.
CComboBox( ); Tao lap oi tng rong.
Cac lp oi tng nhap lieu 89
BOOL Create (
DWORD dwStyle, // Cha thong so ve dang cua comboBox
const RECT& rect, // Toa o, kch thc comboBox
CWnd* pParentWnd, // Con tro oi tng ca so cha
UINT nID // So hieu comboBox
); Khi tao thong so cho oi tng comboBox.
dwStyle: Gom thong so qui nh oi vi control va cac dang bo sung:
CBS_DROPDOWNLIST : Drop-list comboBox.
CBS_SIMPLE : Simple comboBox.
CBS_DROPDOWN : Drop-Down comboBox.
CBS_SORT : Danh sach cac muc xep th t.
int GetCount( ); Tra ve so muc chon trong comboBox.
int GetCurSel( ); Tra ve ch so muc c chon trong comboBox.
int SetCurSel( int nSelect ); An nh muc chon trong comboBox.
void GetLBText (
int nIndex, // Ch so muc trong comboBox
CString& rString // Bien cha ket qua
); Lay noi dung thong bao cua mot muc trong comboBox.
void ShowDropDown (
BOOL bShowIt = TRUE // TRUE = hien th ; FALSE = dau
); Hien th hoac danh sach cha cac muc ho tr trong comboBox.
int AddString(LPCTSTR lpszString ); Nh listbox.
int DeleteString( UINT nIndex ); Nh listbox.
int InsertString( int nIndex , LPCTSTR lpszString ); Nh listbox.
void ResetContent( ); Nh listbox.
virtual void DrawItem (
LPDRAWITEMSTRUCT lpDrawItemStruct
); Nh listbox.
virtual void MeasureItem (
LPMEASUREITEMSTRUCT lpMeasureItemStruct
); Nh listbox.
virtual void DeleteItem (
LPDELETEITEMSTRUCT lpDeleteItemStruct
); Nh listbox.
90 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
ComboBox va ca so cha: oi tng comboBox co the gi message en
ca so cha e thong bao tnh hnh hoat ong cua no. Muc x ly message
ON_Notification ma ca so cha dung x ly message t comboBox la:

Muc x ly message Y ngha cua message c x ly
ON_CBN_CLOSEUP Danh sach va c ong lai
ON_CBN_DBLCLK Double-click tren muc chon
ON_CBN_DROPDOWN Danh sach va c m ra
ON_CBN_EDITCHANGE Noi dung hop nhap ang thay oi
ON_CBN_EDITUPDATE Sap cap nhat noi dung hop nhap
ON_CBN_SELENDCANCEL Bo qua viec thay oi muc chon.
ON_CBN_SELENDOK Mot muc trong danh sach c chon
ON_CBN_KILLFOCUS Ket thuc nhap lieu trong comboBox
ON_CBN_SELCHANGE Thay oi muc chon trong danh sach
ON_CBN_SETFOCUS Bat au nhap lieu trong comboBox

Thc hanh: Viet ng dung tng t VD22, Bo sung combobox kieu
dropdown co ba muc chon: "Vo van A", "Nguyen thi B" va "Tran thi C".
Khi chon tren combobox, noi dung chon c ien vao hop nhap Name.
HD: Dung ON_CBN_SELCHANGE nh hng x ly message lien quan.

Tao d an VD23 tng t VD22. Chnh sa lp CEmpWnd nh sau:
Bo sung hanh vi protected: afx_msg void OnSelectCombobox ()

void CEmpWnd::OnSelectCombobox()
{
CString info;
int iSel =m_Combobox.GetCurSel( );
if (iSel ==LB_ERR) // no selection
iSel =0;
m_Combobox.GetLBText( iSel, info );
m_editName.SetWindowText( info );
}

Khai bao ID resource: IDC_COMBOBOX. Khai bao oi tng thuoc
tnh protected m_Combobox kieu CComboBox quan ly comboBox.
Hanh vi OnCreate thc hien cac khi tao can thiet cho comboBox:

int CEmpWnd::OnCreate (LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) ==-1) return -1;

Cac lp oi tng nhap lieu 91
... // Nh VD22, bo sung cac noi dung sau:
m_Combobox.Create (
WS_CHILD | WS_VISIBLE | WS_BORDER |
CBS_DROPDOWNLIST,
CRect( 135, 100, 280, 225 ), this,
IDC_COMBOBOX );
m_Combobox.AddString( "Vo van A" );
m_Combobox.AddString( "Nguyen thi B" );
m_Combobox.AddString( "Tran thi C" );
return 0;
}

Trong MessageMap cua CEmpWnd, khai bao muc x ly message:


ON_CBN_SELCHANGE( IDC_COMBOBOX,OnSelectCombobox )


8.6 CSpinButtonCtrl:
CSpinButtonCTrl la lp oi tng quan ly nut tang-giam tren ca so giao
dien. Nut tang-giam c dung ho tr cho cac hop nhap so nguyen.
CSpinButtonCtrl( ); Tao lap oi tng rong.
BOOL Create (
DWORD dwStyle, // Cha thong so dang nut tang giam
const RECT& rect, // Toa o, kch thc. Khong bat buoc.
CWnd* pParentWnd, // Con tro oi tng ca so cha
UINT nID // So hieu nut tang giam
); Khi tao thong so cho oi tng nut tang giam.
dwStyle: Gom thong so qui nh oi vi control va cac dang bo sung:
UDS_HORZ : Hai nut tang-giam nam ngang
UDS_SETBUDDYINT : Dung cho hop nhap so nguyen.
UDS_ALIGNRIGHT : Nam ben phai hop nhap.
UDS_ALIGNLEFT : Nam ben trai hop nhap.
UDS_ARROWKEYS : Dung cac phm , e tang-giam.
CWnd* SetBuddy (
CWnd* pWndBuddy // Con tro oi tng c ho tr.
); An nh oi tng hop nhap ma nut tang-giam nay se ho tr. Hanh vi
tra ve con tro oi tng hop nhap c ho tr trc o.
CWnd* GetBuddy( ); Tra ve con tro oi tng hop nhap c ho tr.
92 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
void SetRange (
int nLower, // Gia tr can di
int nUpper // Gia tr can tren.
); An nh gii han bien thien cua nut tang-giam.
void GetRange (
int &lower, // Tham bien cha gia tr can di
int& upper // Tham bien cha gia tr can tren
); Lay thong tin ve gii han cua nut tang-giam.
int SetPos( int nPos ); at gia tr cho nut tang-giam.
int GetPos( ); Tra vegia tr hien tai cua nut tang-giam.

Thc hanh: Viet ng dung tng t VD21; muc thong bao "Enter your
age:" va hop nhap tuoi. Hop nhap c ho tr cua nut spin co gii han 15-
250. Nut chon "Nhap xong" cho phep hien th ten va tuoi va nhap.

Tao d an VD24 tng t VD21. Chnh sa lp CEmpWnd nh sau:
Khai bao thuoc tnh m_editAge kieu CEdit quan ly hop nhap.
Hanh vi OnCreate thc hien khi tao thong so cho cac muc. Rieng muc
thong bao va nut spin, do khong co yeu cau truy xuat nen cac oi tng
quan ly chung se c khai bao static trong OnCreate:

int CEmpWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) ==-1) return -1;
... // Tng t VD21, va cac noi dung bo sung sau:
m_editAge.Create (
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_NUMBER,
CRect( 135, 45, 190, 65 ), this, -1 );

static CStatic m_staticAge;
static CSpinButtonCtrl m_spinAge;
m_staticAge.Create ( _T( "Enter your age:" ),
WS_CHILD | WS_VISIBLE,
CRect( 10, 45, 130, 65 ), this );
m_spinAge.Create ( WS_CHILD | WS_VISIBLE |
UDS_ARROWKEYS | UDS_SETBUDDYINT | UDS_ALIGNRIGHT,
CRect(0,0,1,1), this, -1 );
m_spinAge.SetBase( 1 ); m_spinAge.SetRange( 15, 250 );
m_spinAge.SetBuddy ( &m_editAge );
return 0;
}
Cac lp oi tng nhap lieu 93
Hanh vi OnClickNhapxong thc hien hien th thong tin nhap:

void CEmpWnd::OnClickNhapxong( )
{
CString yourname, yourage, mess;
m_editName.GetWindowText( yourname );
m_editAge.GetWindowText( yourage );
mess.Format ( "%s\n is %s years old", yourname, yourage );
MessageBox( mess,"Hello!", MB_OK | MB_ICONEXCLAMATION );
}

8.7 CProgressCtrl:
CProgressCtrl la lp oi tng quan ly thanh tien o x ly tren giao dien.
CProgressCtrl( ); Tao lap oi tng rong.
BOOL Create (
DWORD dwStyle, // Thong so dang thanh tien o x ly
const RECT& rect, // Toa o, kch thc cua thanh
CWnd* pParentWnd, // Con tro oi tng ca so cha
UINT nID // So hieu cua thanh tien o
); Hanh vi khi tao thong so cho thanh tien o tren giao dien.
dwStyle: Gom thong so qui nh oi vi control va cac dang bo sung:
PBS_VERTICAL : Thanh tien o nam thang ng.
PBS_SMOOTH : Ch muc tien o la dai mau (xanh) lien tuc.
void SetRange (
short nLower, // Gia tr nho nhat
short nUpper // Gia tr ln nhat
); An nh gii han tien o x ly ch bi thanh tien o.
void GetRange(
int& nLower, // Bien cha gia tr nho nhat
int& nUpper // Bien cha gia tr ln nhat
); Lay thong tin ve gii han tien o x ly ch bi thanh tien o.
int SetPos( int nPos ); An nh v tr hien tai cua thanh tien o.
int GetPos( ); Tra ve v tr hien tai cua thanh tien o x ly.
int OffsetPos( int nPos ); An nh mc tang (giam) tren mot n v cua
ch muc tien o trong thanh tien o bang nPos, ong thi cap nhat trang
thai hien th cua thanh tien o theo gia tr an nh mi.
int StepIt( ); Thay oi ch muc tien o mot n v.
94 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
8.8 CScrollBar:
CScrollBar la lp oi tng quan ly thanh cuon tren ca so giao dien.
CScrollBar( ); Tao lap oi tng rong.
BOOL Create (
DWORD dwStyle, // Thong so dang cua thanh cuon
const RECT& rect, // Toa o, kch thc cua thanh cuon
CWnd* pParentWnd, // Con tro oi tng ca so cha
UINT nID // So hieu thanh cuon
); Khi tao thong so cho oi tng thanh cuon tren giao dien.
dwStyle: Gom thong so qui nh oi vi control va cac dang bo sung:
SBS_HORZ : Thanh cuon at ngang (horizontal)
SBS_VERT : Thanh cuon at ng (vertical)
int GetScrollPos( ); Tra ve v tr hien thi cua mot thanh cuon.
int SetScrollPos (
int nPos, // V tr at nut cuon
BOOL bRedraw = TRUE // Cap nhat lai hnh anh thanh cuon
); at v tr nut cuon tren thanh cuon.
void SetScrollRange (
int nMinPos, // Gia tr nho nhat
int nMaxPos, // Gia tr ln nhat
BOOL bRedraw = TRUE // Cap nhat lai thanh cuon
); An nh gii han v tr au va cuoi cua nut cuon tren thanh cuon.
void GetScrollRange (
LPINT lpMinPos, // Cha v tr au
LPINT lpMaxPos // Cha v tr cuoi
); Lay gia tr gii han v tr au va cuoi cua nut cuon tren thanh cuon.
void ShowScrollBar ( BOOL bShow = TRUE ); Bat / Tat thanh cuon.

ScrollBar va ca so cha: oi tng scrollbar gi WM_HSCROLL (oi vi
loai scrollbar ngang) hoac WM_VSCROLL (oi vi loai scrollbar ng)
en ca so cha e thong bao trang thai hien thi cua no. Cac hanh vi
OnVScroll hoac OnHScroll cua oi tng CWnd quan ly ca so cha se x
ly cac message tng ng noi tren.

Thc hien ng dung nh VD15. Bo sung thanh cuon, va muc thong bao e
hien th v tr nut cuon khi ngi dung tac ong len thanh cuon.

Tao d an VD24A nh d an VD15. Chnh sa lp CEmpWnd nh sau:
Cac lp oi tng nhap lieu 95
Khai bao cac thuoc tnh protected: m_staticScroll kieu CStatic quan ly
muc thong bao, m_Scroll kieu CScrollBar quan ly thanh cuon.
Hanh vi OnCreate thc hien khi tao thong so cho cac muc:
int CEmpWnd::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
if (CWnd::OnCreate(lpCreateStruct) ==-1) return -1;
m_staticScroll.Create( _T(""),
WS_CHILD | WS_VISIBLE,
CRect( 10, 15, 120, 35 ), this );
m_Scroll.Create( WS_CHILD | WS_VISIBLE | SBS_HORZ,
CRect( 10,45,127,65 ), this, IDC_SCROLLBAR );
m_Scroll.SetScrollRange( 0,100 );
return 0;
}
Hanh vi OnHScroll x ly WM_HSCROLL:
void CEmpWnd::OnHScroll( UINT nSBCode, UINT nPos,
CScrollBar* pScrollBar )
{ char s[10];
int pos =nPos;
switch (nSBCode) {
case SB_LINELEFT:
pos =pScrollBar->GetScrollPos() - 1;
if (pos <0) pos =0;
pScrollBar->SetScrollPos( pos );
sprintf( s, "%d", pos ); m_staticScroll.SetWindowText(s);
break;
case SB_LINERIGHT:
pos =pScrollBar->GetScrollPos() +1;
if (pos >90) pos =100;
pScrollBar->SetScrollPos(pos);
sprintf(s, "%d", pos); m_staticScroll.SetWindowText(s);
break;
case SB_THUMBPOSITION:
pScrollBar->SetScrollPos(pos);
sprintf(s, "%d", pos); m_staticScroll.SetWindowText(s);
break;
default: CWnd::OnHScroll(nSBCode, nPos, pScrollBar);
}
}
Bien dch va chay th ng dung.
96 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
8.9 CSliderCtrl:
CSliderCtrl la lp oi tng quan ly thanh trt tren ca so giao dien.
CSliderCtrl ( ); Tao lap oi tng rong.
BOOL Create (
DWORD dwStyle, // Thong so dang cua thanh trt.
const RECT& rect, // Toa o, kch thc cua thanh
CWnd* pParentWnd, // Con tro oi tng ca so cha
UINT nID // So hieu thanh trt
); Khi tao thong so cho oi tng thanh trt tren giao dien.
dwStyle: Gom thong so qui nh oi vi control va cac dang bo sung:
TBS_HORZ : Thanh trt ngang
TBS_VERT : Thanh trt ng
TBS_NOTICKS : Thanh trt khong co thc lam moc.
TBS_LEFT, TBS_RIGHT : Thc at trai/phai thanh trt ng
TBS_TOP, TBS_BOTTOM : Thc at tren/di thanh trt ngang
TBS_BOTH : Thc at ca hai pha thanh trt.
int GetPos( ); Tra ve v tr hien thi cua nut trt tren thanh trt.
int SetPos( int nPos ); at v tr nut trt tren thanh trt.
void SetRange (
int nMinPos, // Gia tr nho nhat
int nMaxPos, // Gia tr ln nhat
BOOL bRedraw = TRUE // Cap nhat lai thanh cuon
); An nh gii han nho nhat va ln nhat cua thanh trt.
void GetRange (
LPINT lpMinPos, // Lay gia tr nho nhat
LPINT lpMaxPos // Lay gia tr ln nhat
); Lay gia tr gii han nho nhat va ln nhat cua thanh trt.

SliderCtrl va ca so cha: Tng t ScrollBar.

THC HANH:
1. Viet ng dung nh VD18. Tao 5 icon resource co noi dung phoi hp hoat
hnh trong resource cua ng dung. Cai at timer cho CEmpWnd e thc hien
oi icon cho oi tng m_staticIcon tuan t theo thi gian vi 5 icon noi tren.
2. Viet ng dung vi thanh ProgressBar chay theo thi gian. Khi progressbar
ay th ket thuc ng dung.
3. Thc hien d an tng t VD24A cho thanh trt.
Hop hoi thoai 97
CHNG 9:

Hop hoi thoai

9.1 HOP HOI THOAI (DIALOG):
Dialog la ca so giao die n vi cac ac iem trang tr c mo ta thong qua
mot cau truc oc lap. Cau truc nay c lu tr trong resource cua ng dung,
goi la dialog resource. Co hai kieu hoat ong cua dialog:
Dialog khoa (modal dialog): Tac vu thc hien dialog phai ch en khi
dialog cham dt hoat ong.
Dialog khong khoa (modeless dialog): Tac vu thc hien dialog co the
tiep tuc cac x ly tiep theo ngay sau lenh thc hien dialog.

9.2 LP CDialog:
CDialog la lp oi tng ke tha t lp CWnd, c s dung e quan ly
dialog. Ngoai cac thuoc tnh va hanh vi ke tha public t lp CWnd, lp
CDialog co cac hanh vi bo sung sau ay:
CDialog (
UINT nIDTemplate, // So hieu cua dialog resource
CWnd* pParentWnd = NULL // Con tro oi tng ca so cha
); Tao lap oi tng dialog hoat ong kieu khoa.
CDialog( ); Tao lap oi tng dialog hoat ong kieu khong khoa.
virtual BOOL OnInitDialog( ); Hanh vi ma oi tng dialog s dung e
x ly WM_INITDIALOG, message do windows gi en dialog trc
khi kch hoat dialog. Ke tha hanh vi nay nham thc hien khi tao
thong so cho dialog va cac controls cua no.
afx_msg HBRUSH OnCtlColor (
CDC* pDC, // Con tro oi tng DC cua control
CWnd* pWnd, // Con tro oi tng ca so quan ly control
UINT nCtlColor // Thong tin ve loai control c trang tr
); Hanh vi x ly WM_CTLCOLOR, message do windows gi en
dialog khi co nhu cau trang tr mot control tren dialog.
nCtlColor co the la mot trong cac gia tr sau:
CTLCOLOR_BTN : oi tng trang tr la button
CTLCOLOR_DLG : Dialog
CTLCOLOR_EDIT : Hop nhap lieu
98 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
CTLCOLOR_LISTBOX : Listbox
CTLCOLOR_SCROLLBAR : Thanh trt
CTLCOLOR_STATIC : Muc thong bao
virtual int DoModal( ); Kch hoat dialog kieu khoa. Hanh vi ch ket thuc
khi dialog ket thuc hoat ong va gia tr tra ve cua no la tham so cua
hanh vi EndDialog c dung e ket thuc dialog.
void EndDialog (
int nResult // Gia tr tham so cua hanh vi.
); Hanh vi c dung e ket thuc hoat ong cua dialog kieu khoa.
virtual void OnOK( ); Hanh vi ke tha e cai at x ly chon button co
so hieu IDOK. Trong CDialog, phan cai at cua OnOK ch la lenh goi
hanh vi EndDialog vi tham so IDOK.
virtual void OnCancel( ); Hanh vi ke e cai at x ly chon button co so
hieu IDCANCEL (phm tat la ESC). Trong CDialog, cai at cua
OnCancel ch la lenh goi hanh vi EndDialog vi tham so IDCANCEL.
BOOL Create (
UINT nIDTemplate, // So hieu dialog resource
CWnd* pParentWnd = NULL // Con tro oi tng ca so cha.
); Hanh vi kch hoat dialog kieu khong khoa.
virtual BOOL DestroyWindow( ); Hanh vi c dung e ket thuc hoat
ong cua dialog kieu khong khoa.
CWnd* GetDlgItem (
int nID // So hieu cua control tren dialog
); Tra ve con tro oi tng thuoc lp CWnd quan ly control.
int GetDlgItemText (
int nID, // So hieu cua control tren dialog
CString& rString // Tham bien kieu chuoi cha ket qua
); Lay noi dung chuoi thong bao cua control.
UINT GetDlgItemInt (
int nID // So hieu cua control tren dialog
); Tra ve gia tr so cua noi dung nhap trong control.
void SetDlgItemText (
int nID, // So hieu cua control tren dialog
LPCTSTR lpszString // Gia tr kieu chuoi
); at noi dung kieu chuoi cho control.
Hop hoi thoai 99
void SetDlgItemInt (
int nID, UINT nValue // So hieu control va gia tr gan
); Gan gia tr so nValue cho control.
UINT IsDlgButtonChecked (
int nIDButton // So hieu cua button control
); Tra ve gia tr TRUE neu control c anh dau chon.
int GetCheckedRadioButton (
int nIDFirstButton, // So hieu nut RadioButton au tien va
int nIDLastButton // cuoi cung trong nhom cac nut RadioButtons
); Tra ve so hieu nut radioButton c anh dau chon.
void CheckRadioButton (
int nIDFirstButton, // So hieu nut RadioButton au tien va
int nIDLastButton, // cuoi cung trong nhom cac nut RadioButtons
int nIDCheckButton // So hieu nut RadioButton c anh dau.
); anh dau chon mot nut trong nhom cac nut RadioButtons.

9.3 TAO VA S DUNG DIALOG TRONG CHNG TRNH:
Moi oi tng dialog hnh thanh trong chng trnh la ket qua ket hp gia
lp oi tng ke tha t CDialog va dialog resource. Nh vay, e s dung
dialog trong chng trnh, ta phai thc hien hai bc sau:
Thiet ke dialog resource.
Khai bao lp ke tha t
CDialog s dung dialog
resource noi tren.
Trong chng trnh, moi khi
co nhu cau s dung dialog, ta
ch viec khai bao bien oi
tng thuoc lp noi tren va s
dung no mot cach thch hp.
Trong phan nay, ta thc hien ng dung tng t VD21. Khi ngi dung
chon muc Option tren menu th hien th dialog nh hnh ve tren.
Trc tien, tao d an mi VD25 tng t d an VD21. Sau o thc hien
cac cong viec sau:

9.3.1 Tao Dialog resource:
Tao mi dialog resource: Thc hien tng t viec tao mi icon (2.8).
Lu y: Chon Resource Type la Dialog.
at so hieu cho dialog resource ( v du IDD_OPTION ).
100 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Thiet ke dialog thong qua man hnh thiet ke ma ta va nhan c t
bc tren. Cac thao tac c ban nh sau:
Bat / Tat thanh cong cu ho tr thiet ke dialog:
- Chon muc menu Tools / Customize...

- anh dau hoac bo anh dau muc Controls. Chon Close.

(Thanh cong cu vi cac loai control s dung c tren dialog)
An nh cac ac tnh cua dialog resource: Right-clict tren khung
dialog resource (vung khong cai controls), chon muc Properties:

- Chon General e an nh cac thong so chung.
Hop hoi thoai 101
ID : So hieu cua dialog resource.
Caption : Noi dung tieu e cua dialog.
Menu : So hieu cua menu resource gan vao dialog.
Font : An nh font dung cho noi dung ch tren dialog.
- Chon Styles e an nh thong so dang ca so cua dialog:
Style : ac tnh cua dialog. Chang han chon Popup cho
phep dialog tao ra co thong so dang WS_POPUP.
Border : Kieu ng vien cua dialog.
Title Bar : Dialog co tieu e.
System Menu : Dialog co hop System Menu.
- Chon More Styles e an nh cac thong so dang m rong:
Visible : Dialog hien th. oi vi dialog resource dung cho
modeless dialog th muc nay phai luon c chon.
- Chon Extended Style e an nh cac thong so dang m rong:
ToolWindow : Tng ng WS_EX_TOOLWINDOW.
Static edge : Vung client c chm xuong (3D).
Go phm Enter e ket thuc.
Cai oi tng muc thong bao len dialog:
- Click chon bieu tng tren thanh cong cu.
- Drag chuot tren vung danh cho muc thong bao tren dialog.
- Right-click tren oi tng muc thong bao va cai at, chon muc
Properties. Thc hien cac an nh can thiet:
ID : So hieu muc thong bao, mac nhien IDC_STATIC. e
dialog nhan dien c muc khi x ly message th gia tr nay
phai c khai bao tng minh va duy nhat.
Caption : chuoi thong bao
Style :
Visible : Neu anh dau th muc c hien th.
Align Text : Canh chnh noi dung thong bao trong muc.
Center Vertically : Canh chnh gia noi dung thong bao theo
chieu doc trong muc.
Border : Co khung bao quanh muc thong bao.
Sunken : Khung chm.
Notify : Muc thong bao co kha nang thong tin cho ca so cha.
Extened style :
Transparent : Nen muc trong suot.
102 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Static edge : Khung chm.
Cai oi tng hop nhap len dialog:
- Click chon bieu tng tren thanh cong cu.
- Thc hien cai at va an nh thong so nh vi muc thong bao:
Multi Line : Hop nhap cho phep nhap nhieu dong.
AutoHScroll/AutoVScroll : T ong trt noi dung khi thong
tin nhap vt qua kch thc hop nhap.
HorizontalScroll | VerticalScroll : Hien th thanh trt ngang,
doc cua hop nhap.
Want return : S dung phm enter e xuong dong trong hop
nhap nhieu dong.
Password : Dung nhap password.
Cai oi tng comboBox len dialog:
- Click chon bieu tng tren thanh cong cu.
- Thc hien cai at va an nh thong so nh vi muc thong bao:
Data : Cha cac muc chon. Cac muc nay c nhap tren cac
dong khac nhau. Lu y dung phm Ctrl+Enter e xuong dong.
Type : Kieu comboBox.
Sort : Cac muc trong comboBox c sap xep theo noi dung.
Cai oi tng comboBox len dialog:
- Click chon bieu tng tren thanh cong cu.
- Thc hien cai at va an nh thong so nh vi muc thong bao:
Selection : Kieu listbox.
Multi-column : Listbox co nhieu cot.
Want Key Input : Lisbox cho phep x ly phm.
Cai oi tng button len dialog:
- Click chon bieu tng tren thanh cong cu.
- Thc hien cai at va an nh thong so nh vi muc thong bao:
Default Button: Button ng vi phm tat la Enter.
Multi-lines: Noi dung thong bao cua button co nhieu dong.
Notify : Button co kha nang thong tin cho ca so cha.
anh dau chon cac oi tng tren dialog: Thc hien thao tac click.
Phoi hp phm Shift hoac Ctrl e anh dau nhieu oi tng.
Chnh v tr cua mot oi tng: Thc hien thao tac drag oi tng.
Chnh kch thc cua mot oi tng:
- Click chon oi tng.
Hop hoi thoai 103
- Thc hien thao tac Drag tren bien cua
oi tng e at kch thc mong muon.
Canh chnh v tr, kch thc mot nhom oi tng:
- anh dau nhom oi tng
- Chon cong cu phu hp tren thanh cong cu:
Canh thang theo bien:
Canh thang gia dialog:
Cac eu nhau:
Bang c oi tng chon cuoi cung trong nhom:

9.3.2 Khai bao lp ke tha CDialog s dung dialog resource:
Thong qua lp nay, ta thc hien cai at cac x ly phu hp tren dialog va
cac oi tng nhap lieu c mo ta trong dialog resource tren.
Trong man hnh thiet ke dialog, chon View / ClassWizard (Ctrl+W).

Chon OK e tao lp mi ng vi dialog resource.

- Name = COptionDlg : Nhap ten lp mi
104 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
- File name = OptDlg : Ten tap tin,
- Base class = CDialog : Lp c s
- Dialog ID = IDD_OPTION : So hieu dialog resource.
Sau cung chon OK.
ong man hnh thiet ke dialog. Trong man hnh Workspace, chon
ClassView, ta co lp COptionDlg trong danh sach cac lp cua d an.
Tren lp COptionDlg, ta co the thc hien bo sung thuoc tnh, cai at cac
hanh vi thong thng cung nh cac hanh vi x ly message. Cac thao tac
hoan toan tng t nh a thc hien vi cac lp CEmpApp va CEmpWnd.

9.3.3 S dung dialog trong chng trnh:
Khai bao oi tng thuoc lp dialog mi tao. Dung ch th #include tap
tin (.H) cha khai bao lp au chng trnh:

#include "Optdlg.h" // EmpWnd.cpp : implement file
...
COptionDlg dlg (this); // oi tng COptionDlg
Goi hanh vi DoModal hoac Create cua oi tng dialog mot cach phu
hp tuy theo yeu cau dung dialog khoa hay khong khoa.


dlg.DoModal(); // Dialog hoat ong che o khoa


Thc hanh: Bo sung d an VD25: Cai at hanh vi x ly muc chon Option
tren menu cho CEmpWnd vi noi dung thc hien dialog COptionDlg.
Bo sung hanh vi x ly muc chon Option cho lp CEmpWnd.
Trong phan cai at hanh vi nay, ta khai bao oi tng COptionDlg va
goi hanh vi DoModal cua no:

void CEmpWnd::OnGameOption ()
{
COptionDlg dlg(this);
dlg.DoModal();
}

9.4 LIEN KET GIA DIALOG VA CAC THANH PHAN KHAC:
Dialog la cong cu giao dien rat tien li vi ngi dung. Tao moi lien ket
gia dialog va cac thanh phan khac cua ng dung e trao oi thong tin t
ngi dung la van e thng gap. Van e nay co the giai quyet nh sau:
oi tng nhan thong tin se chuyen con tro (handle) quan ly mnh cho
oi tng cung cap thong tin.
Hop hoi thoai 105
oi tng cung cap thong tin se dung handle cua oi tng nhan tin e
xac nh cac o cha tin cua oi tng nay, sau o ien cac thong tin
cua mnh vao cac o cha tin cua oi tng nhan tin.

Thc hanh: Tao ng dung VD26 nh VD25. Thc hien cac bo sung: Khi
option dialog hoat ong, ngi dung go thong tin vao hop nhap. Neu ngi
dung chon OK th thong tin nhap chuyen vao hop nhap YourName tren
ca so chnh, ngc lai muc chon Cancel se khong x ly g ca.
HD: Muc nhap YourName c quan ly bi thuoc tnh m_editName cua
oi tng CEmpWnd, ay la o cha tin cua oi tng nhan tin CEmpWnd.
oi tng COptionDlg la oi tng cung cap tin. X ly ien thong tin ch
xay ra khi ngi dung chon OK. X ly nay c cai at trong hanh vi ma
oi tng COptionDlg dung e tra li thao tac click tren nut OK.
Cac bc thc hien d an VD26:
Tao d an VD26 tng t d an VD25.
Hanh vi thc hien OptionDlg trong CEmpWnd s dung dung con tro ch
en no lam tham so cho hanh vi tao lap cua oi tng COptionDlg:
void CEmpWnd::OnGameOption ()
{
COptionDlg dlg( this );
dlg.DoModal();
}
Bo sung thuoc tnh protected m_parent kieu con tro CEmpWnd* cho
lp COptionDlg. Thuoc tnh nay c dung e cha con tro en ca so
cha cua COptionDlg (CEmpWnd). Bo sung #include "EmpWnd.h" vao
au tap tin khai bao (.h) cua lp COptionDlg.
Hanh vi tao lap cua COptionDlg lu gi gia tr con tro ca so cha c
truyen cho no vao thuoc tnh m_parent.
COptionDlg::COptionDlg ( CWnd* pParent )
: CDialog( COptionDlg::IDD, pParent )
{
m_parent =(CEmpWnd*) pParent;
//{{AFX_DATA_INIT(COptionDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
106 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Hanh vi x ly chon nut OK cua lp COptionDlg: Thc hien viec lay
thong tin t hop nhap cua no e gan cho oi tng hop nhap
m_editName tren ca so cha CEmpWnd.

void COptionDlg::OnOK()
{
CString name;
// Lay thong tin nhap trong hop nhap cua dialog
GetDlgItemText( IDC_NAME, name );
// va chuyen thong tin nay sang hop nhap tren ca so chnh
m_parent->m_editName.SetWindowText( name );
// Dung hanh vi lp c s e ket thuc dialog.
CDialog::OnOK();
}

Hanh vi OnOK cua lp COptionDlg b loi do truy xuat thuoc tnh kieu
protected m_editName cua lp CEmpWnd. e khac phuc loi nay, ta
khai bao lp COptionDlg la mot lp ban (friend) cua lp CEmpWnd.

class CEmpWnd : public CWnd
{
friend class COptionDlg; // COptionDlg is a friend
public:
CEmpWnd();
... // other declarations
};

9.5 S DUNG DIALOG LAM GIAO DIEN CHNH CUA NG DUNG:
Ke tha t CWnd, lp CDialog va cac lp ke tha t no co the dung khai
bao cac oi tng ca so giao dien chnh cua ng dung.

9.5.1 Thc hien ng dung vi giao dien chnh la dialog:
Tao d an VD27 tng t VD03 (d an ch co lp ke tha CWinApp).
Tao dialog resource co noi dung tuy y lam giao dien chnh.
Tao lp quan ly dialog resource. Gia s lp co ten la CMainDlg co ma
nguon trong cac tap tin MainDlg.H va MainDlg.CPP.
ang ky s dung lp CMainDlg cho phan cai at cua lp quan ly ng
dung: Bo sung vao au tap tin cai at cua lp (VD27.cpp):


#include "maindlg.h" // at the begin of program

Hanh vi InitInstance cua lp CEmpApp tao dialog giao dien.
Hop hoi thoai 107
BOOL CEmpApp::InitInstance ()
{
CMainDlg main; // Khai bao oi tng dialog
m_pMainWnd =&main; // Dung dialog lam ca so chnh
main.DoModal(); // Thc hien dialog
return TRUE;
}
* Cai bieu tng ng dung tren tieu e cua dialog:
Khai bao style la Popup hoac Overlap cho dialog resource.
Hanh vi OnInitDialog cua dialog se thc hien cai at icon

BOOL CMainDlg::OnInitDialog()
{ CDialog::OnInitDialog();
SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), TRUE);
return TRUE;
}

9.5.2 Dung MFC wizard tao ng dung vi giao dien chnh la dialog:
e ngi dung co ngay mot d an c VD27 ma khong phai mat cong thc
hien cac viec nh tren, MFC wizard cung cap chc nang ho tr tao nhanh d
an vi dialog lam ca so chnh. Cach s dung chc nang ho tr nay nh sau:
Chon menu File / New.

108 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
ien cac thong tin trong hop hoi thoai New, Sau o chon OK.

Chon muc Dialog Based, sau o chon Next.

Hop hoi thoai 109
An nh cac muc chon nh tren. Sau o chon Next.

Chon c che lien ket vi th vien MFC. Sau o chon next.
Cuoi cung, an nh ten tap tin cha khai bao cac lp. Chon Finish.
Bien dch va chay th ng dung.

9.6 KHAI BAO BIEN CHO CONTROL TREN DIALOG:
Khai bao bien cho control tren dialog la thc hien nh ngha bien oi
tng co kieu phu hp va thiet lap moi quan he gia bien oi tng va
control lien quan. Thong qua bien oi tng, ta de dang tien hanh cac x ly
can thiet e tac ong hoac lay gia tr cua control. Co hai loai bien:
- Bien gia tr (value variable): Bien c s dung e lu tr gia tr
cua control.
- Bien ieu khien (control variable): Bien oi tng, co kieu phu hp va
cac hanh vi x ly can thiet, c s
dung e tac ong len control.

ong bo noi dung nhap trong control va noi dung bien gia tr:
Khi ngi dung thao tac nhap lieu tren control, noi dung nhap cha
thc s tr thanh gia tr cua bien. Ngc lai, viec gan tr cho bien cung
khong lam thay oi ngay noi dung hien th trong control.
110 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
e thc hien ong bo hai noi dung khi mot trong hai hien tng noi
tren xay ra, ta s dung hanh vi sau ma lp CDialog ke tha t CWnd:

BOOL UpdateData( BOOL bSaveAndValidate = TRUE );

Tham so bSaveAndValidate co y ngha nh sau:
TRUE : Chuyen gia tr trong control vao bien gia tr.
FALSE : Chuyen gia tr trong bien gia tr vao control.

S dung bien ieu khien:
Bien ieu khien la oi tng thuoc mot lp oi tng nhap lieu (xem
chng 8) co kieu phu hp vi control. Thong qua cac hanh vi cua bien oi
tng nay, ta co the thc hien cac tac ong cho phep len control.

Thc hien ng dung vi giao dien chnh la dialog, mot muc nhap va hai
nut View va Set e hien th va at noi dung trong hop nhap.
Ap dung muc (9.5.2), tao d an VD27A vi giao dien chnh la dialog.
M resource cua dialog giao dien chnh, cai at cac control sau:
- Hop nhap lieu : Edit So hieu IDC_NHAP
- Nut lenh hien th noi dung hop nhap : Button IDC_XEM
- Nut lenh at noi dung hop nhap : Button IDC_DAT
Khai bao bien m_szNhap kieu CString, dung lu gia tr hop nhap lieu.
Cach thc hien nh sau:
M resource cua dialog chnh, chon muc View/ClassWizard.


Hop hoi thoai 111
Chon trang Member Variables, chon muc co so hieu IDC_NHAP.
Sau o chon muc Add Variable.


- Meber variable name = m_szNhap : Ten bien
- Category = Value : Loai bien
- Variable type = CString : Kieu cua bien. Chon OK.
Khai bao bien m_editNhap kieu CEdit. Bien nay c s dung e tac
ong gia tr hop nhap lieu. Thc hien nh khai bao bien m_szNhap:


Hanh vi OnXem ng vi nut chon IDC_XEM hien th noi dung nhap:

void CEmpDlg::OnXem()
{
UpdateData(TRUE); // Cap nhat gia tr control vao bien
MessageBox( m_szNhap, "Ban da nhap", MB_OK );
}

Hanh vi OnDat ng vi nut chon IDC_XEM at gia tr cho hop nhap:
112 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
void CEmpDlg::OnDat()
{
m_editNhap.SetWindowText( "Mr.Emp, Hello !" );
}
Bien dch va chay th ng dung.

Hanh vi OnDat co the cai at nh sau:

void CEmpDlg::OnDat()
{
m_szNhap ="Mr.Emp, Hello !";
UpdateData(FALSE); // Cap nhat gia tr bien cho control
}

9.7 KHAI THAC CAC TIEN CH HO TR:
ng dung phat trien trong VC co the de dang khai thac cac tien ch ho tr
bi VC (VC Components) hoac bi cac ng dung khac c cai at trong he
thong (ActiveX Controls). Viec bo sung va khai thac cac tien ch nay trong
ng dung c thc hien thong qua cac bc sau:
M d an cua ng dung trong VC.
ang ky s dung tien ch:
Chon muc: Project / Add to Project / Components and Controls


Chon nhom tien ch: Double-click muc nhom tien ch can dung.
Hop hoi thoai 113

(Danh sach cac tien ch cua MS Visual C++)

Chon tien ch:
Chon muc thch hp trong danh sach tien ch chi tiet. Chon Insert.


Chon OK e khang nh thao tac.
Khai bao thong tin lp oi tng quan ly tien ch bo sung (neu co).
Khai bao thong tin lp oi tng trong ng dung s dung tien ch.
Ket thuc qua trnh bo sung mot tien ch vao ng dung.

114 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Thc hien ng dung TipApp vi giao dien chnh la dialog. Moi khi thc
hien, ng dung hien th hop thong bao "Tip of the Day".

Dung MFC Wizard tao d an TipApp vi giao dien chnh la dialog.
ang ky s dung tien ch:
Nhom tien ch = Visual C++ Components.
Tien ch = Tip of the day
Khai bao thong tin lp oi tng quan ly tien ch:



Chon OK, Chon Close e ong hop hoi thoai tien ch.
Vi tien ch "Tip of the Day", lp oi tng quan ly tieu trnh chnh
cua ng dung la lp s dung. Hai hanh vi bo sung t ong cho lp:
- void CTipAppApp::ShowTipAtStartup(void);
- void CTipAppApp::ShowTipOfTheDay(void);
Hanh vi ShowTipAtStartup c thc hien bi hanh vi InitInstance.
Hay th quan sat cac lp cua d an TipApp e t nhan xet.
Bien dch va chay th ng dung.

Thc hien ng dung XemLich vi giao dien chnh la dialog. Bo sung vao
ng dung cong cu xem va chon lch Calendar 8 (ActiveX Control). Cai at
control nay len dialog giao dien.
Dung MFC Wizard tao d an XemLich vi dialog giao dien chnh.
ang ky s dung tien ch:
Nhom tien ch = Registered ActiveX Controls.
Tien ch = Calendar Control 8.0
Hop hoi thoai 115
Khai bao thong tin lp oi tng quan ly tien ch:


Chon OK, Chon Close e ong hop hoi thoai tien ch.
Lp oi tng CXemLichDlg quan ly dialog giao dien chnh cua d
an lam nhiem vu s dung control bo sung nay:
- M resource dialog giao dien, cai at control sau:
- Hop xem va chon ngay CCalendar IDC_DATE
- Tao bien ieu khien m_Lich kieu CCalendar cho control.
- Hanh vi OnInitDialog cua lp at gia tr cho control:

BOOL CXemLichDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
m_Lich.SetDay( 19 );
m_Lich.SetMonth( 11 );
m_Lich.SetYear( 2002 );
return TRUE;
}

Co the s dung cac hanh vi: GetDay, GetMonth, GetYear cua
oi tng m_List e lay thong tin ve ngay c chon.
Bien dch va chay th ng dung.
116 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
THC HANH:
1. Nh VD26, khi option dialog c thc hien, hop nhap cua no cha san
thong tin la noi dung a c nhap tren man hnh chnh CEmpWnd.
HD: Hanh vi OnInitDialog cua COptionDlg thc hien lay thong tin t thuoc
tnh m_editName cua oi tng CEmpWnd va gan cho hop nhap cua no.
2. Viet ng dung vi option dialog cho phep nhap 4 thong so toa o (left-top,
right-bottom). Khi chon OK, cac thong so nay c ap at cho ca so chnh.
3. Viet ng dung vi n chu bm bay trong vung client cua ca so chnh va
option dialog cho phep an nh so lng (n), van toc cua bm.
4. Viet ng dung thc hien chc nang cua mot cai may tnh bo tui. Giao dien
la mot dialog, cac nut bam so va phep tnh c cai at bang cac control.
5. Viet ng dung knh lup vi giao dien chnh la dialog. Khi di chuyen dialog
tren man hnh desktop, thong tin cua desktop ben di dialog c phong to
(vi t le an nh c) va hien th trong vung client cua dialog.
6. Thc hien ng dung vi giao dien chnh la dialog co hnh ngoi sao.
7. Thc hien ng dung vi giao dien chnh la dialog ma khuon dang cua no
c hnh thanh t mot anh bitmap bat ky.
8. Thc hien ng dung vi giao dien chnh la dialog. Dialog nay cho phep
thay oi v tr bang cach drag chuot bat ky v tr nao tren be mat cua no.
9. Thc hien dialog vi mau nen tuy chon, mot muc thong bao co noi dung
"Mailto: emp@hcmueco.edu.vn". Hnh anh chuot oi thanh khi di chuyen
chuot len v tr muc. Click chon muc cho phep gi mail.
HD:
- X ly WM_CTLCOLOR e at mau nen cua dialog va mau ch muc.
- Muc cai at vi so hieu xac nh, thong so dang cha WM_NOTIFY.
- X ly BN_CLICKED tren muc, va gi mail thong qua ham sau:
HINSTANCE ShellExecute (
HWND hWnd, // Handle ca so cha.
LPCTSTR lpOperation, // Chuoi noi dung tac vu
LPCTSTR lpFile, // ng dan tap tin chng trnh
LPCTSTR lpParameters, // Chuoi tham so dong lenh
LPCTSTR lpDirectory, // ng dan th muc lam viec
int nShowCmd // Thong so hien th ca so
); Lenh thc hien mot chng trnh ng dung trong windows.
V DU: e gi mail, ta s dung ham tren nh sau.
ShellExecute( NULL, "open", "Mailto:emp@hcmueco.edu.vn","","", SW_SHOW );
Khung ca so giao dien chnh 117
CHNG 10:

KHUNG CA SO GIAO DIEN CHNH

10.1 KHUNG CA SO GIAO DIEN (FRAME WINDOW):
Frame window la loai ca so chuyen dung lam man hnh chnh cua ng
dung. Frame window co cac ac iem nh sau:


Cho phep long vao frame window thanh trang thai (statusbar), thanh
cong cu (toolbar), menu va cac phm tat tren menu.
Cho phep long mot oi tng view (thuoc lp ke tha t CWnd) vao
vung client cua frame window e hoat ong phoi hp trong viec hien
th noi dung trao oi cua ng dung. Hanh vi OnSetFocus cua frame
window thc hien hanh vi OnSetFocus cua view e tao s ong bo gia
frame va view khi kch hoat. Thong qua hanh vi OnCmdMsg, frame
window co the ieu phoi command message cho view.
Phoi hp, ong bo viec thc hien x ly va thay oi trang thai cua cac
oi tng trc thuoc: menu, toolbar, statusbar, view.
Cho phep c che thc hien WinHelp va t ong ket thuc WinHelp khi
frame window cham dt hoat ong.

10.2 THANH TRANG THAI (STATUSBAR) & LP CStatusBar:
StatusBar la khung bao gom cac hop (pane) cha thong bao. Thong qua
statusbar, ng dung co the thong tin cho ngi dung ve cac hoat ong cua ng
dung va cac thong so lien quan. Statusbar thng c at canh di cua
frame window. Moi pane tren statusbar co the c an nh mot kieu dang
the hien va noi dung thong tin rieng.
Viec quan ly statusbar trong ng dung c MFC ho tr thong qua lp oi
tng CStatusBar. Cac hanh vi ac trng cua lp nay nh sau:
118Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
CStatusBar( ); Tao lap oi tng rong.
BOOL Create (
CWnd* pParentWnd, /* Con tro oi tng ca so cha */
/* Thong so dang cua statusbar va gia tr mac nhien */
DWORD dwStyle WS_CHILD | WS_VISIBLE | CBRS_BOTTOM,
/* So hieu statusbar, gia tr mac nhien cho statusbar chnh */
UINT nID = AFX_IDW_STATUS_BAR
); Khi tao thong so cho oi tng statusbar.
BOOL SetIndicators (
const UINT* lpIDArray, // Mang cha so hieu panes
int nIDCount // So pane tren statusbar
); Qui nh so pane va so hieu cua chung.
Cac so hieu pane ac biet nh sau:
ID_SEPARATOR : Dung cho pane thong tin trang thai,
ID_INDICATOR_CAPS : Pane trang thai phm capslock.
ID_INDICATOR_NUM : Pane trang thai phm numslock
ID_INDICATOR_SCRL : Pane trang thai phm scrolllock
void SetWindowText (
LPCTSTR lpszString // Noi dung thong bao cap nhat
); Cap nhat thong bao cho pane co so hieu la 0.
BOOL SetPaneText (
int nIndex, // So hieu pane
LPCTSTR lpszNewText, // Noi dung thong bao cap nhat
BOOL bUpdate=TRUE // Ve lai thong tin cap nhat
); Cap nhat noi dung thong bao trong pane mot pane.
void SetPaneInfo (
int nIndex, // So th t pane trong statusbar
UINT nID, // So hieu gan cho pane
UINT nStyle, // Thong so dang cua pane
int cxWidth // o rong pane (tnh bang pixel)
); An nh cac thong so lien quan hoat ong hien th cua pane.
Gia tr nStyle co the la:
SBPS_NOBORDERS : Khong vien.
SBPS_POPOUT : Vien noi.
SBPS_DISABLED : Cam.
SBPS_STRETCH : T chnh kch thc (cho 1 pane duy nhat ).
Khung ca so giao dien chnh 119
SBPS_NORMAL : Khong co kieu dang ac biet,
void SetPaneStyle (
int nIndex, // So th t pane trong statusbar
UINT nStyle // Thong so dang cua pane
); An nh thong so dang cua pane.

10.3 THANH CONG CU (TOOLBAR) & LP CToolBar:
Toolbar la khung cha cac muc chon co hnh anh gi nh va c ket vao
canh cua frame window. Moi muc chon cua toolbar co mot so hieu rieng
hoac gan vi mot muc chon xac nh trong he thong menu. CToolBar la lp
do MFC cung cap nham ho tr viec quan ly toolbar trong ng dung.
CToolBar( ); Tao lap oi tng rong.
BOOL Create (
CWnd* pParentWnd, /* Con tro oi tng ca so cha */
/* Thong so dang cua toolbar vi gia tr mac nhien */
DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP,
/* So hieu cua toolbar, gia tr mac nhien cho toolbar chnh */
UINT nID = AFX_IDW_TOOLBAR
); Khi tao thong so cho oi tng toolbar.
dwStyle co the nhan cac thong so sau:
CBRS_GRIPPER : Toolbar di chuyen c
CBRS_FLOAT_MULTI : Cho phep nhieu toolbar trong 1 frame
CBRS_TOOLTIPS : Co tiptext cho moi muc chon
CBRS_FLYBY : ong bo tooltip va message info
CBRS_SIZE_DYNAMIC : Kch thc thay oi c
CBRS_SIZE_FIXED : Kch thc co nh
BOOL CreateEx (
CWnd* pParentWnd,
DWORD dwCtrlStyle = TBSTYLE_FLAT, // Dang phang
DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP
CRect rcBorders = CRect ( 0, 0, 0, 0 ),
UINT nID = AFX_IDW_TOOLBAR
); Khi tao oi tng toolbar vi thong so dang m rong.
dwCtrlStyle co the la TBSTYLE_TRANSPARENT (trong suot).
BOOL LoadToolBar (
UINT nIDResource // So hieu cua toolbar resource
); Tao dang cho toolbar t toolbar resource.
120Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
void SetHeight( int cyHeight ); An nh chieu cao cua toolbar.
void EnableDocking (
DWORD dwStyle // Cach ket toolbar vao frame window
// xem EnableDocking() cua CFrameWnd
); An nh kieu ket cho phep cua toolbar vi ca so cha cua no.
CToolBarCtrl& GetToolBarCtrl( ); Tra ve oi tng quan ly cac nut
chon tren toolbar. Vi oi tng nay ta co the thc hien cac chnh sa
phu hp tren tng nut chon.

Thc hien toolbar trong ng dung: Ta tien hanh cac bc sau ay.
10.3.1 Thiet ke toolbar resource:
Toolbar resource cha thong tin ve hnh anh, so hieu, noi dung thong bao
va cac hng dan cho tng muc chon tren thanh toolbar.
M d an can bo sung toolbar resource trong VC.
Tao mi toolbar resource: Thc hien tng t tao mi icon (2.8).
Lu y: Chon Resource Type = ToolBar.
at so hieu cho toolbar (v du IDR_MAINFRAME cho toolbar chnh).
Thiet ke toolbar thong qua man hnh thiet ke ma ta va nhan c t
bc tren. Cac thao tac c ban nh sau:
Khai bao thong so cho nut chon:
- Double-click tren nut:

- An nh cac thong so cho nut:
ID : So hieu cua nut chon, co the la so hieu cua muc menu.
Width, Height : Chieu rong va chieu cao cua nut.
Prompt : Tng t nh Prompt cua muc chon tren menu.
Them mot nut mi: Double-click tren . Sau o thc hien khai
bao thong so cho nut nh tren.
Chuyen v tr cua nut: Drag nut en v tr thch hp.
Khung ca so giao dien chnh 121
Tach nhom nut: Drag nut ra xa v tr nut ke can.
Xoa nut: Drag nut ra khoi thanh toolbar.
Trang tr nut: Thc hien nh trang tr icon.
Khi thiet ke xong, chon muc Save va ong man hnh thiet ke toolbar.

10.3.2 Dung toolbar resource cho oi tng CToolBar cua FrameWnd:
Khai bao oi tng thuoc tnh kieu CToolBar trong lp CFrameWnd
cua ng dung:
CToolBar m_toolbar; // at trong khai bao lp CFrameWnd
Hanh vi OnCreate cua FrameWnd khi tao thong so cho oi tng
toolbar . Sau o ket oi tng toolbar vao frame window.

int CEmpFrame::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
if (CFrameWnd::OnCreate(lpCreateStruct) ==-1)
return -1;
// Create the main toolbar for frame window
m_toolbar.CreateEx(this, TBSTYLE_FLAT,
WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY);
// Initiate toolbars appearance by toolbar resource
m_toolbar.LoadToolBar(IDR_MAINFRAME);
m_toolbar.EnableDocking(CBRS_ALIGN_ANY);
// attach the toolbar to frame window
this->EnableDocking(CBRS_ALIGN_ANY);
this->DockControlBar(&m_toolbar, AFX_IDW_DOCKBAR_TOP);
return 0;
}

10.4 LP CFrameWnd:
CFrameWnd la lp oi tng ke tha t CWnd cho phep quan ly frame
window trong ng dung. Ngoai cac thuoc tnh va hanh vi ke tha public t
CWnd, CFrameWnd co cac thuoc tnh va hanh vi ac trng giup viec an nh
va ieu khien frame window c de dang va hieu qua.
CFrameWnd( ); Hanh vi tao lap.
BOOL Create (
LPCTSTR lpszClassName, // Ten lp a ang ky cua frame
LPCTSTR lpszWindowName, // Ten, tieu e cua frame window
/* thong so dang cua frame */
122Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
DWORD dwStyle = WS_OVERLAPPEDWINDOW,
/* Toa o, kch thc cua frame
rectDefault: Gia tr mac nhien */
const RECT& rect = rectDefault,
// Con tro oi tng ca so cha
CWnd* pParentWnd = NULL,
// Chuoi ten menu resource
LPCTSTR lpszMenuName = NULL,
DWORD dwExStyle // Thong so dang frame m rong
); Khi tao thong so cho frame window.
afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct ); Hanh vi
ke tha cho phep khi tao thong so cac oi tng trc thuoc.
virtual BOOL LoadFrame (
UINT nIDResource, // So hieu cac resource lien quan: icon,
// cursor, bang phm tat, menu (bat buoc).
DWORD dwDefaultStyle // Thong so dang frame window
= WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,
CWnd* pParentWnd // Con tro oi tng ca so cha
); Khi tao thong so cho frame window.
BOOL LoadAccelTable (
LPCTSTR Bang_phm_tat // Ten bang phm tat trong resource
); Nap bang phm tat, ch dung khi frame c khi tao bi Create.
virtual void ActivateFrame (
int nCmdShow = -1 // Thong so ve trang thai kch hoat
); Hanh vi ke tha e an nh thong so trang thai frame khi kch hoat.
void EnableDocking (
DWORD dwDockStyle // Thong so an nh
); Qui nh cach ket thanh cong cu vao frame window.
dwDockStyle co the nhan mot trong cac gia tr sau:
CBRS_ALIGN_TOP : Ket canh tren vung client.
CBRS_ALIGN_BOTTOM : Ket canh di
CBRS_ALIGN_LEFT : Ket canh trai
CBRS_ALIGN_RIGHT : Ket canh phai
CBRS_ALIGN_ANY : Ket moi v tr noi tren.
Khung ca so giao dien chnh 123
void DockControlBar (
CControlBar * pBar, // Con tro oi tng toolbar
UINT nDockBarID // Thong so an nh
); Ket oi tng toolbar vao frame window, s dung khi trc o nh
cach ket toolbar cho frame window la CBRS_ALIGN_ANY. Thong so
an nh phai phu hp vi ac tnh cua pBar, co the la cac gia tr sau:
AFX_IDW_DOCKBAR_TOP : Ket canh tren
AFX_IDW_DOCKBAR_BOTTOM : Ket canh di
AFX_IDW_DOCKBAR_LEFT : Ket canh trai
AFX_IDW_DOCKBAR_RIGHT : Ket canh phai
virtual BOOL OnCreateClient (
LPCREATESTRUCT lpcs, // Con tro en cau truc cha
CCreateContext* pContext // Cac thong so lien ket.
); Hanh vi c thc hien khi cac view a c tao xong. Ke tha hanh
vi nay e an nh cac thong so rieng cua ng dung.
virtual CWnd* GetMessageBar( ); Tra ve con tro tro en oi tng
statusbar trc thuoc.

10.5 S DUNG FRAME WINDOW LAM GIAO DIEN CHNH:
Ke tha t CWnd, CFrameWnd va cac lp ke tha t no co the dung khai
bao cac oi tng ca so giao dien chnh cua ng dung.
10.5.1 Thc hien ng dung vi giao dien chnh la CFrameWnd:
Thc hanh 1: Thc hien ng dung vi ca so chnh la frame window.
Tao d an VD28 ch cha lp CEmpApp ke tha t CWinApp.
Trong hanh vi InitInstance cua CEmpApp, khai bao bien con tro oi
tng CFrameWnd* va dung no lam ca so giao dien chnh:
BOOL CEmpApp::InitInstance( )
{
CFrameWnd *main =new CFrameWnd;
m_pMainWnd =main; // frame window as the main window
main->Create (
AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,
LoadCursor(IDC_MAINFRAME), NULL,
LoadIcon(IDR_MAINFRAME) ),
"Emp.Example 28" );
main->ShowWindow(SW_SHOW); // Show the frame window
return TRUE;
}
124Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Thc hanh 2: Thc hien ng dung tng t VD28, cai he thong menu
tng t v du chng 7 cho oi tng frame window.
Tao mi d an VD29 tng t d an VD28.
Tao mi menu resource vi so hieu IDR_MAINFRAME, thiet ke menu
nay nh mo ta chng 7.
Tao mi bang phm tat vi so hieu IDR_MAINFRAME. Khai bao noi
dung bang phm tat nh muc (7.5).
Hanh vi InitInstance cua CEmpApp thc hien khai bao con tro oi
tng CFrameWnd*. Dung hanh vi LoadFrame cua oi tng nay e
khi ong thong so cho no t cac resource lien quan:
BOOL CEmpApp::InitInstance()
{
CFrameWnd *main =new CFrameWnd;
m_pMainWnd =main;
main->LoadFrame(IDR_MAINFRAME);
main->ShowWindow(SW_SHOW); // Show the frame window
return TRUE;
}

10.5.2 String Table va CFrameWnd:
StringTable, mot thanh phan trong resource cua ng dung, dung cha cac
gia tr hang chuoi. Moi hang chuoi co mot so hieu phan biet. Viec tao mi
hang chuoi trong resource ca ng dung c thc hien nh sau:
Tao mi resource (nh 2.8). Lu y chon resource type la String Table.


Double-click hoac go Enter tren dong trong cua StringTable:


Khung ca so giao dien chnh 125
- ID = So hieu hang chuoi.
- Caption = Noi dung hang chuoi. Go phm Enter e ket thuc.
Cuoi cung, lu va ong man hnh khai bao StringTable.

S dung hang chuoi trong StringTable: Co the s dung hang chuoi trong
StringTable lam gia tr cho bien chuoi trong chng trnh. oi vi bien
chuoi c quan ly bi oi tng chuoi CString, x ly nay c thc hien
thong qua hanh vi sau:
BOOL CString::LoadString (
UINT nID // So hieu hang chuoi trong resource
);
Sau ay la mot v du khi tao gia tr chuoi myString t string resource:
CString myString;
myString.LoadString (ID_GAME_OPTION );

Dung hang chuoi trong Stringtable lam tieu e frame window:
Hang chuoi co so hieu trung vi gia tr so hieu lam tham so nIDResource
cho hanh vi khi tao thong so LoadFrame cua oi tng frame window se
c s dung lam tieu e cua frame window nay.
M d an VD29.
Tao mi hang chuoi Emp.Example 29 trong StringTable vi so hieu
la IDR_MAINFRAME.
Thc hien chay th ng dung va quan sat tieu e ca frame window.

Thc hanh 3: Thc hien ng dung nh VD29; thanh statusbar vi ba muc
(pane): muc th nhat cha noi dung "Mr.Emp", muc th hai cha noi dung
"Hello world!", muc th ba hien th thong tin hoat ong cua ng dung.
HD: CFrameWnd khong co san statusbar. Dung CEmpFrame ke tha
CFrameWnd va bo sung oi tng thuoc tnh nay. Hanh vi OnCreate cua
CEmpFrame thc hien khi tao thong so cho oi tng statusbar. Dung
CEmpFrame khai bao oi tng ca so chnh cua ng dung.
Tao d an VD30 nh VD29.
Bo sung lp CEmpFrame ke tha CFrameWnd. Xem (5.4.1).
Bo sung oi tng thuoc tnh protected m_status thuoc lp CStatusBar
cho lp CEmpFrame:
CStatusBar m_status;
Bo sung hanh vi OnCreate (x ly WM_CREATE) cho CEmpFrame va
thc hien cai at nh sau:
126Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
int CEmpFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate( lpCreateStruct ) ==-1)
return -1;
// The IDs of all statusbarpanes
UINT ID_array[3] ={1, 1, ID_SEPARATOR };
m_status.Create( this ); // Thanh statusbar chnh
m_status.SetIndicators( ID_array, 3 );
m_status.SetPaneText( 0, "Mr.Emp" );
m_status.SetPaneText( 1, "Hello world!" );
// Set the size of each pane on statusbar
m_status.SetPaneInfo( 0, 1000, 0, 40 );
m_status.SetPaneInfo( 1, 1001, 0, 70 );
m_status.SetPaneInfo( 2, ID_SEPARATOR, 0, 300 );
return 0;
}

Thc hanh 4: Viet ng dung nh VD30 vi thanh cong cu co 4 nut chon
tng ng 4 muc chon trong he thong menu.
Tao d an VD31 nh VD30.
Tao mi toolbar resource co so hieu IDR_MAINFRAME vi cac nut
chon tng ng cac muc menu.
Bo sung oi tng thuoc tnh m_toolbar thuoc lp CToolBar cho lp
CEmpFrame. Hanh vi OnCreate cua CEmpFrame thc hien khi tao
thong so cho cac oi tng m_status va m_toolbar, sau o ket oi tng
m_toolbar vao frame window
int CEmpFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
... // Cac cai at nh VD30
m_toolbar.CreateEx ( this,
TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY );
m_toolbar.LoadToolBar ( IDR_MAINFRAME );
m_toolbar.EnableDocking ( CBRS_ALIGN_ANY );
this->EnableDocking ( CBRS_ALIGN_ANY );
this->DockControlBar( &m_toolbar, AFX_IDW_DOCKBAR_TOP );
return 0;
}
Khung ca so giao dien chnh 127
Hanh vi InitInstance cua CEmpApp s dung lp CEmpFrame khai bao
oi tng ca so chnh cua ng dung:
BOOL CEmpApp::InitInstance()
{
CEmpFrame *main =new CEmpFrame;
m_pMainWnd =main;
main->LoadFrame(IDR_MAINFRAME);
main->ShowWindow(SW_SHOW);
return TRUE;
}

Thc hanh 5: Thc hien ng dung tng t VD31. Trong frame window,
cai at ca so view cha dong ch chay kieu bang ch ien t.
Tao d an VD32 tng t VD31.
Bo sung lp CEmpView ke tha t CWnd. CEmpView am nhan viec
hien th noi dung ch chay. Cac cai at can thiet nh sau:
- Hanh vi OnCreate thc hien cai at timer:

int CEmpView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate( lpCreateStruct) ==-1 )
return -1;
SetTimer( ID_TIMER, 300, NULL ); // Interval =300ms
return 0;
}

- Hanh vi OnDestroy huy bo timer:
void CEmpView::OnDestroy()
{
KillTimer( ID_TIMER );
CWnd::OnDestroy();
}
- Hanh vi OnTimer kch hoat OnPaint:
void CEmpView::OnTimer(UINT nIDEvent)
{
if (nIDEvent ==ID_TIMER) {
Invalidate(); // Generates a WM_PAINT
}
CWnd::OnTimer(nIDEvent);
}
128Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
- Hanh vi OnPaint thc hien ve ch chay:

void CEmpView::OnPaint()
{
static char mess[] ="Chao cac ban ! ";
char ch;
UINT i;
CPaintDC dc(this); // device context for painting

ch =mess[0];
for (i=0; i <strlen(mess)-1; i++)
mess[i] =mess[i+1];
mess[i] =ch;
dc.TextOut(10, 10, mess, 15);
}

Dung lp CEmpView khai bao oi tng view trong CEmpFrame:
- Bo sung thuoc tnh protected m_view thuoc lp CEmpView vao lp
CEmpFrame.
- Hanh vi OnCreate cua CEmpFrame thc hien khi tao thong so phu
hp cho oi tng m_view; dung so hieu cho m_view la
AFX_IDW_PANE_FIRST (view mac nhien cua frame)

int CEmpFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
... // Nh cai at cua VD31
m_view.Create ( NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0,0,0,0), this, AFX_IDW_PANE_FIRST);
return 0;
}

- Hanh vi PreCreateWindow thc hie n huy thong so an nh dang
"chm xuong" cho vung client (cha view to get a nice look):

BOOL CEmpFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CFrameWnd::PreCreateWindow(cs))
return FALSE;
cs.dwExStyle &=~WS_EX_CLIENTEDGE;
return TRUE;
}

Dung CEmpFrame lam ca so chnh cua ng dung (nh VD31).
Khung ca so giao dien chnh 129
Thc hanh 6: Thc hien ng dung nh VD32. Khi chon muc Start cua
menu th man hnh view thc hien ch chay, ong thi noi dung muc
chuyen thanh Stop. Neu ngi dung chon lai muc nay (Stop), hoat ong
chay ch dng lai va noi dung muc chon chuyen thanh Start.
Tao d an VD33 tng t VD32.
Bo sung thuoc tnh m_isRun kieu BOOL cho lp CEmpView. m_isRun
se lam c hieu cho ch chay. Mot so chnh sa sau cua CEmpView:
- Khi au an nh khong chay ch:

int CEmpView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) ==-1)
return -1;
isRun =FALSE; // no animation
SetTimer( ID_TIMER, 300, NULL );
return 0;
}
- Hanh vi OnTimer() da tren m_isRun e hanh ong:

void CEmpView::OnTimer(UINT nIDEvent)
{
if (nIDEvent ==ID_TIMER) {
if ( isRun ) Invalidate(); // animation allowed ?
}
CWnd::OnTimer(nIDEvent);
}
- Bo sung hanh vi tra li WM_COMMAND phat sinh bi muc chon
ID_GAME_START (Start/Stop) tren menu. ong thi ieu chnh
noi dung muc thong bao cua menu cho phu hp:
void CEmpView::OnGameStart()
{
isRun =!isRun;
CMenu *theMenu =GetParent()->GetMenu();
theMenu->ModifyMenu(ID_GAME_START,
MF_BYCOMMAND, ID_GAME_START,
(isRun)? "&Stop" : "&Start" );
}
Bo sung hanh vi OnCmdMsg cho CEmpFrame e chuyen cac message
WM_COMMAND cho m_view: m_view trong lp CEmpFrame ch la
ca so con, khong trc tiep nhan WM_COMMAND t menu ca so cha.

130Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
BOOL CEmpFrame::OnCmdMsg (
UINT nID, int nCode, void *pExtra,
AFX_CMDHANDLERINFO *pHandlerInfo )
{
// Dispatch command messages to m_view

if (m_view.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE; // message was processed by m_view

return CFrameWnd::OnCmdMsg ( nID, nCode, pExtra,
pHandlerInfo );
}

10.5.3 Dung MFC wizard tao ng dung vi giao dien chnh framewindow:
e ngi dung co ngay mot d an c VD32 ma khong phai mat cong thc
hien cac cong viec nh tren, MFC wizard cung cap chc nang ho tr tao
nhanh d an vi ca so chnh la mot frame window. Cach s dung chc nang
ho tr nay nh sau:
Chon menu File / New.



ien cac thong tin trong hop hoi thoai New, Sau o chon OK.

Khung ca so giao dien chnh 131

An nh nh tren. Chon Next.

An nh nh tren. Chon Next.
132Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

Chon Next.

Chon StatusBar va ToolBar. Sau o chon Next
Khung ca so giao dien chnh 133

Chon c che lien ket vi th vien MFC. Sau o chon Next.
Cuoi cung, an nh ten tap tin cha khai bao cac lp. Chon Finish.

THC HANH:
1. Tng t VD33. Khi ngi dung chon muc Option th hien th dialog vi hai
muc nhap: noi dung chuoi chay va toc o chay ch. Neu ngi dung click
chon OK th thong tin nhap trong dialog se c ap dung cho dong ch chay
trong view.
2. Tng t VD33. Thay hop hien th cau thong bao "Mr.Emp" bang mot
chiec ong ho co dang hh:mm:ss chay theo thi gian lu trong may.
HD: Cai timer cho CEmpFrame. S dung CTime cua MFC (xem VD34).
3. Cai at muc progressbar tren thanh statusbar
cua ng dung.
4. Viet ng dung vi dialog giao dien chnh co
thanh trang thai.
5. Viet ng dung vi dialog giao dien chnh co
thanh cong cu va thanh trang thai.
6. Quan sat tro chi line. Phan tch va thc hien
ng dung nay trong VC.
134 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
CHNG 11:

Cac KIEN TRUC Document & View

MFC ho tr manh me cac d an s dung d lieu, bao gom d lieu dang
van ban (text), dang van ban kem hnh anh va nh dang (lu di dang van
ban rich text format va lu di dang ma nh phan compound file), dang
lu tr tren cac he quan tr c s d lieu va truy xuat thong qua ODBC, ADO.
ng dung s dung d lieu co the de dang phat trien tren VC nh MFC
cung cap bo khung chuan cho cac d an thao tac d lieu. Bo khung nay bao
gom ba thanh phan: Document-View-Frame (DVF). Trong o:
Document: Quan ly toan bo noi dung d lieu cua ng dung c
lu tr trong bo nh.
View: Thc hien chc nang hien th va quan ly mot phan
d lieu cua document.
Frame Window: Cha view, ieu phoi command message t ngi
dung en cac view mot cach thch hp.
Bo khung nay c thc hien thong qua cac lp lien quan sau ay.

11.1 CDocument:
CDocument la lp oi tung quan ly mot noi dung d lieu (Document).
CDocument( ); Tao lap oi tng rong.
void AddView (
CView* pView // Con tro oi tng view
); Bo sung view vao danh sach cac view cua document.
void RemoveView (
CView* pView // Con tro oi tng view
); Loai bo mot view ra khoi danh sach cac view cua document.
void UpdateAllViews (
CView* pSender, // oi tng view mien cap nhat
LPARAM lHint = 0L, // So hieu cap nhat
CObject* pHint = NULL // Cau truc cha thong tin cap nhat
); Thong bao cac view trong danh sach view cua document cap nhat lai
noi dung hien th.
const CString& GetTitle( ); Tra ve noi dung tieu e cua d lieu.
virtual void DeleteContents( ); Xoa rong noi dung document.
Cac kien truc Document & View 135
virtual BOOL OnNewDocument( ); Hanh vi c thc hien moi khi oi
tng CDocument c tao mi; ke tha e cai at khi tao rieng.
virtual BOOL OnOpenDocument (
LPCTSTR lpszPathFileName // ng dan va ten tap tin
); Hanh vi c thc hien khi oi tng CDocument chuan b nhan noi
dung t tap tin; ke tha e cai at x ly rieng ve viec oc tap tin.
virtual BOOL OnSaveDocument (
LPCTSTR lpszPathName // ng dan va ten tap tin
); Hanh vi c thc hien khi noi dung cua document sap c lu vao
tap tin. Viec ke tha hanh vi nay nham thc hien x ly lu tr theo
cach rieng cua ng dung.
BOOL IsModified( ); Tra ve tnh trang cap nhat d lieu trong document
; =TRUE (co chnh sa) hoac =FALSE (khong co chnh sa).

11.2 CView:
CView, lp ke tha t lp CWnd, giup quan ly thanh phan view cua ng
dung. Trong bo ba DVF, view la thanh phan giao dien quan trong cho phep
ngi dung thao tac d lieu cua ng dung mot cach de dang va hieu qua.
CView( ); Tao lap oi tng view.
virtual void OnInitialUpdate( ); Hanh vi c thc hien khi oi tng
view c ket vao danh sach cac oi tng view cua document. Viec
ke tha nham cai at cac an nh khi tao thong so cho view.
virtual void OnActivateView (
BOOL bActivate, // =TRUE: kch hoat ; va ngc lai
CView* pActivateView, // oi tng view c kch hoat
CView* pDeactiveView // oi tng view b ngng hoat ong
); Hanh vi c thc hien moi khi oi tng view c kch hoat hoac
thoi kch hoat.
virtual void OnActivateFrame (
UINT nState, // Trang thai kch hoat
CFrameWnd* pFrameWnd // Con tro oi tng frame cha view
); Hanh vi c thc hien moi khi oi tng frame cha view c kch
hoat.
Trang thai kch hoat cua frame cha view co the la:
WA_INACTIVE : Frame cha view ngng hoat ong.
WA_ACTIVE : Frame cha view c kch hoat.
136 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
CDocument* GetDocument( ); Tra ve con tro oi tng CDocument
ang s dung view.
virtual void OnUpdate (
CView* pSender, // oi tng view lam thay oi d lieu
LPARAM lHint, // Tng t UpdateAllViews()
CObject* pHint // cua CDocument
); Hanh vi c thc hien khi noi dung d lieu trong document lien
quan en view c cap nhat.
BOOL DoPreparePrinting( CPrintInfo* pInfo ); M hop in an.

11.3 CFrameWnd:
CFrameWnd la lp oi tng quan ly khung ca so giao dien chnh cua
ng dung (chng 10). Tham gia vao bo ba DVF cua ng dung s dung d
lieu, lp oi tng CFrameWnd co cac hoat ong x ly bo sung nh sau:
Khi frame c kch hoat, no goi hanh vi OnActivateView cua view.
Neu frame c khi tao vi thong so dang FWS_ADDTOTITLE th
tieu e cua d lieu (document) hien th trong view thuoc farme se c
a len tieu e cua frame.
Frame thc hien ieu phoi command message cho view.

11.4 CDocTemplate:
CDocTemplate la lp oi tng quan ly bo ba DVF cua MFC. Bo ba nay
bao gom CDocument CView CFrameWnd.
CDocTemplate (
UINT nIDResource, // So hieu cac resource lien quan:
CRuntimeClass* pDocClass, // menu, icon, phm tat, stringTable
CRuntimeClass* pFrameClass,
CRuntimeClass* pViewClass
); Tao lap va khi tao thong so cho oi tng CDocTemplate.
- pDocClass: Con tro oi tng CRuntimeClass quan ly thong tin cua
lp document tai thi iem thc thi chng trnh.
- pFrameClass: Con tro oi tng CRuntimeClass quan ly thong tin
cua lp frame window tai thi iem thc thi chng trnh.
- pViewClass: Con tro oi tng CRuntimeClass quan ly thong tin
cua lp view tai thi iem thc thi chng trnh.
Con tro cha thong tin thi hanh cua mot lp nhan c t macro sau:
CRuntimeClass* RUNTIME_CLASS ( Ten_Lp )
Cac kien truc Document & View 137
virtual BOOL GetDocString (
CString& rString, // Bien chuoi cha ket qua
enum DocStringIndex index // Ch so muc thong tin can lay.
);
Ch so muc thong tin can lay co the la:
- CDocTemplate::windowTitle : Tieu e
- CDocTemplate::docName : Ten document.
- CDocTemplate::fileNewName : Ten mac nhien dung cho tap tin
d lieu c tao mi.
Ca CDocument va CView trong bo DVF eu co the oc, ghi d lieu tren
oi tng lu tr d lieu thong qua hanh vi ke tha c: Serialize.
virtual void Serialize( CArchive& ar );
throw( CMemoryException ); // Dung khi ar lien quan bo nh trong.
throw( CArchiveException ); // Dung khi ar la Archive tren a.
throw( CFileException ); // Dung khi ar la File.

11.5 HO TR T PHA OI TNG QUAN LY NG DUNG:
Lp CWinApp co cac hanh vi lien quan viec khi tao ng dung s dung d
lieu va thao tac d lieu da tren bo khung DVF nh sau:
void AddDocTemplate (
CDocTemplate* pTemplate // Con tro oi tng quan ly bo DVF
); a mot bo ba DVF vao danh sach d lieu quan ly bi ng dung.
BOOL ProcessShellCommand ( CCommandLineInfo& rCmdInfo );
Thc hien tac vu x ly d lieu theo yeu cau cua system shell. ng
dung ch cho phep x ly d lieu (tap tin) phu hp vi chc nang cua
cac bo DVF trong danh sach d lieu quan ly bi ng dung.
rCmdInfo : Cha cac thong so dong lenh (neu co) bao gom ten d
lieu, lenh thao tac (edit, open, ...) tren d lieu do shell chuyen en.
void ParseCommandLine ( CCommandLineInfo& rCmdInfo );
Chuan b thong so can thiet trong rCmdInfo e chuyen cho hanh vi
ProcessShellCommand. Cac thong so nay tng ng vi noi dung tham
so dong lenh cua ng dung.
afx_msg void OnFileNew(); Hanh vi tra li cho WM_COMMAND
c phat ra bi muc menu co so hieu ID_FILE_NEW.
afx_msg void OnFileOpen(); Hanh vi tra li cho WM_COMMAND
c phat ra bi muc menu co so hieu ID_FILE_OPEN.
138 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
afx_msg void OnFilePrintSetup(); Hanh vi x ly WM_COMMAND
c phat ra bi muc menu co so hieu ID_FILE_PRINT_SETUP.

11.6 TRNH T TAO LAP CAC OI TNG THAM GIA BO DVF:
oi tng document:

oi tng Frame window:

Cac kien truc Document & View 139
oi tng view:


Nham ho tr ngi dung thc hien cac d an lien quan en viec s dung
d lieu, MFC cung cap cac bo DVF pho bien va cai at cac bo nay trong
phan ho tr MFC Wizard. Sau ay la mot so bo DVF ac trng cua MFC.

11.7 TEXT DOCUMENT APPICATION:
Chon File / New:



An nh nh tren. Chon OK.
140 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

An nh nh tren. Chon Next.

Chon None (khong s dung c s d lieu). Chon Next.
Cac kien truc Document & View 141

Chon None (d lieu ch cha van ban). Chon Next.

An nh cac muc can can thiet:
142 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
- Printing and print preview: Cho phep chc nang in an.
- MAPI: S dung dch vu mail cho d lieu cua ng dung.
Chon Next.


Chon MFC Standard: ng dung co giao dien bnh thng hoac
Windows Explorer: ng dung co giao dien nh windows explorer.
Chon c che lien ket vi th vien MFC. Chon Next.

Cac kien truc Document & View 143
An nh ten cac tap tin cha khai bao va cai at cua cac lp.
Lu y: Chon lp CTxtDVFView, khai bao lp c s la CEditView e
man hnh view cho phep soan thao. Sau cung chon Finish.
ng dung nhan c co the soan thao va quan ly d lieu van ban.

Ke tha hanh vi Serialize( CArchive ar ) cua lp view, da tren gia tr tra
ve t hanh vi IsStoring() cua oi tng tham so ar, chung ta co the t x ly
oc/ghi d lieu theo cau truc lu tr rieng.

11.8 RICH TEXT FORMAT (RTF) DOCUMENT APPICATION:
Chon File / New:
Trong hop hoi thoai New:
- Project type = MFC AppWizard.
- ProjectName = rtfDVF ( ten d an ).
- Location = Th muc cha d an.
Sau o chon OK.



An nh nh tren. Chon Next.
144 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

Chon None (khong s dung c s d lieu). Chon Next.

ng dung s dung OLE (Container) t ng dung khac. Chon Next.
Cac kien truc Document & View 145

Chon cac muc can thiet (11.7). Chon Next.

Chon cac muc can thiet (11.7). Chon Next.
146 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

An nh ten cac tap tin cha khai bao va cai at cua cac lp.
Lu y: Chon lp CRtfDVFView, khai bao lp c s la CRichEditView
e man hnh view cho phep soan thao va lien ket vi cac oi tng
OLE. Sau cung chon Finish. ng dung lam viec vi d lieu rtf.

11.9 HTML DOCUMENT VIEW APPICATION:
Chon File / New. Khi au nh (11.8); ProjectName = HtmlDVF.


An nh nh tren. Chon Next.
Cac kien truc Document & View 147

Chon None (khong s dung c s d lieu). Chon Next.

Chon None. Chon Next.
148 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

An nh cac muc can thiet; chon chc nang in an. Chon Next.

Chon cac muc can thiet (11.7). Chon Next.
Cac kien truc Document & View 149

An nh ten cac tap tin cha khai bao va cai at cua cac lp.
Lu y: Chon lp CHtmlDVFView, khai bao lp c s la CHtmlView e
man hnh view hien th c noi dung trang HTML. Chon Finish.
An nh URL: Hanh vi OnInitialUpdate cua lp CHtmlDVFView thc
hien an nh URL (v du: www.hcmueco.edu.vn) cho Navigate2.
ng dung nhan c co the am nhan cong viec Browser n gian.

e cai at thanh cong cu nh chng trnh Internet Explorer cho ng
dung, bc Step 4 of 6 ta chon muc: Internet Explorer Rebars.



11.10 MOT SO LP VIEW AC BIET:
11.10.1 CListView:
CListView la lp oi tng quan ly view dang danh sach (list).
CListView(); Tao lap oi tng view.
CListCtrl& GetListCtrl ( ); Tra ve oi tng CListCtrl lam c s cho
cac tac vu lien quan ListView.

Cac hanh vi ac trng cua CListCtrl:
BOOL SetBkColor( COLOREF cr ); at mau nen cho listview.
COLORREF GetBkColor(); Tra ve gia tr mau nen cua listview.
150 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
CImageList* SetImageList (
CImageList* pImagelist, // oi tng imagelist
int imgStyle // Thong so qui nh cach s dung
); Chon oi tng imagelist cha anh dung cho cac muc cua listview.
Cach s dung co the la:
LVSIL_NORMAL : Anh bnh thng.
LVSIL_SMALL : Anh nho.
int InsertItem (
int nItem, // Ch so muc c them
LPCTSTR lpszItem, // Noi dung thong bao cua muc
int nImage // Ch so anh trong Imagelist ma muc s dung
); Them mot muc vao listview.
BOOL DeleteItem (
int nItem // So hieu cua muc
); Xoa mot muc trong listview.
BOOL DeleteAllItems( ); Xoa rong listview.
BOOL GetItem (
LVITEM* pItem // Con tro en cau truc nhan thong tin
); Lay thong tin lien quan en muc co so th t nItem.
BOOL SetItem (
LVITEM* pItem // Con tro en cau truc cha thong so
); at thong so cho muc co ch so la pItem ->iItem.
BOOL EnsureVisible (
int nItem, // Ch so phan t can nhn thay.
BOOL bPartialIsOK // =FALSE: Toan bo, =TRUE: Mot phan
); Cuon danh sach e nhn thay phan t nItem neu phan t nay khong
c nhn thay trong vung hien th cho phep cua view.

11.10.2 CTreeView:
CTreeView la lp oi tng quan ly man hnh view co cau truc cay.
CTreeView( ); Tao lap oi tng treeview.
CTreeCtrl& GetTreeCtrl( ); Tra ve oi tng CTreeCtrl lam c s cho
cac tac vu lien quan TreeView.

Cac hanh vi ac trng cua CTreeCtrl:
BOOL SetBkColor( COLOREF cr ); at mau nen cho treeview.
COLORREF GetBkColor( ); Tra ve gia tr mau nen cua treeview.
CImageList* SetImageList (
Cac kien truc Document & View 151
CImageList* pImagelist, // Con tro oi tng imagelist
int imgStyle // Thong so qui nh cach s dung
); Chon oi tng imagelist cha anh dung cho cac muc cua treeview.
Cach s dung co the la:
TVSIL_NORMAL : Anh dung cho cac muc bnh thng.
TVSIL_STATE : Anh dung cho cac muc ac trng do ngi
dung nh ngha.
UINT GetCount( ); Tra ve so muc cua treeview.
HTREEITEM GetRootItem( ); Tra ve handle cua phan t au goc.
HTREEITEM GetFirstVisibleItem( ); Tra ve handle cua phan t hien
th au tien trong vung nhn thay cua treeview (NULL: Khong co).
HTREEITEM GetSelectedItem(); Tra ve handle cua phan t ang c
chon.
HTREEITEM GetNextVisibleItem( HTREEITEM hItem ); Tra ve
handle cua phan t hien th ke sau phan t co handle la hItem.
HTREEITEM GetPrevVisibleItem( HTREEITEM hItem ); Tra ve
handle cua phan t hien th ke trc phan t co handle la hItem.
HTREEITEM InsertItem (
LPCTSTR lpszItem, // Noi dung thong bao cua muc
int nImage, // Ch so anh dung cho muc trang thai
int nImageSelected, // bnh thng va khi muc c chon.
HTREEITEM parent = TVI_ROOT, // Con tro muc cha
HTREEITEM hInsertAfter = TVI_LAST // Con tro muc ng trc
); Them mot muc vao treeview, tra ve handle cua phan t mi them.
BOOL DeleteItem (
HTREEITEM hItem /* handle cua muc*/ ); Xoa muc cua treeview.
BOOL DeleteAllItems( ); Xoa rong noi dung treeview.
BOOL GetItem (
TVITEM* pItem // Con tro en cau truc nhan thong tin
); Lay thong tin cua phan t pItem->iItem.
BOOL SetItem (
TVITEM* pItem // Con tro en cau truc cha thong so
); at thong so cho phan t pItem->iItem.
BOOL SetItemImage (
HTREEITEM hItem, // handle cua phan t
int nImage, // Ch so anh dung cho muc trang thai
152 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
int nSelectedImage // bnh thng va khi muc c chon.
); An nh ch so anh trong imagelist dung cho muc.
BOOL SetItemText (
HTREEITEM hItem, // handle cua muc
LPCTSTR lpszItem // Noi dung thong bao
); An nh lai noi dung thong bao cua muc trong treeview.

11.10.3 CSplitterWnd:
Vung client trong frame window cho phep cai at mot ca so view duy
nhat. e long c nhieu view vao frame ta phai phan chia vung client cua
frame. Viec phan chia nay c ho tr bi cong cu splitter window.


Moi splitter window cho phep tach vung client cua frame window thanh
nhieu hang va cot. Sau o, moi o (pane) nhan c t splitter nay co the lai
c tach ra thanh nhieu hang va cot bi mot splitter khac. Trong v du tren:
- Splitter th nhat tach frame window thanh hai dong va 1 cot.
- Splitter th hai tach pane th nhat cua splitter th nhat thanh 2 cot
va 1 dong.
Moi pane nhan c t cac splitter window cho phep gan mot man hnh
view. Nh vay, thong qua cac splitter window, frame window co the cha
nhieu man hnh view ong thi.
Nham tien viec thao tac vi cong cu splitter window, MFC cung cap lp
oi tng CSplitterWnd cho phep quan ly cac spliiter window trong ng dung.
Cac hanh vi ac trng cua lp CSplitterWnd nh sau:
CSplitterWnd( ); Tao lap oi tng splitter window.
Cac kien truc Document & View 153
BOOL Create (
CWnd* pParentWnd, // Con tro oi tng ca so cha
int nMaxRows, // So hang toi a cua cac pane
int nMaxCols, // So cot toi a cua cac pane
SIZE sizeMin, // Kch thc toi thieu cua moi pane
CCreateContext* pContext, // Thong so lien ket, lay t frame
DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL |
WS_VSCROLL | SPLS_DYNAMIC_SPLIT,
UINT nID = AFX_IDW_PANE_FIRST
); Khi tao thong so spliiter window vi so hang, cot thay oi c.
BOOL CreateStatic (
CWnd* pParentWnd, // Con tro oi tng ca so cha
int nRows, // So hang cac pane c tao
int nCols, // So cot cac pane c tao
DWORD dwStyle = WS_CHILD | WS_VISIBLE, // Dang va
UINT nID = AFX_IDW_PANE_FIRST // So hieu
); Tao spliiter window vi so hang va cot co nh.
virtual BOOL CreateView (
int row, // Ch so hang va
int col, // ch so cot cua pane trong splitter
CRuntimeClass* pViewClass, // Cau truc cha thong tin lp view
SIZE sizeInit // Kch thc khi au cua pane
); Cai view vao mot pane xac nh trong splitter window.
pViewClass : Con tro oi tng CRuntimeClass quan ly thong tin cua
lp view tng ng tai thi iem thc thi chng trnh. Xem (11.4).
void SetColumnInfo (
int col, // Ch so cot trong splitter
int cxIdeal, // o rong mong muon va
int cxMin // o rong toi thieu (tnh bang pixel)
); An nh thong so ve o rong cho cot trong splitter window.
void GetColumnInfo (
int col, // Ch so cot
int& cxCur, // Tham bien cha o rong hien thi
int& cxMin // Tham bien cha o rong toi thieu
); Lay thong tin ve o rong cua cot.
void SetRowInfo (
154 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
int row, // Ch so hang
int cyIdeal, // o cao mong muon
int cyMin // o cao toi thieu
); An nh thong so ve o cao cho hang trong splitter window.
void GetRowInfo (
int row, // Ch so hang
int& cyCur, // Tham bien cha o cao hien thi
int& cyMin // Tham bien cha o cao toi thieu
); Lay thong tin ve o cao cua hang.
void RecalcLayout( ); Cap nhat thong so an nh mi cua splitter.
CWnd* GetPane (
int row, int col // Ch so hang va cot cua pane
); Tra ve con tro oi tng view cai trong pane.

11.10.4 S DUNG SPLITTERWND TRONG FRAME WINDOW:
Khai bao oi tng thuoc lp SplitterWnd nh la thuoc tnh cua frame.


CSplitterWnd m_splitter;


Dung hanh vi OnCreateClient cua frame e tao cac pane va cai view:

BOOL CEmpFrame::OnCreateClient (
LPCREATESTRUCT lpcs,
CCreateContext* pContext )
{
if (!CFrameWnd::OnCreateClient(lpcs, pContext))
return FALSE;

// Dung oi tng splitter tach vung client cua frame
m_splitter.CreateStatic ( this , 1, 2 ); // V du: 1 hang, 2 cot
// Gan cac view tng ng vao cac pane tao c:
m_splitter.CreateView ( 0, 0, RUNTIME_CLASS(viewClass1),
CSize(120,0), NULL);
m_splitter.CreateView(0,1, RUNTIME_CLASS(viewClass2),
CSize(0,0), NULL);
... // Thc hien cac cai at khac
return TRUE;
}
11.10.5 CAC V DU THC HANH:
Cac kien truc Document & View 155
Thc hanh 1: Viet ng dung nh VD30. Tao splitter trong CEmpFrame vi
hai view: ben trai la treeview (dung lp view ke tha t CTreeView), ben
phai la list (dung lp view ke tha t ListView).

Tao d an VD35 tng t VD30.
ang ky s dung CTreeView va CListView:
Trong tap tin stdafh.h cua d an, bo sung ch th:
#include <afxcview.h>
Bo sung vao d an hai lp mi:
CEmpTree ke tha t CTreeView
CEmpList ke tha t CListView.
Cach thc hien tng t nh a lam vi CEmpWnd, muc (5.4.1).
Khai bao oi tng thuoc tnh protected m_splitter kieu CSplitterWnd.
Hanh vi OnCreateClient cua CEmpFrame thc hien khi tao va cai at
cac pane, view can thiet:

BOOL CEmpFrame::OnCreateClient( LPCREATESTRUCT lpcs,
CCreateContext* pContext )
{
if (!CFrameWnd::OnCreateClient(lpcs, pContext))
return FALSE;

m_splitter.CreateStatic(this, 1, 2);
m_splitter.CreateView( 0, 0, RUNTIME_CLASS(CEmpTree),
CSize(120,0), NULL );
m_splitter.CreateView(0,1, RUNTIME_CLASS(CEmpList),
CSize(0,0), NULL );
return TRUE;
}

Thc hanh 2: Thc hien ng dung tng t VD35. T ong thc hien bo
sung ba phan t trong treeview, moi phan t co hai phan t con. Cac phan
t eu co hnh minh hoa cho trang thai c chon va khong c chon.

Tao d an VD36 tng t VD35.
Bo sung bitmap resource cha hai anh cung kch thc: . at so
hieu cho bitmap resource la IDB_IMGTREE.
Hanh vi OnCreate cua CEmpTree ang ky s dung anh va bo sung cac
phan t can thiet:
int CEmpTree::OnCreate(LPCREATESTRUCT lpCreateStruct)
156 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
{
if (CTreeView::OnCreate(lpCreateStruct) ==-1)
return -1;

static CImageList img; // use only in this function
img.Create(IDB_IMGTREE, 16, 2, RGB(255,255,255));

CTreeCtrl& myCtrl =GetTreeCtrl(); // Based control
myCtrl.SetImageList(&img, TVSIL_NORMAL);

HTREEITEM hihi; // Add needed items
hihi =myCtrl.InsertItem("Muc 1", 0, 1);
myCtrl.InsertItem("Muc 11", 0, 1, hihi);
myCtrl.InsertItem("Muc 12", 0, 1, hihi);
hihi =myCtrl.InsertItem("Muc 2", 0, 1);
myCtrl.InsertItem("Muc 21", 0, 1, hihi);
myCtrl.InsertItem("Muc 22", 0, 1, hihi);
hihi =myCtrl.InsertItem("Muc 3", 0, 1);
myCtrl.InsertItem("Muc 31", 0, 1, hihi);
myCtrl.InsertItem("Muc 321", 0, 1,
myCtrl.InsertItem("Muc 32", 0, 1, hihi));
return 0;
}

Hanh vi ke tha PreCreateWindow an nh thong so dang treeview:

BOOL CEmpTree::PreCreateWindow(CREATESTRUCT& cs) {
cs.style |= TVS_HASLINES|TVS_LINESATROOT|
TVS_HASBUTTONS;
return CTreeView::PreCreateWindow(cs);
}

Mot so thong so an nh dang cua treeview:
TVS_HASLINES : Treeview co ng noi gia cac muc.
TVS_LINESATROOT : ng noi t goc.
TVS_HASBUTTONS : Co nut m , ong muc.
TVS_SINGLEEXPAND : Cho phep m 1 muc duy nhat moi luc.
TVS_xxx : Xem MSDN.

THC HANH:
Cac kien truc Document & View 157
1. Tao ng dung soan thao van ban (text). ng dung cho phep ngi dung at
password bao ve d lieu. Ch m c d lieu neu co password hp le.
2. Tng t bai tap 1 cho ng dung RTF view.
3. Viet ng dung HTMLView: Thanh cong cu rebar (nh IE cua Microsoft);
Backward, Forward, hop combobox nhap va ghi nh cac URL a nhap.
4. Phat trien VD36 thanh ng dung cho phep xem cau truc o a, cay th muc
tren may nh windows explorer.
HD: Xem ham FindFirstFile() va FindNextFile().
5. Tao c s d lieu Access. Dung bo DVF (V = FormView) thch hp e xem
va cap nhat d lieu cho cac bang trong c s d lieu.
6. Viet ng dung RTF View. Trong man hnh view, khi di chuyen chuot len
cac noi dung co chnh dang gach di th thc hien chuyen dang con chuot
thanh , ngc lai chnh dang chuot ve dang mac nhien cua he thong.
7. Viet ng dung thi trac nghiem n gian: Man hnh view rtf cho phep hien
th van ban chnh dang va hnh anh phan anh noi dung cua cac cau hoi va cac
ap an la chon. Hien th dau chon khi ngi dung anh dau ap an.
8. Quan sat chng trnh tra cu t ien. Viet ng dung RTF view s dung
mot cua so con kieu CEdit. Khi thc hien double tren mot t bat ky trong man
hnh view rtf th kch hoat ca so con va ien t va chon vao ca so con nay.
Khi ngi dung click vao view, ca so con t ong bien mat.
9. Quan sat chng trnh thi trac nghiem TOEFL. Viet ng dung nh bai tap
so 8, Khi thc hien double tren mot dong bat ky trong man hnh view rtf th
kch hoat ca so con va ien noi dung dong c chon vao ca so con nay,
Khi click vao ca so view, noi dung chnh sa c cap nhat vao view.
10. Quan sat Yahoo Messenger!. Thc hien ng dung giao dien rtf nh sau:

158 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
CHNG 12:

Mot so van e trong windows

12.1 TAP TIN INI:
Tap tin INI la tap tin van ban cha cac noi dung phuc vu cho hoat ong
cua ng dung trong moi trng windows phien ban 3.x va 9x. Cac noi dung
nay c chia thanh cac thanh phan (section) phan biet theo chc nang hoac
theo nhom ng dung con. Moi thanh phan cha cac muc vi ten goi xac nh
va phan biet vi cac muc khac trong cung thanh phan. Moi muc tng ng
vi mot gia tr duy nhat. Gia tr cua muc c viet ngay sau ten muc, va c
ngan cach vi ten muc bang dau "=".

Xet v du la tap tin WIN.INI noi tren:
- windows : Ten thanh phan (section).
- NullPort : Ten muc (entry).
- None : Gia tr cua muc NullPort.

Viec truy xuat gia tr cac muc trong tap tin INI c ho tr bi lp oi
tng quan ly ng dung CWinApp thong qua cac thuoc tnh, hanh vi sau:
const char* m_pszAppName : Lu chuoi ten cua ng dung. Gia tr
thuoc tnh nay co the c thay oi c nh sau:
free( (void*) m_pszAppName ); // Giai phong vung nh
m_pszAppName =_tcsdup( _T(Ten_mi_cua_ng_dung) );
Mot so van e trong Windows 159
const char* m_pszProfileName : Lu ng dan va ten tap tin INI s
dung bi ng dung. Co the thay oi gia tr nay e an nh tap tin INI:
free((void*)m_pszProfileName); // Huy bo vung nh cap phat
m_pszProfileName=_tcsdup(_T(ngDan-TenTapTin_INI));
BOOL WriteProfileString (
LPCTSTR lpszSection, // Ten thanh phan
LPCTSTR lpszEntry, // Ten muc
LPCTSTR lpszValue // Gia tr cua muc (kieu chuoi)
); Lu gia tr kieu chuoi cua mot muc trong thanh phan xac nh.
BOOL WriteProfileInt (
LPCTSTR lpszSection, // Ten thanh phan
LPCTSTR lpszEntry, // Ten muc
int nValue // Gia tr cua muc (so nguyen)
); Lu gia tr kieu so nguyen cua mot muc trong thanh phan xac nh.
BOOL WriteProfileBinary (
LPCTSTR lpszSection, // Ten thanh phan
LPCTSTR lpszEntry, // Ten muc
LPBYTE pData, // Vung em cha gia tr ma
UINT nBytes // Kch thc vung em
); Lu khoi ma nh phan cua mot muc trong thanh phan xac nh.
CString GetProfileString (
LPCTSTR lpszSection, // Ten thanh phan
LPCTSTR lpszEntry, // Ten muc. Neu muc oc khong
LPCTSTR lpszDefault = NULL // co th s dung gia tr nay.
); Tra ve gia tr kieu chuoi cua mot muc trong thanh phan tng ng.
UINT GetProfileInt (
LPCTSTR lpszSection, // Ten thanh phan
LPCTSTR lpszEntry, // Ten muc. Neu muc oc khong
int nDefault // co th s dung gia tr nay.
); Tra ve gia tr kieu so nguyen cua mot muc trong thanh tng ng.
BOOL GetProfileBinary (
LPCTSTR lpszSection, // Ten thanh phan
LPCTSTR lpszEntry, // Ten muc
LPBYTE *pData, // a ch con tro vung em
UINT *nBytes // a ch bien nhan kch thc.
); oc khoi ma nh phan cua mot muc vao vung em.
160 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Hanh vi tra ve gia tr TRUE neu tac vu oc thanh cong.
Vi: pData : a ch bien con tro quan ly vung em nhan thong tin.
nBytes : a ch bien cha kch thc thong tin oc c.
ng dung can giai phong vung em pData khi cham dt s dung.

oan chng trnh sau thc hien ghi xuong thanh phan MY_TEST
cua tap tin INI cua ng dung: MyName = Mr.Emp va MyVer = 11.
CWinApp* pApp =AfxGetApp(); // oi tng quan ly ng dung
pApp->WriteProfileString ("MY_TEST", "MyName", "Mr.Emp");
pApp->WriteProfileInt ("MY_TEST", "MyVer", 11);

oan chng trnh sau thc hien oc t thanh phan MY_TEST cua
tap tin INI gia tr hai muc noi tren.
CWinApp* pApp =AfxGetApp(); // oi tng quan ly ng dung
CString myName =pApp->GetProfileString (
"MY_TEST", "MyName", "Mr.Emp" );
UINT myVer =pApp->GetProfileInt ("MY_TEST", "MyVer", 11);

12.2 SYSTEM REGISTRY:
System Registry la c s d lieu do windows quan ly, c s dung e lu
tr cac noi dung phuc vu cho hoat ong cua he thong va cac ng dung.
System registry co cau truc nh sau (chng trnh RegEdit.exe).


(System registry mot may s dung phien ban Windows-Me )
Mot so van e trong Windows 161
- Moi muc trong cau truc cay (tree) goi la khoa (key).
- Khoa la (khong co con) la thanh phan cha cac muc.
- Moi muc co mot ten e nhan biet va co mot gia tr xac nh.
Hanh vi SetRegistryKey cua lp oi tng CWinApp cho phep nh hng
viec oc/ghi gia tr cac muc len system registry thay v s dung tap tin INI
nh (12.1). Hanh vi loai protected nay co cu phap nh sau:

void SetRegistryKey ( UINT lpszRegistryKey );

lpszRegistryKey : Thong thng la chuoi cha ten hang phan mem; v
du Netscape. Gia tr nay tr thanh khoa con cua khoa Software thuoc
khoa goc HKEY_CURRENT_USER trong system registry.

Khi ng dung thc hien oc/ghi gia tr muc, ten cua ng dung (lu trong
m_pszAppName cua oi tng ng dung) tr thanh khoa con cua khoa xac
nh bi lpszRegistryKey, va cac thanh phan cha cac muc tr thanh khoa
con cua khoa m_pszAppName. Mot th t c thiet lap nh sau:
HKEY_CURRENT_USER\Software\<Ten_hang_phan_mem>\
<Ten_ng_dung>\<Ten_thanh_phan>\<Cac_muc>.
Thc hien ng dung IniReg. ng dung ang ky s dung system registry
vi khoa "Mr.Emp", ong thi tien hanh cac tac vu oc / ghi hai gia tr nh
v du muc (12.1).
Sau ay la cac bc thc hien d an cua ng dung:
Dung MFC Wizard tao d an IniReg vi giao dien chnh la dialog.
Hanh vi InitInstance cua lp oi tng quan ly ng dung thc hien at
lai ten cho ng dung va ang ky s dung registry vi khoa "Mr.Emp":

BOOL CIniRegApp::InitInstance()
{
free((void*)m_pszAppName); // Giai phong vung nh
m_pszAppName=_tcsdup( _T("IniReg") ); // at ten ng dung
SetRegistryKey( _T("Mr.EMP") ); // ang ky registry
CIniRegDlg dlg;
m_pMainWnd =&dlg;
dlg.DoModal(); // Thc hien giao dien
return TRUE;
}
Thc hien cac bo sung sau cho lp dialog giao dien CIniRegDlg:
- M dialog resource, cai at cac control sau:
162 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
- Hop nhap gia tr muc MyName Edit IDC_WRITE_NAME
- Hop nhap gia tr muc MyVer Edit IDC_WRITE_VERSION
- Hop hien th muc MyName Static IDC_READ_NAME
- Hop hien th muc MyVer Static IDC_READ_VERSION
- Nut chon thc hien ghi Button IDC_WRITE
- Nut chon thc hien oc Button IDC_READ
- Hanh vi OnWrite ng vi nut IDC_WRITE lu gia tr cac muc:

void CIniRegDlg::OnWrite()
{
CWinApp* pApp =AfxGetApp();
CString myName;
UINT myVer;
GetDlgItemText(IDC_WRITE_NAME, myName);
myVer =GetDlgItemInt(IDC_WRITE_VERSION);
pApp->WriteProfileString("MY_TEST", "MyName", myName);
pApp->WriteProfileInt("MY_TEST", "MyVer", myVer);
}

- Hanh vi OnRead ng vi nut IDC_READ oc gia tr cac muc:
void CIniRegDlg::OnRead()
{
CWinApp* pApp =AfxGetApp();
CString myName;
UINT myVer;
myName =pApp->GetProfileString( "MY_TEST",
"MyName", "NoName" );
myVer =pApp->GetProfileInt( "MY_TEST", "MyVer", 0 );
SetDlgItemText( IDC_READ_NAME, myName );
SetDlgItemInt( IDC_READ_VERSION, myVer );
}
Bien dch va chay ng dung.

12.3 VUNG STATUS AREA TREN TASKBAR:


Mot so van e trong Windows 163
Taskbar la thanh cong cu ac biet cua ng dung desktop trong windows.
Noi dung cua taskbar c chia thanh 4 thanh phan chnh:
- Start menu: Muc kch hoat he thong menu cac ng dung.
- Quick Launch Bar: Danh muc cac ng dung thng dung.
- Taskbar Buttons: Danh sach cac ng dung ang chay.
- Status Area: Cha icon giao dien cua cac ng dung ang chay.
ng dung co the nhan c tn hieu nhap cua
ngi dung khi ho dung phm hoac chuot tac
ong len icon cua ng dung tren status area.
Viec cai at hoac huy bo icon giao dien cua ng dung tren status area
uc thc hien thong quan ham sau:
BOOL Shell_NotifyIcon (
DWORD dwMessage, // Tac vu thc hien
PNOTIFYICONDATA lpdata // Cau truc cha thong so lien quan
); Tra ve gia tr TRUE neu tac vu thc hien thanh cong.
dwMessage : An nh tac vu thc hien.
NIM_ADD : Tao icon giao dien cua ng dung tren status area.
NIM_MODIFY : Thay oi thong so lien quan icon giao dien.
NIM_DELETE : Xoa icon giao dien cua ng dung tren status area.
lpdata : a ch cau truc NOTIFYICONDATA cha cac thong so.

Cac trng trong cau truc NOTIFYICONDATA co y ngha nh sau:
typedef struct _NOTIFYICONDATA {
DWORD cbSize; // Kch thuc cau truc
HWND hWnd; // Handle cua ca so x ly message t icon
UINT uID; // So hieu cua icon tren status area
UINT uFlags; // Qui nh cac thong so co y ngha
UINT uCallbackMessage; // So hieu message cua icon gi ca so.
HICON hIcon; // Handle cua icon c s dung
TCHAR szTip[64]; // Noi dung chu thch cua icon giao dien.
} NOTIFYICONDATA, *PNOTIFYICONDATA;

uFlags : Qui nh trng thong so trong cau truc co y ngha s dung.
NIF_MESSAGE : Trng uCallbackMessage c s dung.
NIF_ICON : Trng hIcon c s dung.
NIF_TIP : Trng szTip c s dung.
uCallbackMessage : So hieu message se gi tra ve t icon giao dien.
164 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Khi ngi dung tac ong len icon giao dien cua ng dung, he thong gi
mot message en ca so x ly lien quan icon vi noi dung nh sau:
- message : So hieu message cua icon (trong uCallbackMessage).
- wParam : So hieu cua icon.
- lParam : Cha cac trang thai cua chuot hoac phm ma ngi
dung a s dung e tac ong len icon giao dien.
Hanh vi WindowProc cua ca so x ly lien quan se tuy nghi x ly:
LRESULT CTaskbarIconDlg::WindowProc ( UINT message,
WPARAM wParam, LPARAM lParam )
{
if ( message ==Icon_uCallbackMessage ) {
switch ( lParam ) {
// X ly bien co phm / chuot trong lParam
}
return 0 ;
}
return CDialog::WindowProc(message, wParam, lParam);
}

Gia s can thc hien ng dung nh sau:

- Set Icon: Cai icon cua ng dung len status area.
- Remove Icon: Xoa icon cua ng dung khoi status area.
- Hop thong bao cho biet cac bien co nhap tac ong len icon.
Mot so van e trong Windows 165
Cac bc thc hien d an cua ng dung:
Dung MFC Wizard tao ng dung TaskbarIcon co giao dien la dialog.
Thc hien cac bo sung sau ay cho lp dialog CTaskbarIconDlg:
- M dialog resource, cai at cac control sau:
- Hop thong bao trang thai icon Static IDC_ICON_INFO
- Nut thc hien at icon Button IDC_ICON_SET
- Nut thc hien xoa icon Button IDC_ICON_REMOVE
- Khai bao thuoc tnh protected m_isIconShow kieu luan ly, e ghi
nhan tnh trang at icon; m_isIconShow = FALSE : icon cha c
at, m_isIconShow = TRUE : icon a c at.
- Hanh vi OnInitDialog chuan b cac thong so:
BOOL CTaskbarIconDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_isIconShow =FALSE; // Bat au, icon cha c at.
return TRUE;
}

- Hanh vi OnIconSet ng vi nut chon IDC_ICON_SET thc hien cai
icon giao dien len status area:

void CTaskbarIconDlg::OnIconSet()
{
if ( m_isIconShow ) return;
NOTIFYICONDATA dt;
memset(&dt, 0, sizeof( NOTIFYICONDATA ) );
dt.cbSize =sizeof(NOTIFYICONDATA);
dt.uID =100;
dt.hIcon =AfxGetApp()->LoadIcon(IDR_MAINFRAME);
dt.hWnd =this->GetSafeHwnd();
dt.uCallbackMessage =WM_USER + 10;
dt.uFlags =NIF_MESSAGE | NIF_ICON | NIF_TIP;
strcpy(dt.szTip,"Mr.Emp, hello world !");
if ( Shell_NotifyIcon( NIM_ADD, &dt ) )
m_isIconShow =TRUE; // at icon thanh cong
}

- Hanh vi OnIconRemove ng vi nut chon IDC_ICON_REMOVE
thc hien xoa icon giao dien khoi status area:
166 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
void CTaskbarIconDlg::OnIconRemove()
{
if ( !m_isIconShow ) return;
NOTIFYICONDATA dt;
memset(&dt, 0, sizeof(NOTIFYICONDATA));
dt.cbSize =sizeof(NOTIFYICONDATA);
dt.uID =100;
dt.hWnd =this->GetSafeHwnd();
if ( Shell_NotifyIcon( NIM_DELETE, &dt ) )
m_isIconShow =FALSE; // Xoa icon thanh cong
}
- Hanh vi WindowProc x ly thong tin nhap tac ong len icon:
LRESULT CTaskbarIconDlg::WindowProc(UINT message,
WPARAM wParam, LPARAM lParam)
{
if ( message ==WM_USER + 10 ) {
// WM_USER +10 : so hieu messge ang ky cho icon.
// X ly cac thao tac bam nut chuot (BT) cua ngi dung.
switch (lParam) {
case WM_MOUSEMOVE:
SetDlgItemText(IDC_ICON_INFO, "Mouse moves!");
break;
case WM_LBUTTONDOWN:
SetDlgItemText(IDC_ICON_INFO, "Left BT down !");
break;
case WM_LBUTTONUP:
SetDlgItemText(IDC_ICON_INFO, "Left BT up !");
break;
case WM_RBUTTONDOWN:
SetDlgItemText(IDC_ICON_INFO, "Right BT down !");
break;
case WM_RBUTTONUP:
SetDlgItemText(IDC_ICON_INFO, "Right BT up !");
break;
}
return 0;
}
return CDialog::WindowProc(message, wParam, lParam);
}
Bien dch va chay ng dung.
Mot so van e trong Windows 167
12.4 NG DUNG SCREEN SAVER:
ScreenSaver la ng dung c lu trong tap tin chng trnh co phan m
rong .SCR. e s dung ng dung ScreenSaver, ta chep tap tin chng trnh
cua ng dung vao th muc he thong, sau o s dung chc nang Desktop cua
Control Panel (Desktop Properties) cai at ng dung ScreenSaver cho he
thong thong qua trang Screen Saver:



Ten tap tin chng trnh cua ng dung ScreenSaver c dung lam ten
ScreenSaver trong danh sach la chon cac ScreenSaver. Neu ta khai bao
mot hang chuoi vi so hieu la 1 trong StringTable resource cua ng dung
th noi dung hang chuoi nay (khong c nhieu hn 64 ky t) c dung
lam ten ScreenSaver trong danh sach noi tren.
168 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Khi khoang thi gian ma ngi dung ngng tng tac vi he thong vt
qua gia tr an nh Wait th he thong t ong thc hien ng dung
ScreenSaver.

12.4.1 ac iem:
Khac vi cac ng dung thong thng khac, ng dung ScreenSaver phai co
kha nang ng x khac nhau trong cac tnh huong khac nhau ma ng dung
c thc hien. Cac tnh huong thc hien co the xay ra oi vi mot ng dung
ScreenSaver la:
(a) Chay minh hoa trc tiep ScreenSaver trong man hnh con cua hop hoi
thoai: Khi ngi dung click chon ng dung ScreenSaver trong danh
sach cac ScreenSaver cua hop hoi thoai Display Properties / Screen
Saver.
(b) Thc hien chc nang an nh thong so cua ScreenSaver: Khi ngi
dung click chon muc Setting... sau khi a chon ng dung ScreenSaver
trong danh sach cac ScreenSaver.
(c) Thc hien chc nang at Password cua ScreenSaver: Khi ngi dung
click chon muc Password Setting... sau khi a chon ng dung
ScreenSaver trong danh sach cac ScreenSaver. Ch s dung cho cac
phien ban Win9x tr ve trc.
(d) Chay minh hoa ScreenSaver trong man hnh thc: Khi ngi dung
click chon muc Preview sau khi a chon ng dung ScreenSaver trong
danh sach cac ScreenSaver. Che o chay nay tng t che o chay
thc nham giup ngi dung hnh dung c hoat ong thc cua
ScreenSaver.
(e) Chay ScreenSaver: Khi khoang thi gian ma he thong ngng tng
tac vi ngi dung ln hn khoang thi gian ch cho phep. ay la
che o chay thc cua ScreenSaver.

12.4.2 Tham so dong lenh (Command Line Parameters):
Moi khi thc hien ng dung ScreenSaver, he thong cung cap thong tin ve
tnh huong cu the ma ng dung c thc hien thong qua noi dung tham so
dong lenh gi en cho chng trnh cua ng dung. ng dung ScreenSaver
phai lay thong tin nay t tham so dong lenh nham la chon x ly phu hp.
Thuoc tnh m_lpCmdLine cua oi tng quan ly tieu trnh chnh trong ng
dung cha chuoi tham so dong lenh truyen cho ng dung. Noi dung cua thuoc
tnh nay khac nhau tuy theo tnh huong thc hien ng dung khac nhau. Tng
ng cac trng hp (12.4.1), noi dung tham so dong lenh co the la:
Mot so van e trong Windows 169
(a) Chay minh hoa trc tiep ScreenSaver: Vung chay mau la ca so con
trong hop hoi thoai Display Properties. Handle cua ca so nay la mot
gia tr trong tham so dong lenh co noi dung nh sau:
"/p xxxx"
Trong o:
- /p (hoac /P): Gia tr phan anh tnh huong thc hien.
- xxxx : Cac ch so phan anh gia tr handle cua ca so con.
Cach lay gia tr handle nay t tham so dong lenh nh sau:
HWND parent; // Bien cha handle
sscanf(m_lpCmdLine+3, "%d", &parent);
che o nay, ScreenSaver c thiet ke theo kieu ng dung co
man hnh giao dien chnh la ca so vi noi dung hoat ong nh chay
thc. Ca so nay c long vao v tr cua ca so con noi tren.
(b) Thc hien chc nang an nh thong so: Noi dung tham so dong lenh
nh sau:
"/c xxxx"
Trong o:
- /c (hoac /C) : Gia tr phan anh tnh huong thc hien.
- xxxx : Handle cua hop hoi thoai (dialog).
che o nay, ScreenSaver c thiet ke theo kieu ng dung co
man hnh giao dien chnh la dialog vi cac muc nhap cho phep ieu
chnh thong so lien quan en cach thc hoat ong cua ScreenSaver
che o thc. Dialog giao dien la dialog khoa (modal dialog) va oi
tng ca so cha cua no la hop hoi thoai noi tren.
(c) Thc hien chc nang at Password: Noi dung tham so dong lenh nh
sau:
"/a xxxx"
Trong o:
- /a (hoac /A): Gia tr nhan dien tnh huong thc hien.
- xxxx : Handle cua ca so hoi thoai.
che o nay, ScreenSaver c thiet ke theo kieu ng dung co
man hnh giao dien chnh la dialog. Dialog giao dien co the la dialog
dung at password cua he thong (th vien MPR.DLL) hoac dialog
cua ngi dung.
(d) Chay minh hoa ScreenSaver: Noi dung tham so dong lenh nh sau:
"/s"
170 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Trong o:
- /s (hoac /S): Gia tr nhan dien tnh huong thc hien.
che o nay, ScreenSaver thc hien x ly nh chay thc.
(e) Chay ScreenSaver: che o nay, ScreenSaver c thiet ke theo
kieu ng dung co man hnh giao dien chnh la ca so vi noi dung
hoat ong. Ca so nay thng co cung kch thc va v tr vi ca so
desktop cua he thong.

Phan la chon trnh huong x ly cua ng dung ScreenSaver c cai
at trong hanh vi InitInstance cua oi tng quan ly ng dung.

12.4.3 ac iem giao tac vi ngi dung:
Cac ng dung ScreenSaver co ac iem chung la cham dt hoat ong khi
nhan c tn hieu nhap cua ngi dung (go phm, click hay di chuyen chuot).
Do o, chng trnh ScreenSaver phai x ly cac message lien quan viec nhap
lieu:
- Cac message do tac ong len ban phm:
WM_KEYDOWN, WM_KEYUP
- Cac message do tac ong len chuot:
WM_MOUSEMOVE,
WM_LBUTTONDOWN, WM_LBUTTONUP,
WM_RBUTTONDOWN, WM_RBUTTONUP,
WM_MBUTTONUP, WM_MBUTTONDOWN
Thong thng, khi nhan c mot trong cac message nay th ng
dung t ong ket thuc.

Trong luc ScreenSaver hoat ong, can ngan cam cam ngi dung go phm
Ctrl+Alt+Del e qua mat ng dung. Viec ngan cam nay thc hien nh sau:
UINT oldval; // Dung bao lu trang thai
// Bat au, cam phm:
SystemParametersInfo ( SPI_SETSCREENSAVERRUNNING,
1 , &oldval, 0 );
... // Phan thc hien cua ScreenSaver

// Cuoi cung, thoi cam phm:
SystemParametersInfo ( SPI_SETSCREENSAVERRUNNING,
0, &oldval, 0);
12.4.4 Thc hien ng dung ScreenSaver n gian:
Mot so van e trong Windows 171
Gia s can thc hien ng dung ScreenSaver vi noi dung hoat ong la
hien th cau chao "Hello !". Cac bc thc hien nh sau:
Tao d an ScreenSaver tng t d an VD01.
Bo sung lp CEmpScreenSaverWnd ke tha t lp CWnd cho d an.
Thc hien cai at cho lp CEmpScreenSaverWnd nh sau:
- Hanh vi OnPaint hien th thong bao "Hello !" chnh gia vung
client cua ca so.

void CEmpScreenSaverWnd::OnPaint()
{
CPaintDC dc(this); // device context e ve

// Do ScreenSaver's works here :
LOGFONT lf;
CFont font, *oldFont;

memset(&lf, 0, sizeof(LOGFONT));
strcpy(lf.lfFaceName, "Arial");
lf.lfHeight =50; lf.lfWidth =14;
font.CreateFontIndirect(&lf); // Tao font ch e s dung
oldFont =dc.SelectObject(&font); // va lu font ch cu.

RECT rect;
dc.GetClipBox(&rect); // Xoa nen DC
dc.FillRect(&rect, &CBrush(RGB(0, 128,128)));

dc.SetBkMode(TRANSPARENT);
rect.top +=3; rect.left+=3;
dc.SetTextColor(RGB(0, 0, 128));
dc.DrawText("Hello !", 7, &rect,
DT_CENTER | DT_VCENTER | DT_SINGLELINE);
rect.top -=3; rect.left -=3;
rect.bottom -=3; rect.right -=3;
dc.SetTextColor(RGB(255, 255, 0));
dc.DrawText("Hello !", 7, &rect,
DT_CENTER | DT_VCENTER | DT_SINGLELINE);
dc.SelectObject(oldFont); // Khoi phuc lai font ch cu
}
172 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
- Cac hanh vi x ly message cua chuot va ban phm: OnKeyDown,
OnLButtonDown, OnMouseMove, OnRButtonDown thc hien gi
message ong ca so:

PostMessage( WM_CLOSE, 0, 0 );
Tao mi dialog resource va lp CEmpScreenSaverDlg ke tha t
CDialog s dung dialog resource nay. Dialog CEmpScreenSaverDlg
cho phep ngi dung chnh sa cac thong so lien quan en hoat ong
cua ng dung ScreenSaver. Co the lu cac thong so an nh bi ngi
dung vao system registry (12.2).
Bo sung va chnh sa lp quan ly ng dung CEmpApp nh sau:
- Bo sung cac thuoc tnh protected quan ly hoat ong ScreenSaver:
BOOL m_bFullDemo;
UINT Ctrl_Alt_Del_State;
- Hanh vi InitInstance la chon x ly e thc hien mot cach phu hp
vi cac tnh huong hoat ong cua ng dung:
BOOL CEmpApp::InitInstance()
{
m_bFullDemo =FALSE; // Lu che o minh hoa
HWND parent; // Handle ca so cha
RECT rect; // V tr ca so ng dung
DWORD exstyle =0, style; // Dang ca so ng dung
sscanf(m_lpCmdLine +3, "%d", &parent);
switch (m_lpCmdLine[1]) {
case 'c':
case 'C':
// Chc nang an nh thong so
CEmpScreenSaverDlg* main;
CWnd* pr;
pr =new CWnd();
pr->Attach(parent);
main =new CEmpScreenSaverDlg(pr);
m_pMainWnd =main;
main->DoModal();
pr->Detach();
delete main;
delete pr;
return FALSE;
Mot so van e trong Windows 173
case 'a':
case 'A':
// at Password (khong dung cho WinNT-Win2000)
// S dung hop Password cua he thong cho tng thch.
typedef VOID (WINAPI *PWDCHANGEPASSWORD) (
LPCSTR lpcRegkeyname,
HWND hwnd,UINT uiReserved1,
UINT uiReserved2 );
PWDCHANGEPASSWORD PwdChangePassword;
HINSTANCE hmpr;
hmpr =::LoadLibrary("MPR.DLL");
if (hmpr ==NULL) return FALSE;
PwdChangePassword =(PWDCHANGEPASSWORD)
::GetProcAddress(hmpr, "PwdChangePasswordA");
if (PwdChangePassword !=NULL)
PwdChangePassword("SCRSAVE",parent,0,0);
FreeLibrary(hmpr);
return FALSE;
case 'p':
case 'P':
// Xem minh hoa trong man hnh con
style =WS_CHILD | WS_VISIBLE | WS_DISABLED ;
break;
default:
// Che o chay thc cua ScreenSaver
m_bFullDemo =TRUE;
parent =GetDesktopWindow();
exstyle =WS_EX_TOOLWINDOW | WS_EX_TOPMOST;
style =WS_POPUP | WS_VISIBLE;
}
// Xac nh che o chay cu the
CEmpScreenSaverWnd* main;
main =new CEmpScreenSaverWnd;
m_pMainWnd =main;
POINT p1, p2; // Goc trai tren, phai di
GetWindowRect (parent, &rect); // Xac nh v tr ca so cha
p1.x =rect.left; p1.y =rect.top;
p2.x =rect.right; p2.y =rect.bottom;

174 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
if (!m_bFullDemo) {
// Chay trong ca so con :
// Xac nh toa o ca so con trong hop Display Properties
ScreenToClient ( parent, &p1 );
ScreenToClient ( parent, &p2 );
}
// Ca so giao dien chnh co toa o va kch thc thch hp
main->CreateEx(exstyle, _T("STATIC"),"Emp.ScreenSaver",
style, p1.x, p1.y, p2.x, p2.y, parent, NULL);
// Dau con chuot va khoa phm neu chay ScreenSaver thc
if (m_bFullDemo) {
ShowCursor(FALSE);
main->SetCapture();
SystemParametersInfo (
SPI_SETSCREENSAVERRUNNING,
1,&Ctrl_Alt_Del_State, 0
);
}
main->UpdateWindow();
return TRUE;
}

- Hanh vi ExitInstance thc hien g bo cac cai at:

int CEmpApp::ExitInstance()
{
if (m_bFullDemo) {
ReleaseCapture();
ShowCursor(TRUE);
SystemParametersInfo (
SPI_SETSCREENSAVERRUNNING,
0, &Ctrl_Alt_Del_State, 0
);
}
return CWinApp::ExitInstance();
}

Tao hang chuoi tuy y co so hieu la 1 trong StringTable resource.
Bien dch ng dung. Chep tap tin chng trnh (.exe) vao th muc he
thong va oi ten tap tin vi phan m rong la .SCR.
S dung Control Panel / Display / ScreenSaver kiem tra ket qua.
Mot so van e trong Windows 175
12.5 NG DUNG S DUNG NHIEU TIEU TRNH:
Viec thiet lap cac tieu trnh con ho tr cho tieu trnh chnh trong chng
trnh cua ng dung cho phep ng dung ong thi ap ng nhieu yeu cau cua
ngi dung. Cac tieu trnh ho tr co the thc hien cac x ly ben trong (tieu
trnh x ly noi worker thread) hoac trc tiep nhan va thc hien cac yeu cau
cua ngi dung (tieu trnh giao dien user interface thread).
12.5.1 Tieu trnh x ly noi:
Tieu trnh x ly noi am nhan cac x ly tnh toan ben trong, khong trc
tiep tng tac vi ngi dung. Viec thiet lap tieu trnh x ly noi trong chng
trnh c thc hien thong qua cac noi dung sau ay:
Xay dng ham am nhan viec ieu khien toan bo hoat ong x ly cua
tieu trnh (Thread Procedure). Ham nay co khai bao nh sau:
UINT MyThreadProc ( LPVOID pParam );
pParam : Tham so duy nhat ma ham ieu khien nhan c khi
tieu trnh c kch hoat.
Khi ket thuc x ly, ham phai trave mot gia tr so nguyen phan anh
tnh trang ket thuc cua ham. Thong thng, gia tr 0 tra ve cho mot ket
thuc thanh cong, cac gia tr khac 0 la cac qui c ve hien tng loi.
Thc hien khi ong tieu trnh x ly noi thong qua ham sau:
CWinThread* AfxBeginThread (
AFX_THREADPROC pfnThreadProc, // Ham ieu khien
LPVOID pParam, // Tham so cua ham.
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
Sau ay la bo cuc thc hien toan bo cong viec tren:
UINT MyThreadProc( LPVOID pParam ) {
// Khai thac noi dung cua pParam
// Thc hien cac x ly can thiet.
return ( co_loi ) ? 1 : 0;
}
// Chuan b khi ong tieu trnh
pInfo =new MyInfo ; // Ch en vung cha cac gia tr thong so
AfxBeginThread( MyThreadProc, pInfo );
176 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Gia s can thc hien ng dung sau:


- Tieu trnh x ly noi cai at bi mot ham co nhiem vu thc hien chay
dong ch trong hop thong bao cho en khi co tn hieu ngng.
- Tieu trnh giao dien quan ly dialog nhan yeu cau ngi dung:
Muc Start Text Scrolling khi ong tieu trnh thc hien chay ch.
Muc chon nay sau o oi thanh Stop Text Scrolling e ieu khien
ngng tieu trnh noi tren.
Muc Close cham dt ng dung.
D an cua ng dung c thc hien nh sau:
Tao d an WorkerThread vi giao dien chnh la dialog.
Thc hien cac cai at sau cho lp CWorkerThreadDlg lam giao dien:
- M dialog resource, cai at cac control sau:
- Hop cha dong ch chay Static IDC_INFO
- Nut lenh cho phep ch chay | ngng Button IDOK
- Thuoc tnh public m_isTextScrolled kieu BOOL ghi nhan thong tin
ve hoat ong chay ch.
- Hanh vi OnInitDialog khi ong cac thong so:

BOOL CWorkerThreadDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
m_isTextScrolled =FALSE; // Cha thc hien chay ch
return TRUE;
}

- Hanh vi OnOK ng vi nut lenh IDOK thc hien khi ong hoac
thong bao ngng tieu trnh x ly chay ch:
Mot so van e trong Windows 177
void CWorkerThreadDlg::OnOK()
{
if (m_isTextScrolled) {
SetDlgItemText( IDOK, "Start Text Scrolling" );
// at gia tr thong bao tieu trnh chay ch cham dt
m_isTextScrolled =FALSE;
}
else {
SetDlgItemText(IDOK, "Stop Text Scrolling");
// at gia tr cho phep cho tieu trnh chay ch thc hien
m_isTextScrolled =TRUE;
// Khi ong tieu trnh vi tham so la dialog giao dien
AfxBeginThread( TextScrolling, this );
}
}

TextScrolling la ham x ly cua tieu trnh chay ch. Ham nhan tham so
void* la con tro ch en oi tng dialog giao dien. Co the khai bao
ham trong phan cai at cua lp CWorkerThreadDlg e tien s dung.

UINT TextScrolling(void* pParam) {
// Con tro pParam thc chat la con tro oi tng dialog giao dien
CWorkerThreadDlg* pDlg =(CWorkerThreadDlg*)pParam;
static CString info =" Welcome to multi-thread programming";
while (pDlg->m_isTextScrolled) {
// Gia tr thong bao cho phep tieu trnh tiep tuc thc hien:
info =info.Mid(1) +info.Left(1);
pDlg->SetDlgItemText(IDC_INFO, info);
Sleep(100); // Tam ngh
}
return 0; // Ket thuc tieu trnh x ly noi
}

Bien dch va chay th ng dung.

12.5.2 Tieu trnh giao dien:
Tieu trnh giao dien co kha nang trc tiep nhan va x ly yeu cau cua
ngi dung mot cach oc lap vi tieu trnh chnh (cung la tieu trnh giao dien)
cua ng dung. Viec thiet lap tieu trnh giao dien trong chng trnh c thc
hien thong qua cac noi dung sau ay:

178 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Chuan b giao dien (ca so hoac dialog) cua tieu trnh giao dien.
Xay dng lp ke tha t CWinThread e quan ly tieu trnh giao dien.
S dung giao dien tren cho lp thong qua hanh vi InitInstance cua lp.
Thc hien khi ong tieu trnh giao dien thong qua ham sau:
CWinThread* AfxBeginThread (
CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
pThreadClass : Con tro en cau truc quan ly thong tin thi hanh cua lp
oi tng quan ly tieu trnh giao dien c kch hoat. Xem (11.4).
Gia s co yeu cau thc hien ng dung vi hai giao dien hoat ong ong
hanh; giao dien Sub Interface of program c kch hoat khi ngi dung
click chon muc Run the sub user-interface thread dialog tren dialog giao
dien cua tieu trnh giao dien chnh.


Cac bc thc hien nh sau:
Tao d an UserIntThread vi giao dien chnh la dialog.
Thiet ke dialog resource cho giao dien con. Tren dialog resource nay,
cai nut thoat vi so hieu IDCANCEL.
Bo sung lp CSubUserDlg ke tha t CDialog s dung resource tren.
Bo sung lp oi tng CSubUserThread ke tha t CWinThread cho
phep quan ly cac tieu trnh giao dien con. oi tng CSubUserThread
nhan oi tng CSubUserDlg lam ca so giao dien chnh thong qua
hanh vi InitInstance cua no.
Mot so van e trong Windows 179
BOOL CSubUserThread::InitInstance()
{
CSubUserDlg dlg;
m_pMainWnd =&dlg;
dlg.DoModal();
return TRUE;
}

Thc hien cac cai at sau cho lp dialog CUserIntThreadDlg:
- M dialog resource, cai at cac control sau:
- Nut lenh kch hoat tieu trnh giao dien con Button IDOK
- Nut lenh ket thuc ng dung Button IDCANCEL
- Hanh vi OnOK cho nut chon IDOK kch hoat tieu trnh giao dien:
void CUserIntThreadDlg::OnOK()
{
AfxBeginThread( RUNTIME_CLASS(CSubUserThread) );
}
Bien dch va chay th ng dung.

12.5.3 Cac ham ho tr:
void AfxEndThread (
UINT nExitCode // Gia tr ket thuc tieu trnh
}; Cham dt hoat ong cua tieu trnh. Ham ch c s dung trong phan
cai at x ly cua tieu trnh.
BOOL GetExitCodeThread (
HANDLE hThread, // Handle cua tieu trnh
LPDWORD lpExitCode // Con tro en bien cha ket qua.
); Lay gia tr ket thuc cua mot tie u trnh. Tra ve gia tr TRUE neu tac
vu thc hien thanh cong.
hThread cua mot tieu trnh co the lay t thuoc tnh m_hThread cua oi
tng CWinThread quan ly tieu trnh.

12.6 LAP TRNH MULTIMEDIA VI MCI:
MCI (Media Control Interface) cung cap bo lenh c ban co tnh thch nghi
cao vi nhieu thiet b media trong viec thc hien cac noi dung multimedia.
Moi thiet b media s dung cho viec thc hien noi dung multimedia c
MCI quan ly thong qua ca so giao dien MCI thuoc lp MCIWnd. ay la lp
ca so do MCI ang ky trc nham phuc vu cho muc ch nay.
Ca so giao dien MCI nh sau:
180 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

Sau ay la cac ham MCI s dung pho bien (Vfw.h):
HWND MCIWndCreate (
HWND hwndParent, // Handle ca so cha cua ca so MCI
HINSTANCE hInstance, // Handle cua ng dung
DWORD dwStyle, // Dang ca so giao dien MCI
LPSTR szFile // ng dan, ten tap tin media.
); M thiet b media va s dung noi dung multimedia trong tap tin tng
ng. Ham tra ve con tro ca so MCI quan ly thiet b c m.
Thong so dwStyle cua ca so MCI c ket hp t cac gia tr sau:
MCIWNDF_SHOWALL : Hien th cac muc cua ca so.
MCIWNDF_NOMENU : Khong hien th nut chon menu.
MCIWNDF_NOPLAYBAR : Khong hien th progressbar.
LONG MCIWndOpen ( // Tra ve gia tr 0 neu thanh cong.
HWND hwnd, // Handle ca so MCI
LPSTR szFile // ng dan, ten tap tin media.
DWORD dwStyle = 0
); M noi dung multimedia mi cho thiet b media quan ly bi hwnd.
LONG MCIWndClose( HWND hwnd ); ong noi dung multimedia.
LONG MCIWndPlay( HWND hwnd ); Thc hien.
LONG MCIWndStop( HWND hwnd ); Ngng thc hien.
LONG MCIWndPause( HWND hwnd ); Tam ngng.
LONG MCIWndResume( HWND hwnd ); Tiep tuc.
VOID MCIWndDestroy( HWND hwnd ); ong thiet b media.
Gia s thiet ke ng dung cho phep chon tap tin multimedia; muc Play thc
hien noi dung tap tin, muc Stop ngng thc hien.
Cac bc tien hanh nh sau:
Dung MFC Wizard tao d an MCI vi giao dien chnh la dialog.
Khai bao s dung th vien MCI trong tap tin STDAFX.H:


#include <Vfw.h>
#pragma comment (lib, "Vfw32.lib") // MCI library

Trong lp dialog giao dien chnh: CMCIDlg
Mot so van e trong Windows 181
- M dialog resource, cai cac control sau:
- Hop nhap ng dan, ten tap tin Edit IDC_FILE
- Nut lenh thc hien Play Button IDC_PLAY
- Nut lenh thc hien Stop Button IDC_STOP
- Bo sung thuoc tnh protected m_mciWnd kieu HWND dung quan ly
thiet b media c s dung.
- Hanh OnInitDialog khi ong thiet b media:

BOOL CMCIDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetDlgItemText(IDC_FILE, "HappyNewYear.rmi");
m_mciWnd =MCIWndCreate ( this->GetSafeHwnd(),
AfxGetInstanceHandle(),
/*invisible*/ ~WS_VISIBLE, NULL );
return TRUE;
}

- Hanh vi OnPlay ng vi nut IDC_PLAY thc hien noi dung media:
void CMCIDlg::OnPlay()
{
char fName[1024]; // Lay ten tap tin multimedia
GetDlgItemText(IDC_FILE, fName, 1023);
if ( MCIWndOpen( m_mciWnd, fName, 0 ) ==0 ) {
MCIWndPlay( m_mciWnd );
}
}
- Hanh vi OnStop ngng thc hien:
void CMCIDlg::OnStop()
{
MCIWndStop( m_mciWnd );
}
Bien dch va chay th ng dung.

12.7 AN NH MOT SO TNH NANG CUA WINDOWS:
Moi trng windows cho phep ngi dung an nh mot so tnh nang tien
ch nh che o t ong ngat nguon, tat may,. Cac tnh nang nay co the
c cai at thong qua chng trnh tien ch hoac lap trnh t ong vi ham
sau:
182 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
BOOL SystemParametersInfo (
UINT uiAction, // So hieu cua chc nang can thc hien
UINT uiParam, // An nh tuy thuoc uiAction
PVOID pvParam, // Con tro vung em, tuy thuoc uiAction
UINT fWinIni // e ngh cap nhat user profile. = 0: khong.
); Lay hoac at thong so qui nh tnh nang tng ng cua he thong.
Gia tr uiAction co the la:
SPI_GETLOWPOWERTIMEOUT : Lay thong so low power timeout
SPI_GETPOWEROFFTIMEOUT : Lay thong so power timeout
SPI_GETSCREENSAVETIMEOUT : Lay thong so S.saver timeout
SPI_SETLOWPOWERTIMEOUT : at thong so low power timeout
SPI_SETPOWEROFFTIMEOUT : at thong so power timeout
SPI_SETSCREENSAVETIMEOUT : at thong so S.saver timeout.
Khi uiAction la gia tr co y ngha lay thong so:
uiParam : Co gia tr bang 0
pvParam : Ch en vung em nhan gia tr thong so hien hanh.
Khi uiAction la gia tr co y ngha at thong so:
uiParam : Gia tr thong so an nh.
pvParam : = NULL

oan chng trnh sau thc hien cam tnh nang screen saver:

UINT oldStatus;
// Lay thong so qui nh tnh nang ScreenSaver, lu vao oldStatus
SystemParametersInfo( SPI_GETSCREENSAVETIMEOUT,
0, &oldStatus, 0 );
// Cam tnh nang ScreenSaver
SystemParametersInfo( SPI_SETSCREENSAVETIMEOUT,
0, NULL, 0 );
// Cac x ly trong ieu kien ScreenSaver b cam

// Tra lai an nh trc o cho tnh nang ScreenSaver : oldStatus
SystemParametersInfo( SPI_SETSCREENSAVETIMEOUT,
oldStatus, NULL, 0 );

12.8 BAY (HOOK) MESSAGE (WINDOWS HOOK):
Hook la mot khau trong c che x ly message cua windows ma ng dung
co the can thiep e cai at thu tuc x ly message (hook procedure) trc khi
message o en c oi tng x ly message ma he thong ieu phoi.
Mot so van e trong Windows 183
12.8.1 Cac kieu hook (Hook Type):
Hook c phan chia thanh cac kieu khac nhau tuy thuoc vao kieu
message c hook. Mot so kieu hook pho bien nh sau:
WH_KEYBOARD : Hook cac message lien quan ban phm.
WH_MOUSE : Hook cac message lien quan con chuot.
WH_CBT : Hook cac thao tac tren ca so giao dien.
WH_CALLWNDPROCRET : Hook gia tr tra ve t ham x ly message
WindowProc co kieu CWPRETSTRUCT.
WH_CALLWNDPROC : Hook cac message trc khi message c
chuyen en thu tuc WindowProc.

12.8.2 Danh sach hook (Hook Chain):
Danh sach hook la danh sach cac con tro ch en cac thu tuc hook. Moi
kieu hook co mot danh sach hook rieng. Khi mot message phat sinh, no c
chuyen en danh sach hook lien quan; t thu tuc hook nay en en thu tuc
hook khac. Moi thu tuc hook co the tuy nghi thc hien cac x ly khac nhau:
ghi nhan message, chnh sa message, hoac ngan cam message khong e no
en c thu tuc hook ke tiep.

12.8.3 Thu tuc hook (Hook Procedure):
Thu tuc hook la chng trnh con chuyen dung cho viec hook loai message
lien quan. Chng trnh con x ly hook co khai bao nh sau:
LRESULT CALLBACK HookProc ( int nCode, WPARAM wParam,
LPARAM lParam );
Cac tham so gi cho chng trnh con nay khac nhau theo tng kieu hook:
WH_KEYBOARD x ly message ban phm - KeyboardProc:
code : - HC_ACTION: Message cua phm c thc hien.
- HC_NOREMOVE: Message cua phm cha c lay khoi
message queue.
wParam: Ma phm lien quan.
lParam : - Cac bit 015 : Gia tr cho biet so lan go phm
- Cac bit 1623 : Ma scan code cua phm.
- Bit 29 : Bang 1 neu phm Alt c nhan kem.
WH_MOUSE x ly message t con chuot - MouseProc:
code : - HC_ACTION: Message cua chuot c thc hien.
- HC_NOREMOVE: Message cua chuot cha c lay khoi
message queue.
wParam : So hieu message cua con chuot
184 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
lParam : Con tro en cau truc MOUSEHOOKSTRUCT.

typedef struct tagMOUSEHOOKSTRUCT {
POINT pt; // V tr ch iem cua con chuot
HWND hwnd; // Handle ca so lien quan.
UINT wHitTestCode; // Xem (4.2): WM_SETCURSOR
ULONG_PTR dwExtraInfo; // Cac thong tin bo sung khac.
} MOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;

WH_CBT X ly thao tac tren ca so - CBTProc:
Quan he gia cac thong so nh sau:

Code wParam lParam
HCBT_ACTIVATE
( Kch hoat ca so )
Handle cua ca so Con tro cau truc
cha thong tin.
HCBT_CREATEWND
( Tao mi ca so )
Handle cua ca so. Con tro cau truc
cha thong tin.
HCBT_DESTROYWND
( Huy bo ca so )
Handle cua ca so. =NULL
HCBT_MINMAX
( Phong to hay Thu nho
ca so )
Handle cua ca so. Word thap cha
thong so hien th
ca so ( SW_xxx ).
HCBT_MOVESIZE
( Di chuyen hoac thay
oi kch thc ca so )
Handle cua ca so. Con tro cau truc
RECT quan ly toa
o, kch thc mi.

12.8.4 Cac dch vu lien quan hook:
HHOOK SetWindowsHookEx (
int idHook, // Kieu hook
HOOKPROC lpfn, // a ch thu tuc hook
HINSTANCE hMod, // Handle cua n the cha hook
DWORD dwThreadId // So hieu tieu trnh s dung hook
); Cai at thu tuc hook vao danh sach hook tng ng. Ham tra ve
handle cua thu tuc hook c cai at trc thu tuc b chiem quyen.
dwThreadId : Tieu trnh s dung hook; =0: tat ca cac tieu trnh.
lpfn : Neu thu tuc hook s dung cho tat ca cac tieu trnh th nen
at no trong mot tap tin DLL.
Mot so van e trong Windows 185
hMod : Handle cua ng dung hoac DLL cha thu tuc hook.
LRESULT CallNextHookEx (
HHOOK hhk, // Handle cua thu tuc hook chiem quyen
int nCode, // Chuyen giao gia tr cac tham so
WPARAM wParam, // ma thu tuc hook chiem quyen
LPARAM lParam // nhan c t he thong
); Thc hien thu tuc hook b chiem quyen, giup on nh cho windows.
BOOL UnhookWindowsHookEx (
HHOOK hhk // Handle cua thu tuc hook huy bo.
); Huy bo thu tuc hook trong danh sach hook.
Neu thu tuc hook c cai trong DLL th can s dung cac ham sau:
HMODULE LoadLibrary (
LPCTSTR lpFileName // ng dan, ten tap tin DLL
); Tra ve gia tr handle cua DLL.
FARPROC GetProcAddress (
HMODULE hModule, // Handle cua DLL cha thu tuc
LPCSTR lpProcName // Ten thu tuc
); Tra ve con tro cua thu tuc tng ng.

12.8.5 ng dung hook messages cua keyboard:
Trong phan nay, ta thc hien ng dung hook message cua ban phm. X ly
hook cua ng dung bat tieng beep e thong bao co go phm va chuyen
message nhan c cho thu tuc x ly hook a b x ly nay chiem quyen.
Cac bc thc hien nh sau:
Dung MFC Wizard tao ng dung Hook vi giao dien chnh la dialog.
Thc hien cai at cac bo sung cho lp dialog CHookDlg nh sau:
- Trong phan cai at, bo sung bien lu va ham x ly hook:
HHOOK oldHook; // Cha a ch thu tuc hook b chiem quyen

LRESULT CALLBACK myHook ( int code, WPARAM wParam,
LPARAM lParam) {
MessageBeep( -1 ); // Thc hien beep e thong tin
// Thc hien thu tuc b chiem quyen.
return CallNextHookEx(oldHook, code, wParam, lParam);
}
- Hanh vi OnInitDialog x ly cai at thu tuc hook:
BOOL CHookDlg::OnInitDialog()
{
186 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
CDialog::OnInitDialog();
oldHook =SetWindowsHookEx (
WH_KEYBOARD, /* Hook messge phm */
myHook, /* Thu tuc hook */
AfxGetInstanceHandle(),
/* Handle tien trnh cha thu tuc x ly hook */
0 /* Hook tat ca tien trnh */
);
return TRUE;
}
- Hanh vi OnDestroy huy bo thu tuc hook cua ng dung:
void CHookDlg::OnDestroy()
{
UnhookWindowsHookEx(oldHook);
CDialog::OnDestroy();
}
Bien dch va chay th ng dung.

12.9 Cai at che o thc hien ng dung t ong:
SOFTWARE\Microsoft\Windows\CurrentVersion\Run la thanh phan ac
biet cua system registry cho phep t ong thc hien ng dung khi khi ong
windows thong qua viec cai at cac muc co gia tr la chuoi ng dan en
chng trnh ng dung lien quan. Trong o:
HKEY_LOCAL_MACHINE\ Ap dung cho moi ngi dung tai host.
HKEY_CURRENT_USER\ Ap dung cho mot ngi dung xac nh.
V du: Muc MyProg = "C:\Game\mci.exe" cai trong thanh phan :
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
cho phep thc hien t ong chng trnh mci.exe khi khi ong windows.

THC HANH:
1. Dung (12.3) va (12.6), thiet ke ng dung audio & video player. ng dung
co the thu nho thanh icon tren status area e va lam viec va nghe nhac.
2. Cai at muc trong RUN cho phep thc hien t ong mot ng dung tuy y.
3. HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\TypedURLs
la thanh phan cha cac URLs trong IE. Viet ng dung xoa mot URL bat ky.
MFC vi Internet 187
CHNG 13:

MFC vi Internet

13.1 GIAO THC TRUYEN THONG TCP/IP:
13.1.1 Gii thieu:
TCP/IP (Transmission Control Protocol/Internet Protocol) bao gom giao
thc truyen thong va cac dch vu ho tr tac vu truyen thong gia cac tram
(host) tren he thong mang nh v a ch IP (IP Host Address Internetwork).
TCP/IP ra i t nam 1969 bi c quan nghien cu cac d an cao cap
thuoc bo quoc phong Hoa Ky (Department of Defence Advanced Research
Projects Agency - DARPA) nham muc tieu xay dng mot giao thc truyen
thong chuan cho viec phat trien cac he thong mang dien rong (WAN) vi c
che ket noi truyen thong toc o cao tren c s van dung cac kinh nghiem t
thanh qua phat trien mang ARPANET, tien than cua Internet ngay nay.

13.1.2 Kien truc cua giao thc TCP/IP tren mo hnh DARPA:
Mo hnh DARPA vi giao thc truyen thong TCP/IP la mot kien truc bao
gom 4 tang tng ng vi 7 tang cua mo hnh mang chuan OSI nh sau:

Tang giao tiep mang (Network Interface Layer):
Tang giao tiep mang (tang truy xuat mang) am nhan nhiem vu nhan
va gi cac goi cha thong tin (packet) theo cau truc TCP/IP tren thiet b
188 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
ket noi mang cua host. Cau truc packet cua TCP/IP c thiet ke cho
phep khong phu thuoc vao c che truy xuat cung nh kien truc khung
packet cua thiet b mang. Nh o, TCP/IP co the lam viec vi nhieu
kieu mang khac nhau, bao gom cac mang cuc bo (LAN): Ethernet hoac
Token Ring; mang dien rong (WAN): X.25 hoac Frame Relay. S oc
lap o cung giup TCP/IP nhanh chong thch nghi vi cac cong nghe
mang mi nh ATM (Asynchronous Transfer Mode).
Tang Internet (Internet Layer):
Tang internet am nhan chc nang nh v, ong goi thong tin va
truyen tin nh tuyen. Giao thc truyen thong cot loi cua tang nay la IP,
ARP, ICMP, va IGMP.
- Giao thc IP (Internet Protocol): Giao thc truyen thong nh tuyen;
co nhiem vu nh v a ch IP, tach va ket cac packet.
- Giao thc ARP (Address Resolution Protocol): Co nhiem vu thc
hien hoan chuyen cac gia tr a ch mot cach tng ng gia tang
internet (logic address) va tang giao tiep mang (physic address).
- Giao thc ICMP (Internet Control Message Protocol): Co nhiem vu
cung cap cac chc nang kiem soat va thong bao tnh hnh gi cac IP
packet.
- Giao thc IGMP (Internet Group Management Protocol): Co nhiem
vu quan ly nhom cac IP packet c truyen en moi host.
Tang truyen tai (Transport Layer):
Tang truyen tai co nhiem vu cung cap cho tang ng dung cac dch vu
truyen thong tin theo dong va theo goi. Giao thc truyen thong cot loi
cua tang truyen tai la TCP va UDP.
- UDP (User Datagram Protocol): La giao thc cung cap dch vu
truyen thong tin gia mot host vi mot hay nhieu host khac tren c
s ong goi thong tin va gi i theo tng packet oc lap. Giao thc
nay khong thc hien kiem tra tnh hnh nhan thong tin host nhan
tin nen o tin cay thap, thong tin co the b that lac.
- TCP (Transmission Control Protocol): La giao thc cung cap dch vu
truyen thong tin tren c s xay dng ng truyen (stream) gia hai
host va thc hien gi-nhan thong tin, ong thi kiem tra thong tin
nhan qua ng truyen nay. Giao thc nay am bao thong tin c
chuyen en host nhan chnh xac va an toan.
Tang ng dung (Application Layer):
MFC vi Internet 189
Tang ng dung cung cap cac chc nang khai thac cac dch vu cua cac
tang khac, ong thi nh ngha cac giao thc truyen thong ma ng
dung cua ngi dung co the s dung e truyen d lieu qua he thong
mang. Cac giao thc truyen thong pho bien nh sau:
- Giao thc HTTP (HyperText Transfer Protocol): Dung chuyen tai
cac tap tin tham gia vao noi dung trang WEB (World Wide Web).
- Giao thc FTP (File Transfer Protocol): Dung chuyen tai cac tap tin
thong thng.
- Giao thc SMTP (Simple Mail Transfer Protocol): Dung chuyen tai
noi dung th tn bao gom thong iep va cac d lieu kem theo.
- Giao thc Telnet: Dung cho hoat ong tham nhap host t xa thong
qua cac thiet b au cuoi (Terminal).
Ben canh cac giao thc truyen thong noi tren, tang ng dung con
cung cap cac dch vu sau:
- Dch vu chuyen oi domain name thanh a ch IP tng ng.
- Dch vu cung cap thong tin nh v a ch IP.
- Dch vu quan ly cac thiet b mang (bo nh tuyen, cau noi, hub
thong minh) nham thu thap va trao oi thong tin quan ly mang.

13.1.3 a ch IP:
a ch IP la gia tr giup xac nh mot host duy nhat tren he thong mang.
Tat ca cac a ch IP eu co dang thong nhat bao gom a ch mang va a ch
cua host tren mang o.
- a ch mang (Network address - Network ID): So hieu dung cho mot
he thong mang cac host cung chung mot ac iem nh tuyen. Cac he
thong mang ket vao internet phai co a ch mang phan biet.
- a ch host (host address - host ID): So hieu dung cho mot host
(workstation, server, router, TCP/IP host). Cac host trong cung mot he
thong mang co cung a ch mang nhng a ch host phai phan biet.
Moi a ch IP co chieu dai 32 bits chia thanh 4 bytes (4 octets). Moi gia tr
nh phan trong mot byte tng ng vi mot gia tr thap phan trong oan
0 255. Bon gia tr thap phan nay c viet ra theo th t va ngan cach
bang dau . cho ta hnh anh bieu dien a ch IP theo dang so va dau cham
(dotted decimal notation) ma t ay ta se goi tat la num-dot.
IP: 11000000 10101000 00000011 00011000
Hay: 192.168.3.24
190 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Tren 4 bytes a ch IP, ta co the chon mot so bytes tuy y cha a ch
mang, so bytes con lai dung cha a ch host. Moi cach chon khac nhau
tao thanh mot lp a ch IP. Co 3 lp a ch IP pho bien:
- Lp A : 1 byte cho a ch mang, 3 bytes cho a ch host
- Lp B : 2 bytes cho a ch mang, 2 bytes cho a ch host
- Lp C : 3 bytes cho a ch mang, 1 byte cho a ch host
Lu y:
- Gia tr a ch host vi tat ca cac bits bang 1 la a ch ch cho moi
host tren he thong mang (host broadcast address) cha host. Khong
mot host nao c s dung a ch nay.
- Mot a ch IP co phan a ch host vi tat ca cac bits bang 0 chnh
la a ch cua he thong mang. Khong dung a ch nay cho host.
Address Class First Host ID Last Host ID
Class A w.0.0.1 w.255.255.254
Class B w.x.0.1 w.x.255.254
Class C w.x.y.1 w.x.y.254

13.1.4 Subnet:
Vi so bits dung cho a ch host trong cac lp a ch, so lng host cua
mot he thong mang co the len en con so rat ln (lp A la 16 trieu). Khi o,
viec gi mot thong iep len mang cho tat ca cac host (broadcast) se can mot
khoang thi gian thc hien khong nho, kho am bao x ly thi gian thc. Hn
na, 16 trieu gia tr a ch cho mot he thong mang la qua d tha.
Nham khac phuc han che noi tren, cac host cung he mang c chia thanh
nhom nho hn goi la mang con (SubNet). Moi subnet tng ng vi mot a
ch mang subnet va gii han a ch IP cac host trc thuoc. a ch subnet la
gia tr hnh thanh t mot phan bits trong a ch host cua a ch IP thuoc he
mang ban au. Co the xem Subnet la tap con cua he mang.

He thong mang trong hnh tren s dung a ch lp B. a ch cua he mang
la 139.12.0.0. He mang nay cho phep xac lap 65535 a ch host. Thc
MFC vi Internet 191
hien chia he mang tren thanh 256 subnet da tren byte th ba, ta c cac
subnet 8-bit a ch lp B:

Cac subnet c tao thanh la: 139.12.1.0, 139.12.2.0 va 139.12.3.0.

13.1.5 Subnet Mask:
Subnet mask la mot gia tr 32 bits giup tach gia tr a ch mang (hoac a
ch subnet) va a ch host t mot a ch IP bat ky (trong mot lp a ch bat
ky, cach phan chia subnet bat ky). Gia tr nay c xay dng nh sau:
- Cac gia tr bit tng ng vi a ch mang co gia tr la 1.
- Cac gia tr bit tng ng vi a ch host co gia tr la 0.

Gia tr subnet mask cung c bieu dien di dang num-dot.
Ta co subnet mask mac nhien cho cac lp a ch nh sau:
Class Bits for Subnet Mask Subnet Mask
Class A 11111111 00000000 00000000 00000000 255.0.0.0
Class B 11111111 11111111 00000000 00000000 255.255.0.0
Class C 11111111 11111111 11111111 00000000 255.255.255.0

Cac gia tr subnet mask do ngi dung tao ra tng ng vi moi lp a ch
tren co the khac biet so vi cac gia tr mac nhien v chung cha ca gia tr
mask tren a ch subnet.
V du: 138.96.58.0 la mot a ch subnet 8-bit lp B. 8 bits a ch host cua
he mang ban au c dung lam gia tr a ch subnet. Nh vay subnet
mask s dung tong cong 24 bits (255.255.255.0) e nh ngha a ch
mang subnet. a ch mang subnet va gia tr subnet mask tng ng c
bieu dien theo dang num-dot nh sau:
138.96.58.0, 255.255.255.0
Hay: 138.96.58.0/24 (24-bit mask)

192 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Xac nh a ch mang: e tach a ch mang t mot a ch IP bat ky
thong qua gia tr subnet mask, ta s s dung phep toan AND bits:
V du: Gia s IP = 129.56.189.41 vasubnet mask = 255.255.240.0
a ch mang c xac nh nh sau:
IP Address : 10000001 00111000 10111101 00101001
Subnet Mask : 11111111 11111111 11110000 00000000
Network ID : 10000001 00111000 10110000 00000000

Xac nh gii han a ch IP: Gia s a ch mang la 192.168.0.0.
Vi subnet 3-bit a ch lp B cua he mang noi tren, ta co 8 trng hp la
chon gia tr cho 3 bits nay. Tng ng vi moi trng hp la mot gii han cac
a ch IP cua cac host trong subnet:
Stt a ch Subnet theo he nh phan Gii han a ch IP
1 11000000.10101000.00000000.00000001- 192.168.0.1 -
11000000.10101000.00011111.11111110 192.168.31.254
2 11000000.10101000.00100000.00000001- 192.168.32.1 -
11000000.10101000.00111111.11111110 192.168.63.254
3 11000000.10101000.01000000.00000001- 192.168.64.1 -
11000000.10101000.01011111.11111110 192.168.95.254
4 11000000.10101000.01100000.00000001- 192.168.96.1 -
11000000.10101000.01111111.11111110 192.168.127.254
5 11000000.10101000.10000000.00000001- 192.168.128.1 -
11000000.10101000.10011111.11111110 192.168.159.254
6 11000000.10101000.10100000.00000001- 192.168.160.1 -
11000000.10101000.10111111.11111110 192.168.191.254
7 11000000.10101000.11000000.00000001- 192.168.192.1 -
11000000.10101000.11011111.11111110 192.168.223.254
8 11000000.10101000.11100000.00000001- 192.168.224.1 -
11000000.10101000.11111111.11111110 192.168.255.254

13.1.6 Host domain name:
Ten (name) la mot giai phap hu hieu cho viec gi nh a ch cua host
thay v dung a ch IP vi 4 bytes gia tr kho nh noi tren. Ten cua host (Host
name) la mot chuoi ky t co chieu dai toi a 255, co the cha mau t, ky so,
cac ky t - va . va co y ngha tng ng vi a ch IP trong viec quan ly
a ch mot host tren he thong mang internet. Co hai dang pho bien cho ten
cua host la nick name va domain name:
MFC vi Internet 193
- Nick name: Mot nhan c dung cho mot a ch IP duy nhat.
- Domain name: Ten c hnh thanh t cau truc phan lp. Cau truc
phan lp nay c qui nh pho bien thanh luat va c goi la he
thong ten mien (Domain Name System DNS) nh sau:

Trong o:
Ten Domain Y ngha s dung
COM Cac to chc thng mai
EDU Cac c quan giao duc, nghien cu
GOV To chc chnh phu
MIL C quan quan s
NET c quan quan ly mang chnh
ORG Cac to chc khac
INT Cac to chc quoc te
<country code> Cac nhanh cho cac quoc gia tr Hoa Ky
Mot ten mien ay u (Fully Qualified Domain Name FQDN) cha
ng i t goc en oi tng tham chieu theo trnh t phan cap noi tren.
V du: ftpsrv.wcoast.slate.com

Viec chuyen oi gia a ch IP va Domain name c thc hien da tren
bang chuyen oi IP-DomainName do DNS server, mot host chuyen dung
cua he thong mang, quan ly. ng dung t mot host bat ky co the truy van
bang thong tin nay thong qua cac dch vu cung cap bi windows socket.
Windows socket truyen yeu cau cua ng dung en bo phan phan giai
domain name cua giao thc truyen thong TCP/IP. Bo phan nay chuyen
yeu cau en DNS server. DNS server nhan yeu cau va thc hien; neu
194 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
thong tin yeu cau khong xac nh c th no se chuyen en DNS server
cung cap khac, ket qua thc hien c hoac khong thc hien c eu
c tra ve theo lo trnh ngc lai.

13.1.7 IP Routing:
IP routing la tien trnh x ly gi packet en host nhan da tren a ch IP
cua host. Tien trnh nay xay ra host gi thong tin theo giao thc TCP/IP va
thiet b nh tuyen (router device) nham thc hien quyet nh la chon v tr
ma packet se c chuyen en.
e thc hien quyet nh tren, tang IP tham khao bang nh tuyen c lu
tr trong bo nh. Noi dung bang nh tuyen c khi tao mac nhien khi
TCP/IP va c khi ong. Cac muc bo sung co the c thc hien bi
ngi quan tr he thong mang (WinNT router table) hoac thc hien mot cach
t ong trong qua trnh lien lac vi cac bo nh tuyen.
Co hai dang pho bien khi gi packet; gi trc tiep va gi gian tiep.
Gi trc tiep (Direct delivery): Xay ra khi host nhan va host gi c
ket noi trc tiep. Thong tin c ong goi host gi theo cau truc qui
nh cua tang giao tiep mang va c gi i.
Gi gian tiep (Indirect delivery): Xay ra khi host nhan va host gi c
ket noi thong qua mot trung gian (bo nh tuyen). Khi o se co mot qua
trnh gi gian tiep t host en bo nh tuyen, t bo nh tuyen trc tiep
en host nhan (hoac gian tiep en mot bo nh tuyen khac).
MFC vi Internet 195

A gi trc tiep en B
A gi gian tiep packet en router1 , router 1 gi gian tiep en
router 2, router 2 gi trc tiep en C.
Bang nh tuyen:
Bang nh tuyen c xac lap tren tat ca cac host (node, router) va
c at bi cac gia tr mac nhien trong qua trnh khi ong cua giao
thc TCP/IP. Noi dung cua bang cha thong tin ve he thong cac a ch
IP tren mang, cach ket noi vi cac a ch ay.
Moi khi mot goi thong tin c gi i, bang nh tuyen se c s
dung e xac nh:
- a ch cua host ni gi en: Neu gi trc tiep th o chnh la a
ch cua host nhan packet, ngc lai, la a ch cua bo nh tuyen.
- Giao dien s dung e gi: Bao gom thong tin ve cau truc vat ly
va logic cua thiet b ket noi mang ni gi va ni nhan.
Cau truc noi dung cua mot muc trong bang nh tuyen:
[ Network ID, Subnet Mask, Next Hop, Interface, Metric ]
Trong o:
- Network ID: a ch mang tng ng vi tuyen truyen tin.
- Subnet Mask: Gia tr dung tach a ch mang t a ch IP.
- Next Hop: a ch IP cua host trung gian ke tiep.
196 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
- Interface: Thiet b giao tiep mang c s dung.
- Metric: Chi ph cua tuyen truyen, lam c s cho viec la
chon tuyen toi u.
Thong tin cua muc trong bang nh tuyen qui nh ac iem tuyen:
- Tuyen ket noi trc tiep vi he thong mang: Gia tr cua Next Hop
la rong hoac cha a ch IP cua thiet b giao tiep mang.
- Tuyen ket noi trung gian vi he thong mang: Gia tr cua Next
Hop cha a ch IP cua bo nh tuyen trung gian gia host gi va
host nhan.
- Tuyen ket noi trc tiep vi mot host cu the: Khi o Network ID
cha a ch cua host va gia tr cua subnet mask la
255.255.255.255.
- Tuyen mac nhien: Tuyen c s dung khi co mot tac vu nh
tuyen khong thanh cong. Gia tr cua network ID la 0.0.0.0 va
subnet mask la 0.0.0.0.
Network
Address
Netmask Gateway
Address
Interface
Metric Purpose
0.0.0.0 0.0.0.0 157.55.16.1 157.55.27.90 1 Default Route
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1 Loopback Network
157.55.16.0 255.255.240.0 157.55.27.90 157.55.27.90 1
DirectyAttached
Network
157.55.27.90 255.255.255.255 127.0.0.1 127.0.0.1 1 Local Host
157.55.255.255 255.255.255.255 157.55.27.90 157.55.27.90 1 Network Broadcast
224.0.0.0 224.0.0.0 157.55.27.90 157.55.27.90 1 Multicast Address
255.255.255.255 255.255.255.255 157.55.27.90 157.55.27.90 1 Limited Broadcast
( Mot bang nh tuyen cua Windows NT )

X ly nh tuyen:
X ly nh tuyen la x ly thc hien la chon muc nh tuyen trong
bang nh tuyen va dung no cho viec gi thong tin. Viec la chon nay
c thc hien thong qua cac bc sau:
- Tren moi muc nh tuyen, thc hien phep toan AND gia a ch
host nhan va gia tr subnet mask. Kiem tra ket qua nay vi
Network ID e anh gia o phu hp (o tng t).
- Chon ra cac muc nh tuyen co mc o phu hp cao nhat. Trong
cac muc nh tuyen nay, chon ra cac muc co chi ph tuyen truyen
nho nhat. Cuoi cung, t cac muc nh tuyen chon c, muc nh
tuyen c s dung la muc con roi.
X ly nh tuyen khac nhau tren cac loai host khac nhau:
MFC vi Internet 197
Host gi: Packet c gi t giao thc tang cap cao hn cua IP (TCP,
UDP, ...). Khi o vai tro IP host gi nh sau:
- at gia tr cho trng TTL (Times-To-Live) theo gia tr qui nh cua
ng dung tang cap cao hoac lay gia tr mac nhien cua he thong.
- Xac nh tuyen toi u cho packet truyen i.
- Neu khong xac nh c tuyen truyen th thong bao loi en tang
truyen thong cap cao hn. Ngc lai, thc hien truyen theo tuyen.

Host nh tuyen: Vai tro cua IP nh sau:
- Kiem tra checksum cua packet. Neu sai th huy packet.
- Kiem tra a ch IP cua host nhan tren packet. Neu a ch nay la a
ch mot bo nh tuyen th noi dung packet (tr phan noi dung IP
header) c chuyen cho giao thc tang cap cao tng ng. Ngc
lai, giam gia tr trng TTL i 1; neu gia tr trng nay bang 0 th
huy bo packet va gi thong iep "ICMP Time Expired-TTL
Expired" cho host gi, ngc lai xac nh tuyen gi va gi packet.

Host nhan: Vai tro cua IP nh sau:
- Kiem tra checksum cua packet. Neu sai th huy packet.
- Neu a ch host nhan ghi tren packet khong phai la a ch cua host
ang x ly th huy packet.
- Gi noi dung packet (tr IP header) len giao thc tang cao hn.

13.2 LAP TRNH TCP/IP VI WINSOCK:
Winsock (Windows Socket) co xuat x t BSD (Berkeley Software
Distribution - UNIX), tng thch vi windows qua phien ban WinSock1.1.
Winsock la mot giao dien vi cac dch vu xay dng tren giao thc truyen
thong TCP va UDP. Thong qua winsock, ng dung co the trien khai de dang
cac tac vu truyen thong tren tang truyen thong cua mo hnh mang.

13.2.1 Port:
Port la khai niem c dien ta bang mot gia tr so (so hieu port) giup phan
biet cac tien trnh tren cung mot host ong s dung giao thc TCP/IP. Cac
ng dung khac nhau s dung TCP/IP co the thc hien c cung mot luc tren
mot host vi ieu kien chung phai s dung cac so hieu port khac nhau.

13.2.2 Socket:
198 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Socket la iem truyen thong au cuoi cho phep ng dung gi va nhan cac
packet qua ng truyen mang. Moi socket co mot kieu xac nh va gan lien
vi mot tien trnh x ly truyen thong. Co hai loai socket:
Stream Socket: C che truyen d lieu theo dong.
Datagram Socket: C che truyen d lieu theo packet.
a ch socket la mot gia tr bao gom a ch cua host va so hieu port
ma tien trnh x ly truyen thong lien quan socket a ang ky s dung.

13.2.3 Mot so cau truc d lieu cua Winsock API:
a ch num-dot cua host:
c bieu dien bi mot gia tr chuoi co noi dung la bon gia tr so co
o ln bang byte va c ngan cach bang dau .
V du: "127.0.0.1"
Cau truc khi ong winsock :

typedef struct WSAData {
WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
}WSADATA, *LPWSADATA;

szDescription: Thong tin ve phien ban winsock ang s dung.
szSystemStatus: Thong tin ve phien ban he ieu hanh windows.

Cau truc cha thong tin cua host :

struct hostent {
char FAR * h_name; // Domain name
char FAR * FAR * h_aliases; // Ten dung thay domain name
short h_addrtype; // Kieu a ch, vi TCP/IP la AF_INET
short h_length; // Kch thc a ch, 4 bytes cho AF_INET
char FAR * FAR * h_addr_list; // Danh sach a ch. Phan t
// au danh sach h_addr_list[0]
// (hay h_addr) la a ch host.
}HOSTENT, *PHOSTENT;
a ch socket tren mot host:
struct sockaddr {
MFC vi Internet 199
unsigned short sa_family; // Ho a ch cua host.
char sa_data[14]; // a ch (cho phep nhieu loai a ch)
} SOCKADDR ;

Cau truc nay c tng thch bi SOCKADDR_IN cua MicroSoft:

struct sockaddr_in {
short sin_family; // Co gia tr la AF_INET
unsigned short sin_port; // So hieu port
struct in_addr sin_addr; // a ch IP 4 bytes cua host
char sin_zero[8]; // Ch e tng thch vi SOCKADDR
}SOCKADDR_IN ;

sin_addr : a ch IP 4 bytes cua host, co cac cach dien ta nh sau:
struct in_addr {
union {
struct {
unsigned char s_b1, s_b2, s_b3, s_b4;
} S_un_b; // a ch IP bang 4 bytes
struct {
unsigned short s_w1, s_w2;
} S_un_w; // a ch IP bang 2 words
unsigned long S_addr; // a ch IP bang 1 long
} S_un;
};

13.2.4 Mot so dch vu cua Winsock API:
char FAR * inet_ntoa (
struct in_addr in // a ch IP 4 bytes
); Tra ve chuoi a ch num-dot tng ng.
unsigned long inet_addr (
const char FAR *cp // a ch IP num-dot
); Ham tra ve gia tr kieu long cua a ch IP 4 bytes tng ng.
int WSAStartup ( // Ham tra ve gia tr 0 neu thanh cong
WORD version, // Phien ban winsock
LPWSADATA pMyInfo // Con tro cau truc nhan thong tin.
); Khi ong, chuan b cho viec khai thac cac dch vu cua winsock.
version: Cha so hieu phien ban winsock can dung
- High-order byte = winsock minor version number.
200 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
- Low-order byte = winsock major version number.
- V du: MAKEWORD (1, 1 ) Winsock version 1.1.
int gethostname ( // Ham tra ve SOCKET_ERROR neu co loi
char FAR *name, // Vung em cha thong tin
int namelen // Kch thc vung em
); Lay thong tin ve ten cua host.
PHOSTENT gethostbyname (
const char FAR *name // Tham so cha ten host
); Ham tra ve con tro en cau truc HOSTENT cha thong tin cua host.
int WSACleanup( ); Cham dt s dung dch vu winsock.

13.3 MFC VI LAP TRNH WINSOCK:
Th vien s dung: AfxSock.h
13.3.1 Khi ong Winsock:
BOOL AfxSocketInit ( WSADATA* lpwsaData = NULL );
AfxSocketInit am nhan viec thc hien WSAStartup khi bat au ng
dung va WSACleanup khi ng dung ket thuc. Li goi AfxSocketInit c
thc hien trong hanh vi InitInstance cua oi tng quan ly tieu trnh chnh
cua ng dung. Tham so truyen cho ham co y ngha nh vi WSAStartup.

13.3.2 Lp CAsyncSocket:
CAsyncSocket la lp oi tng quan ly socket. Bang s bao ham cac dch
vu cua winsock API trong cac hanh vi, lp CAsyncSocket cho phep tao ra oi
tng socket ho tr ng dung mot cach hieu qua trong viec trien khai cac
hoat ong truyen thong tren tang truyen tai cua giao thc TCP/IP.
Cac hanh vi ac trng lp CAsyncSocket nh sau:
CAsyncSocket( ); Khi tao oi tng socket rong.
BOOL Create (
UINT nSocketPort = 0,
int nSocketType = SOCK_STREAM,
long lEvent = FD_READ | FD_WRITE | FD_OOB |
FD_ACCEPT | FD_CONNECT | FD_CLOSE,
LPCTSTR lpszSocketAddress = NULL
); Khi tao thong so oi tng socket va ket vi host oi tac (neu co).
Trong o:
- nSocketPort : So hieu port cua socket. Gia tr nay co the xac nh
bi ngi dung (v du 2050) hoac at bang 0 e
winsock tm giup mot gia tr phu hp.
MFC vi Internet 201
- n SocketType : An nh giao thc s dung; SOCK_STREAM cho
TCP hoac SOCK_DGRAM cho UDP.
- lEvent : Bao gom cac thong so lien quan en cac bien co
truyen thong ma ng dung muon winsock phan hoi
ngay tren socket quan ly bi oi tng socket.
FD_READ : Nhan c thong tin.
FD_WRITE : Gi c thong tin.
FD_ACCEPT : ong y ket noi.
FD_CONNECT : e ngh ket noi.
FD_CLOSE : Cham dt ket noi.
FD_OOB : Thong tin ngoai tuyen.
- lpszSocketAddress : Chuoi cha a ch num-dot cua host oi tac ma
socket c ket (bind). INADDR_ANY la a ch
dung ket vi tat ca cac host trong he thong mang.
BOOL Bind (
UINT nSocketPort, // So hieu port
LPCTSTR lpszSocketAddress = NULL // a ch num-dot cua host
); Ket socket vi mot host xac nh.
BOOL Bind (
const SOCKADDR* lpSockAddr, // a ch socket host oi tac
int nSockAddrLen // Kch thc lpSockAddr
); Ket socket vi mot host xac nh.
BOOL SetSockOpt (
int nOptionName, // Thuoc tnh can an nh
const void* lpOptionValue, // a ch bien cha gia tr an nh
int nOptionLen, // Kch thc bien cha gia tr
int nLevel = SOL_SOCKET // Mc at thong so cho socket
); An nh ac tnh hoat ong cua socket.
nOptionName cho phep la chon thuoc tnh an nh cua socket :
- SO_BROADCAST : BOOL Gi message en moi host.
- SO_DONTROUTE : BOOL Gi trc tiep khong qua router.
V du: Neu an nh ac tnh cua socket la cho phep gi message en
moi host th hanh vi tren c thc hien vi tham so nh sau:
int nOptionName, = SO_BROADCAST
const void* lpOptionValue, = a ch bien luan ly bang TRUE
int nOptionLen, = sizeof (BOOL)
202 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
int nLevel = SOL_SOCKET
BOOL Listen (
int nConnectionBacklog = 5 // Chieu dai dong ch ket noi
); Ch nhan ket noi t host oi tac (server ch cac clients).
BOOL Connect (
LPCTSTR lpszHostAddress, // a ch num.dot cua host oi tac
UINT nHostPort // So hieu port tren host oi tac
); Xin ket noi vi host oi tac (clients ket noi vi server).
BOOL Connect (
const SOCKADDR* lpSockAddr, // a ch socket host oi tac
int nSockAddrLen // Kch thc lpSockAddr
); Xin ket noi vi host oi tac (clients ket noi vi server).
virtual BOOL Accept (
CAsyncSocket& rConnectedSocket,
SOCKADDR* lpSockAddr = NULL,
int* lpSockAddrLen = NULL
); Chap nhan ket noi vi host oi tac (server chap nhan ket noi client).
Trong o:
- rConnectedSocket : Bien cha oi tng socket c tao mi vi
cac ac tnh giong nh oi tng chu the va
dung e quan ly lien ket va thiet lap.
- lpSockAddr : a ch bien kieu SOCKADDR c dung e
nhan a ch host oi tac.
- lpSockAddrLen : a ch bien c dung e nhan kch thc cua
a ch tra ve trong lpSockAddr.
virtual int Send ( // S dung cho Stream Socket
const void* lpBuf, // a ch vung em cha d lieu truyen
int nBufLen, // Kch thc vung em
int nFlags = 0 // Thong so an nh ac tnh gi
); Gi d lieu thong qua mot socket c ket noi.
Thong so dung cho ac tnh gi:
- MSG_DONTROUTE = Gi thang khong qua router.
- MSG_OOB = Gi ngoai tuyen (khan cap)
int SendTo ( // S dung cho Datagram
const void* lpBuf, // Vung em d lieu
int nBufLen, // Kch thc vung em
MFC vi Internet 203
UINT nHostPort, // So hieu port oi tac
LPCTSTR lpszHostAddress = NULL, // a ch num-dot oi tac
int nFlags = 0 // ac tnh gi.
); Gi packet en host oi tac. Ham tra ve so bytes d lieu gi c.
e gi packet en tat ca cac host, at lpszHostAddress = NULL.
int SendTo ( // S dung cho Datagram
const void* lpBuf, // Nh tren
int nBufLen,
const SOCKADDR* lpSockAddr, // a ch socket oi tac
int nSockAddrLen, // Kch thc a ch
int nFlags = 0
); Gi packet en host oi tac. Ham tra ve so bytes d lieu c gi.
e gi packet en tat ca cac host, gia tr a ch oi tac at nh sau:
lpSockAddr->sin_addr.s_addr = htonl ( INADDR_BROADCAST );
virtual int Receive ( // S dung cho Stream Socket
void* lpBuf, // a ch vung em nhan d lieu
int nBufLen, // Kch thc vung em
int nFlags = 0 // ac tnh nhan d lieu.
); Nhan d lieu thong qua mot socket c ket noi.
int ReceiveFrom ( // S dung cho Datagram
void* lpBuf, // a ch vung em cha d lieu
int nBufLen, // Kch thc vung em
CString& rSocketAddress, // a ch num-dot oi tac
UINT& rSocketPort, // So hieu port oi tac
int nFlags = 0 // ac tnh gi
); Nhan d lieu t host oi tac.
int ReceiveFrom ( // S dung cho Datagram
void* lpBuf, // a ch vung em cha d lieu
int nBufLen, // Kch thc vung em
SOCKADDR* lpSockAddr, // a ch socket oi tac
int* lpSockAddrLen, // Kch thc a ch
int nFlags = 0 // ac tnh gi
); Nhan d lieu t host oi tac.
BOOL AsyncSelect ( long lEvent = FD_READ | FD_WRITE |
FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE );
ang ky bien co truyen thong mong muon (xem Create ).
204 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
virtual void OnConnect (
int nErrorCode // Ma loi
); Nhan c yeu cau xin ket noi cua host oi tac.
virtual void OnAccept (
int nErrorCode // Ma loi, = 0 is OK
); Nhan c s ong y ket noi cua host oi tac.
virtual void OnSend (
int nErrorCode
); Socket a san sang cho viec gi d lieu.
virtual void OnReceive (
int nErrorCode
); D lieu a san sang ch nhan thong qua socket.
virtual void OnOutOfBandData (
int nErrorCode
); Co d lieu khan cap san sang ch nhan thong qua socket.
virtual void OnClose (
int nErrorCode
); Socket chuan b cham dt hoat ong.
BOOL ShutDown (
int nHow // 0 = receive, 1 = send ; 2 = both
); Cham dt tac vu truyen thong tng ng tren socket.
virtual void Close( ); Huy bo socket.

13.4 LAP TRNH WINSOCK CHO GIAO THC UDP:
Trong phan nay ta s dung giao thc UDP e thc hien truyen thong iep
gia hai hay nhieu host. ng dung thiet ke cho phep ngi dung soan thao
noi dung thong iep, tuy y chon gi en host xac nh hoac tat ca cac host.

Cach thc hien nh sau:
Dung MFC Wizard tao d an Udp vi ca so giao dien chnh la dialog.
bc Step 2 of 4: Chon ho tr Windows Sockets:

MFC vi Internet 205


Chon Finish hoan e hoan tat viec khi tao d an.
Tiep tuc thc hien cac bo sung sau :
Bo sung lp CEmpUdp ke tha lp CAsyncSocket cua MFC. Thc hien
cac cai at cho lp nh sau:
- Khai bao cac hang, so hieu port s dung trong ng dung:
const BUF_LEN =512; // Chieu dai vung em
const SENT_PORT =2051; // port gi thong tin
const RECEIV_PORT =2050; // port nhan thong tin
- Cac oi tng thuoc tnh s dung trong lp:
char *m_Buffer; // Vung em cha thong tin nhan-gi
CDialog *m_Parent; // Con tro oi tng dialog lien quan
- Hanh vi khi tao cua lp nhan tham so la con tro oi tng dialog
giao dien lien quan; thc hien lu gia tr con tro vao thuoc tnh cua
lp va ang ky vung nh lam vung em nhan-gi thong tin:
CEmpUdp::CEmpUdp(CDialog *parent)
{
m_Parent =parent;
m_Buffer =new char[BUF_LEN +1];
206 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
}
- Hanh vi huy bo thc hien giai phong vung nh a xin cap phat:
CEmpUdp::~CEmpUdp()
{
delete m_Buffer;
}
- Hanh vi ke tha OnSend lay thong tin nhap trong hop nhap co so
hieu la IDC_EDIT cua dialog lien quan va thc hien gi en host
(neu a ch xac nh) hoac gi cho tat ca host tren mang:
void CEmpUdp::OnSend(int nErrorCode)
{
CString peerAddr;
m_Parent->GetDlgItemText(IDC_EDIT, m_Buffer, BUF_LEN);
((CUDPDlg*)m_Parent)->m_ip.GetWindowText(peerAddr);
if (peerAddr =="0.0.0.0") {
// Send to everyones
BOOL toAll =TRUE;
SetSockOpt (SO_BROADCAST, &toAll, sizeof(BOOL));
SendTo(m_Buffer, BUF_LEN, RECEIV_PORT);
}
else
SendTo(m_Buffer, BUF_LEN, RECEIV_PORT, peerAddr);
}
- Hanh vi ke tha OnReceive nhan thong tin gi en va hien th trong
hop thong bao co so hieu la IDC_READ cua dialog lien quan:
void CEmpUdp::OnReceive(int nErrorCode)
{
CString peerAddr; // a ch host oi tac va
UINT port; // so hieu port s dung
ReceiveFrom(m_Buffer, BUF_LEN, peerAddr, port);
sprintf (m_Buffer, "%s\n(from %s)", m_Buffer, peerAddr );
m_Parent->SetDlgItemText ( IDC_READ, m_Buffer );
AsyncSelect(FD_READ); // Duy tr viec nhan thong tin
}
M resource cua dialog giao dien, bo sung hop edit (IDC_EDIT) cho
phep nhap noi dung thong tin gi, hop thong bao (IDC_READ) hien th
thong tin nhan, va hop nhap IP vi bien m_IP dung nhap a ch IP.
MFC vi Internet 207
Thc hien cac bo sung cho lp CUDPDlg quan ly dialog giao dien:
- Khai bao cac oi tng thuoc tnh quan ly socket nhan va gi thong
tin cua ng dung:
CEmpUdp *m_sentUDP; // Quan ly socket gi thong tin
CEmpUdp *m_receivUDP; // Quan ly socket nhan thong tin
- Hanh vi OnInitDialog: Cap phat va khi tao thong so cho cac oi
tng CEmpUdp:
m_sentUDP =new CEmpUdp(this);
m_receivUDP =new CEmpUdp(this);
m_sentUDP->Create(SENT_PORT, SOCK_DGRAM, 0);
m_receivUDP->Create(RECEIV_PORT,SOCK_DGRAM,FD_READ);
- Hanh vi OnOK (tng ng nut chon OK) thc hien gi thong iep:
void CUDPDlg::OnOK()
{
m_sentUDP->AsyncSelect(FD_WRITE); // ang ky gi
}
Bien dch va chay th ng dung.

13.5 LAP TRNH WINSOCK CHO GIAO THC TCP:
Trong phan nay, ta s dung giao thc TCP e thc hien truyen d lieu la
noi dung cua mot tap tin. Viec truyen d lieu dien ra gia host quan ly noi
dung tap tin : server va host nhan noi dung tap tin : client.

Th t thc hien cac tac vu ket noi va truyen d lieu gia host server va
host client nh sau:
Server Client
// Khai bao socket // Khai bao socket
208 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
CSocket sockSrvr; CSocket sockClient;
// Tao socket
1,2

sockSrvr.Create(nPort);
// Tao socket
2

sockClient.Create( );
// Ch nhan ket noi
sockSrvr.Listen( );


// Xin phep ket noi
3,4

sockClient.Connect(strAddr,nPort);
// Chuan b socket ket noi
CSocket sockRecv;
// ong y ket noi
5

sockSrvr.Accept( sockRecv );

// Truyen d lieu
6
.
...
// Truyen d lieu
6
.
...
// Ket thuc ket noi
7
.
sockSrvr.Close();
sockClient.Close()

Cach thc hien:
Tao tap d an rong (Blank Workspace):
- Chon muc File / New

- Thc hien cac an nh nh tren. Chon OK.
Bo sung vao Workspace d an TcpServer. ay la d an cua ng dung
server co nhiem vu ch ket noi va cung cap d lieu cho cac client.
- Trong man hnh Worksapce, right-click tren muc Workspace.
MFC vi Internet 209

- Chon Add New Project to Workspace.
- Dung Wizard tao d an TcpServer vi giao dien chnh la dialog, va
co s dung windows socket. Cach thc hien tng t (13.4).
Thc hien cac cong viec sau cho d an TcpServer :
Bo sung lp CEmpTcpWriter ke tha CAsyncSocket cua MFC. Lp bo
sung nay am nhan cac chc nang truyen noi dung tap tin cho client
c ket noi (OnSend), va cham dt ket noi khi a truyen xong
(Close). Cai at cua lp CEmpTcpWriter nh sau:
- Khai bao kieu cau truc cho vung em cha d lieu gi:
const BUFFER_LEN =1024; // Kch thc vung cha d lieu
typedef struct _tagBuf {
int length; // Kch thc d lieu thc
char info[BUFFER_LEN]; // Vung cha d lieu
}BUFFER;
- Cac thuoc tnh protected:
BOOL m_isBusy; // Trang thai phuc vu.
CDialog* m_Parent; // oi tng dialog lien quan
- Hanh vi tao lap nhan tham so la con tro oi tng dialog lien quan,
va xac nh trang thai san sang:
CEmpTcpWriter::CEmpTcpWriter( CDialog* parent )
{
m_Parent =parent; // oi tng dialog lien quan
m_isBusy =FALSE; // San sang nhan d lieu
}
- Hanh vi OnSend thc hien gi d lieu cho client lien ket:
void CEmpTcpWriter::OnSend( int nErrorCode )
{
static BOOL fileOK =TRUE;
210 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
static BOOL fileReady =FALSE;
static CFile file;
static long total;
BUFFER buf;
m_isBusy =TRUE; // a ket noi
buf.length =0; // D lieu nhan thc s
if ( fileOK && (!fileReady) ) {
m_Parent->SetDlgItemText(IDC_INFO, "\nTransfering...");
fileReady =TRUE;
CString fileName; // Ten tap tin c gi
// IDC_FILE : So hieu hop nhap ten tap tin tren dialog
m_Parent->GetDlgItemText(IDC_FILE, fileName);
fileOK =file.Open(fileName, CFile::modeRead);
total =0; // Cha kch thc thong tin gi
}
if (!fileOK ||
( buf.length =file.Read( buf.info, BUFFER_LEN ) )
<BUFFER_LEN )
fileReady =FALSE; // Khong co file hoac a gi het
Send( &buf, BUFFER_LEN +sizeof(int) );
total +=buf.length;
if (fileReady) {
Sleep( 300 ); // Thi gian ngh cho client
AsyncSelect( FD_WRITE ); // Gi tiep
}
else {
if ( fileOK ) file.Close();
Close();
m_isBusy =FALSE; // San sang nhan d lieu
CString result;
result.Format( "\nReady to connect to clients !\n"
"%d (bytes) transfered completed", total );
m_Parent->SetDlgItemText( IDC_INFO, result );
}
}
Bo sung lp CEmpTcpServer ke tha CAsyncSocket am nhan cac
chc nang nhan ket noi (accept), va khi tao oi tng gi d lieu:
- Cac thuoc tnh protected cua lp CEmpTcpServer:
CEmpTcpWriter* m_pDoSendObject; // oi tng gi d lieu
MFC vi Internet 211
CDialog* m_Parent; // Dialog lien quan
- Hanh vi tao lap nhan tham so la con tro oi tng dialog lien quan:
CEmpTcpServer::CEmpTcpServer( CDialog* parent )
{
m_Parent =parent; // Con tro oi tng dialog lien quan
m_pDoSendObject =new CEmpTcpWriter( m_Parent );
}
- Hanh vi huy bo giai phong oi tng m_pDoSendObject:
CEmpTcpServer::~CEmpTcpServer( )
{
delete m_pDoSendObject;
}
- Hanh vi OnAccept chap nhan ket noi neu ang roi:
void CEmpTcpServer::OnAccept( int nErrorCode )
{
if ( m_pDoSendObject->m_isBusy )
return ; // ang ban phuc vu
SOCKADDR_IN Addr;
int Len =sizeof(SOCKADDR_IN);
if (Accept(*m_pDoSendObject, (SOCKADDR*) &Addr, &Len))
// Khi ong hoat ong gi d lieu tren m_pDoSendObject
m_pDoSendObject->AsyncSelect(FD_WRITE);
}
Thc hien cac cai at bo sung cho lp oi tng dialog CTcpServerDlg
lam giao dien chnh cua ng dung server:
- M dialog resource, cai at cac control sau:
- Hop nhap ten tap tin : Edit So hieu IDC_FILE
- Hop hien th trang thai he thong : Static IDC_INFO
- Hop hien th IP cua host lam server : Static IDC_HOSTIP
- oi tng thuoc tnh protected lam nhiem vu truyen thong:
CEmpTcpServer* m_Tcp;
- Hanh vi OnInitDialog cua dialog khi tao thong so cho dialog va cac
thong so can thiet cho hoat ong truyen thong vi m_Tcp:
BOOL CTcpServerDlg::OnInitDialog()
{
CDialog::OnInitDialog(); SetIcon( m_hIcon, TRUE );
SetDlgItemText( IDC_FILE, "C:/AUTOEXEC.BAT" );
212 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
// Xac nh a ch IP cua server host
char name[1024];
gethostname( name, 1024 );
PHOSTENT phost =gethostbyname( name );
SetDlgItemText( IDC_HOSTIP,
inet_ntoa(*(in_addr*)phost->h_addr) );
m_Tcp =new CEmpTcpServer( this );
m_Tcp->Create( PORT_NO ); // Khi tao thong so
m_Tcp->Listen(); // Ch ket noi
return TRUE;
}
- Hanh vi OnDestroy thc hien giai phong oi tng truyen thong
void CTcpServerDlg::OnDestroy()
{
CDialog::OnDestroy();
delete m_Tcp;
}
Tao d an TcpClient. Thao tac tng t d an TcpServer.

Thc hien cac cong viec sau ay vi d an TcpClient :
Bo sung lp CEmpTcpReader ke tha CAsyncSocket am nhan chc
nang xin ket noi (Connect), va nhan d lieu (OnReceive) t server:
- Thuoc tnh public cha trang thai truyen thong:
BOOL m_isBusy; // = TRUE : ang ban
- Thuoc tnh protected cha con tro oi tng dialog lien quan:
CDialog* m_Parent;
- Hanh vi tao lap nhan tham so la oi tng dialog lien quan:
CEmpTcpReader::CEmpTcpReader(CDialog* parent)
{
m_isBusy =FALSE; // San sang lam viec
m_Parent =parent;
}
- Hanh vi OnReceive nhan d lieu va lu xuong tap tin:
void CEmpTcpReader::OnReceive(int nErrorCode)
{
static BOOL fileOK =TRUE;
static BOOL fileReady =FALSE;
static CFile file;
static long total;
MFC vi Internet 213
BUFFER buf;
Receive(&buf, BUFFER_LEN +sizeof(int));
if ( fileOK && (!fileReady) ) {
m_Parent->SetDlgItemText(IDC_INFO, "\nDownloading...");
fileReady =TRUE;
CString fileName; // Ten tap tin cha d lieu nhan
// IDC_FILE : So hieu hop nhap ten tap tin tren dialog
m_Parent->GetDlgItemText( IDC_FILE, fileName );
fileOK =file.Open ( fileName,
CFile::modeWrite | CFile::modeCreate );
total =0; // Kch thc d lieu nhan c
}
if ( fileOK && buf.length >0 ) {
file.Write( buf.info, buf.length );
total +=buf.length;
if ( buf.length <BUFFER_LEN )
fileReady =FALSE; // a nhan u d lieu t server
}
else
fileReady =FALSE;
if (fileReady)
CAsyncSocket::OnReceive(nErrorCode); // Nhan tiep
else {
m_isBusy =FALSE; // Tr lai trang thai san sang
@

Close();
if (fileOK) file.Close();
CString result;
result.Format( "\nReady to connect to server !\n"
"%d (bytes) download completed.", total );
m_Parent->SetDlgItemText(IDC_INFO, result);
}
}


Thc hien cac cai at bo sung cho lp oi tng dialog CTcpClientDlg
lam giao dien chnh cua ng dung client:
- M dialog resource, cai at cac control sau:
- Hop nhap ten tap tin : Edit IDC_FILE
- Hop hien th trang thai he thong : Static IDC_INFO
- Hop nhap a ch IP cua server : IPControl IDC_HOSTIP
214 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
- Nut lenh download tap tin t server : Button IDOK
- Tao thuoc tnh bien m_serverIP cho hop nhap IDC_HOSTIP.
- oi tng thuoc tnh protected lam nhiem vu truyen thong:
CEmpTcpReader *m_readTcp;
- Hanh vi OnInitDialog cua dialog khi tao thong so cho dialog va
cac thong so can thiet cho hoat ong truyen thong vi m_readTcp:
BOOL CTcpClientDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
m_serverIP.SetWindowText( "127.0.0.1" ); // local host
SetDlgItemText( IDC_FILE, "C:/Autoexec.000" );
m_readTcp =new CEmpTcpReader( this );
return TRUE;
}
- Hanh vi OnDestroy giai phong oi tng truyen thong:
void CTcpClientDlg::OnDestroy()
{
CDialog::OnDestroy();
delete m_readTcp;
}
- Hanh vi OnOK ng vi nut chon download bat au nhan d lieu:
void CTcpClientDlg::OnOK()
{
CString s;
m_serverIP.GetWindowText(s);
if ( m_readTcp->m_isBusy || s =="0.0.0.0" ) return;
m_readTcp->m_isBusy =TRUE; // Trang thai ban
@

m_readTcp->Create();
m_readTcp->Connect(s, PORT_NO);
}
Bien dch cac d an va th nghiem tren mot hoac nhieu may.
Chon muc : Project / Set Active Project e an nh d an lam viec
trong tap d an (Workspace) nh trng hp noi tren.
S dung CSocket va CSocketFile cho tac vu truyen tap tin noi tren.
MFC vi Internet 215
Lp CSocket:
CSocket la lp ke tha CAsyncSocket ma cac hanh vi gi va nhan
d lieu cua no t ong thc hien c che ch cho tac vu trc o hoan
tat. Nh vay, se khong gap loi tac vu nghen (WSAEWOULDBLOCK)
khi thc hien truyen d lieu vi CSocket. ieu nay rat quan trong vi
cac ng dung truyen tai d lieu co kch thc ln nh ng dung (13.5).
Trong phan noi dung tiep theo, CSocket se c s dung e thay the
cho CAsyncSocket trong cac v du minh hoa.

13.6 TCP VI SMTP (SIMPLE MAIL TRANSFER PROTOCOL):
SMTP la giao thc n gian va hieu qua cho viec truyen tai e-mail t host
gi en host nhan mail; v du t mot mail client en mot mail server. Qua
trnh truyen tai mail c thc hien tren c s thiet lap mot kenh lien lac hai
chieu gia hai host. Host gi lan lt phat cac ch th ket noi va gi d lieu.
Host nhan tiep nhan d lieu va tra li e host gi co c s xac nh thao tac
thch hp ke tiep. Mo hnh hoat ong truyen tai mail gia hai host nh sau:


Khi nhan c yeu cau cua ngi dung, host gi phat tn hieu en host
nhan e xin ket noi.
Moi khi nhan c mot xac nhan ong y cua host nhan, host gi tiep
tuc chuyen phan noi dung ke tiep cua mail.
Qua trnh tren ket thuc khi mail a gi xong hoac co s tra li vi noi
dung t choi t pha host nhan.

13.6.1 Qui c giao tac gia ng dung gi mail va ng dung nhan mail:
Thiet lap lien ket: au tien, ng dung gi mail tren host gi s dung
giao thc TCP ket noi vi ng dung nhan mail tren host nhan thong qua
a ch IP cua host nhan va so hieu port cua ng dung nhan mail.
Gi: M socket va lien lac vi ng dung nhan mail (port = 25).
Nhan: 220 <Domain> <ServerName> ready

216 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Sau khi nhan c tn hieu tra li nh tren t ng dung nhan mail,
ng dung gi mail tiep tuc thc hien cac tac vu sau ay theo th t.

Trnh dien vi ng dung nhan mail:
Gi: HELO <SP> <domain> <CRLF>
Trong o: SP : Ky t khoang trang
CRLF : \r\n // return & newline in C
Nhan: OK : 250 BBN-UNIX.ARPA
ERROR : So hieu loi (ket noi b t choi).
Neu nhan c tra li 250 <Server Name> t ng dung nhan mail,
ng dung gi mail co the tiep tuc cac cong viec ke tiep.

ang ky a ch ngi gi mail:
Gi: MAIL <SP> FROM:<a_ch_ni_gi> <CRLF>
Nhan: OK : 250 OK
ERROR : ang ky khong c chap nhan ket thuc.
ang ky a ch ngi nhan mail: Neu mail c gi cho nhieu a ch
th thc hien thao tac nay nhieu lan cho cac a ch nhan o.
Gi: RCPT <SP> TO:<a_ch_ni_nhan> <CRLF>
Nhan: OK : 250 OK
ERROR : 550 Failure Info
Chuan b truyen noi dung cua mail:
Gi: DATA <CRLF>
Nhan: OK : 354 Intermediate reply
ERROR : 550 Failure
Truyen noi dung cua mail: Co the lap nhieu lan thao tac sau ay tuy
theo so oan van ban trong noi dung cua mail.
Gi: Noi dung oan van ban th (i) cua mail
Nhan: Khong co tra li cua host nhan.
Cham dt truyen noi dung cua mail:
Gi: <CRLF> . <CRLF>
Nhan: 250 OK
Ket thuc ket noi vi host nhan:
Gi: QUIT <CRLF>
Nhan: 221 Terminated Info

Cham dt lien ket gia hai ng dung gi mail va nhan mail.

13.6.2 Thiet ke ng dung gi mail:
MFC vi Internet 217
Trong phan nay, ta xay dng ng dung s dung giao thc TCP e ket noi
va gi mail len mot mail server. Noi dung mail va cac an nh lien quan c
the hien tren dialog giao dien chnh cua ng dung.
Dung MFC Wizard tao d an vi ca so giao dien chnh la dialog, co s
dung winsock (xem muc 13.4). at ten cho d an la SMTP.
Thc hien cac cai at sau ay cho dialog giao dien (CSMTPDlg):
- M dialog resource, cai at cac control sau:
- Hop nhap a ch mail server : Edit IDC_SERVER_IP
- Hop nhap so hieu port : Edit IDC_SERVER_PORT
- Hop nhap a ch ngi nhan : Edit IDC_MAIL_TO
- Hop nhap tieu e cua mail : Edit IDC_MAIL_SUBJECT
- Hop soan thao noi dung mail : Edit IDC_MAIL
- Nut lenh thc hien gi mail : Button IDOK
- Hanh vi OnInitDialog thc hien cac khi tao can thiet:
BOOL CSMTPDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);

SetDlgItemText(IDC_SERVER_IP, "omail.hcmueco.edu.vn");
SetDlgItemText(IDC_SERVER_PORT, "25");
SetDlgItemText(IDC_MAIL_TO, "emp@hcmueco.edu.vn");
SetDlgItemText(IDC_MAIL_SUBJ ECT,
"A Lesson of Mr.Emp");
SetDlgItemText(IDC_MAIL, "Hello Mr.Emp!\r\n\r\n"
"It's nice to meet You.\r\n\r\n"
"Thanks for your lessons.");
return TRUE;
}
- Hanh vi kiem tra loi tren gia tr nhan c t ng dung nhan mail:
Cai at hanh vi protected: GetErrorCode cho lp CSMTPDlg:
UINT CSMTPDlg::GetErrorCode(char *sReply)
{
UINT rs =0;
sscanf(sReply, "%d", &rs);
return rs; // Tra ve so hieu loi ghi trong d lieu nhan c
}
- Hanh vi OnOK ng vi nut chon IDOK thc hien gi mail:
218 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
void CSMTPDlg::OnOK()
{
char s[1025];
UINT port;
CSocket m_sock;
GetDlgItemText(IDC_SERVER_IP, s, 1024);
port =GetDlgItemInt(IDC_SERVER_PORT);
m_sock.Create();
if (!m_sock.Connect(s, port)) return;
if (!m_sock.Receive(s, 1024) || GetErrorCode(s) !=220)
return;
strcpy(s, "HELO Mr.Emp\r\n");
m_sock.Send(&s, strlen(s));
if (!m_sock.Receive(s, 1024) || GetErrorCode(s) !=250)
return;
// a ch ngi gi
strcpy(s, "MAIL FROM:Mr.Emp\r\n");
m_sock.Send(&s, strlen(s));
if (!m_sock.Receive(s, 1024) || GetErrorCode(s) !=250)
return;
// a ch ngi nhan
strcpy(s, "RCPT TO:");
GetDlgItemText(IDC_MAIL_TO, s +strlen(s), 1024);
strcpy(s +strlen(s), "\r\n");
m_sock.Send(&s, strlen(s));
if (!m_sock.Receive(s, 1024) || GetErrorCode(s) ==550)
return;
// Chuan b truyen noi dung mail
strcpy(s, "DATA\r\n");
m_sock.Send(&s, strlen(s));
if (!m_sock.Receive(s, 1024) || GetErrorCode(s) !=354)
return;
// Chu e mail
strcpy(s, "Subject:");
GetDlgItemText(IDC_MAIL_SUBJ ECT, s +strlen(s), 1024);
strcpy(s +strlen(s), "\r\n");
m_sock.Send(&s, strlen(s));
// Noi dung mail
MFC vi Internet 219
GetDlgItemText(IDC_MAIL, s, 1024);
sprintf(s, "%s%s", s, "\r\n");
m_sock.Send(&s, strlen(s));
// Ket thuc
strcpy(s, "\r\n.\r\n");
m_sock.Send(&s, strlen(s));
strcpy(s, "QUIT\r\n");
m_sock.Send(&s, strlen(s));
m_sock.Close();
MessageBox("The Mail was sent OK !", "Send mail");
}

13.7 TCP VI POP3 (Post Office Protocol - Version 3):
POP3 la giao thc cho phep mail client host ket noi vi mail server host e
lay thong tin ve hop mail cua ngi dung tren mail server. Hoat ong truy
xuat nay nham tai mail cua ngi dung ve client host va xoa mail ay khoi
hop mail cua ho tren mail server. Tng t SMTP, qua trnh tai mail t server
cua POP3 c thc hien tren c s thiet lap mot kenh lien lac hai chieu gia
client va server. Client gi lan lt gi cac ch th ket noi va nhan d lieu.
Mail server tiep nhan yeu cau cua client va tra li hoac gi d lieu.

13.7.1 Qui c giao tac gia hai ng dung mail client va mail server:
Thiet lap lien ket: au tien, ng dung mail client s dung giao thc
TCP ket noi vi ng dung mail server thong qua a ch IP cua mail
server host va so hieu port cua ng dung mail server.
Gi: M socket va lien lac vi ng dung mail server (port=110).
Nhan: +OK ok_message
-ERR error_message
Sau khi nhan c tn hieu tra li OK t ng dung mail server, ng
dung mail client tiep tuc thc hien cac tac vu sau theo th t.
ang ky tai khoan truy cap mail server:
Khai bao user name:
Gi: USER <SP> <ten_ngi_s_dung> <CRLF>
Nhan: +OK ok_message
-ERR error_message ket thuc.
Khai bao password:
Gi: PASS <SP> <noi_dung_password> <CRLF>
Nhan: +OK ok_message
220 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
-ERR error_message ket thuc.
Sau khi ang nhap thanh cong, co the tuy y thc hien cac cong viec sau:
Lay thong tin ve hop mail:
Gi: STAT <CRLF>
Nhan: +OK <SP> <number_of_mail> <SP> <mail_total_size>
-ERR error_message
Lay thong tin chi tiet cua cac mail trong hop mail:
Gi: LIST <CRLF>
Nhan: +OK <SP> Mailbox scan listing follows
-ERR error_message
oc mail:
Gi: RETR <SP> <so_hieu_mail_c_oc> <CRLF>
Nhan: +OK kch_thc_message octets
message do mail server gi ve, ket thuc bi dau .
-ERR error_message
Xoa mail:
Gi: DELE <SP> <so_hieu_mail_xoa> <CRLF>
Nhan: +OK message <n> deleted
-ERR error_message
Cham dt lien ket vi mail server:
Gi: QUIT <CRLF>
Nhan: + OK goodbye_message
- ERR error_message

13.7.2 Thiet ke ng dung nhan mail:
Trong phan nay, ta xay dng ng dung s dung giao thc TCP e ket noi
va lay mail t mot POP mail server. Thong so lien quan mail server va thong
tin nhan c se c the hien tren dialog giao dien chnh cua ng dung.
Dung MFC Wizard tao d an vi ca so giao dien chnh la dialog, co s
dung winsock (xem muc 13.4). at ten cho d an la POP3.
Thc hien cac cai at sau cho dialog giao dien chnh (CPOP3Dlg):
- M dialog resource, cai at cac control sau:
- Hop nhap a ch mail server : Edit IDC_SERVER_IP
- Hop nhap so hieu port : Edit IDC_SERVER_PORT
- Hop nhap ten ngi truy cap : Edit IDC_USER_NAME
- Hop nhap password truy cap : Edit IDC_USER_PASSWORD
MFC vi Internet 221
- Hop nhap so hieu mail nhan ve : Edit
IDC_MAIL_NO
- Hop hien th noi dung mail : Edit IDC_MAIL
- Nut lenh lay thong tin ve mail : Button IDOK
- Nut lenh thc hien nhan mail : Button IDC_READ_MAIL
- Hanh vi OnOK ng vi nut OK thc hien lay thong tin ve hop mail:
void CPOP3Dlg::OnOK()
{
char s[1025];
UINT port;
CSocket m_sock;
GetDlgItemText (IDC_SERVER_IP, s, 1024);
port =GetDlgItemInt(IDC_SERVER_PORT);
m_sock.Create();
if (!m_sock.Connect(s, port)) return;
if ( !m_sock.Receive(s, 1024) || !isOK(s) ) return;
strcpy(s, "USER "); // ang nhap
GetDlgItemText(IDC_USER_NAME, s +strlen(s), 1024);
strcat(s, "\r\n");
m_sock.Send(&s, strlen(s));
if ( !m_sock.Receive(s, 1024) || !isOK(s) ) return;
strcpy(s, "PASS "); // ang ky password
GetDlgItemText(IDC_USER_PASSWORD, s+strlen(s), 1024);
strcat(s, "\r\n");
m_sock.Send(&s, strlen(s));
if ( !m_sock.Receive(s, 1024) || !isOK(s) ) return;
strcpy(s, "LIST\r\n"); // Lay thong tin hop mail
m_sock.Send(&s, strlen(s));
if ( (port =m_sock.Receive(s, 1024)) <1 || !isOK(s) )
return;
s[port] ='\0';
SetDlgItemText(IDC_MAIL, s+4); // Bo qua +OK<SP>
// Ket thuc...
strcpy(s, "QUIT\r\n");
m_sock.Send(&s, strlen(s));
m_sock.Close();
}
222 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
- Hanh vi protected : isOK kiem tra tra li cua mail server tren d
lieu nhan c sau moi tac vu lien lac:
BOOL CPOP3Dlg::isOK(char *result)
{
return ( result[0] =='+' &&
result[1] =='O' &&
result[2] =='K' ); // +OK : Thanh cong
}
- Hanh vi OnReadMail (nut chon IDC_READ_MAIL) tai mail ve:
void CPOP3Dlg::OnReadMail()
{ char s[10241];
UINT port;
CSocket m_sock;
GetDlgItemText(IDC_SERVER_IP, s, 1024);
port =GetDlgItemInt(IDC_SERVER_PORT);
m_sock.Create(); if (!m_sock.Connect(s, port)) return;
if ( !m_sock.Receive(s, 1024) || !isOK(s) ) return;
strcpy(s, "USER "); // ang nhap
GetDlgItemText(IDC_USER_NAME, s +strlen(s), 1024);
strcat(s, "\r\n");
m_sock.Send(&s, strlen(s));
if ( !m_sock.Receive(s, 1024) || !isOK(s) ) return;
strcpy(s, "PASS "); // Hp le ?
GetDlgItemText(IDC_USER_PASSWORD, s+strlen(s), 1024);
strcat(s, "\r\n");
m_sock.Send(&s, strlen(s));
if ( !m_sock.Receive(s, 1024) || !isOK(s) ) return;
strcpy(s, "RETR "); // Tai mail ve
GetDlgItemText (IDC_MAIL_NO, s +strlen(s), 1024);
strcat(s, "\r\n");
m_sock.Send(&s, strlen(s));
if ( (port =m_sock.Receive(s, 10240)) ==0 || !isOK(s) )
return;
s[port] ='\0'; SetDlgItemText(IDC_MAIL, strstr(s, "From"));
strcpy(s, "QUIT\r\n"); // Ket thuc
m_sock.Send(&s, strlen(s)); m_sock.Close();
}
MFC vi Internet 223
13.8 TCP VI HTTP & FTP:
HTTP va FTP la cac giao thc tang ng dung c xay dng da tren giao
thc TCP tang truyen tai (mo hnh DARPA).
HTTP: Giao thc phuc vu mo hnh ng dung Client/Server, dung pho
bien trong viec truyen tai cac noi dung HTML (www) gia
client va server. Trong o ng dung client ket noi vi ng dung
server thong qua cong TCP xac nh, thong thng la 80.
FTP: Giao thc truyen tai tap tin. ng dung client ket noi vi ng
dung server thong qua hai cong TCP; mot dung ieu khien
truyen, mot dung truyen d lieu; thong thng la 20 va 21.
MFC ho tr rat manh cho viec khai thac cac giao thc noi tren thong
qua cac lp oi tng trong th vien AfxInet.h.
13.8.1 CInternetSession:
CInternetSession la lp oi tng quan ly mot giao tac xac nh vi mang
internet, ke ca viec thc hien ket noi vi proxy server.
Moi giao tac internet cho phep thc hien cac tac vu lien quan en tap tin
tren cac internet server thong qua cac dch vu ac biet nh FTP, HTTP.
CInternetSession (
LPCTSTR pstrAgent = NULL,
DWORD dwContext = 1,
DWORD dwAccessType =
INTERNET_OPEN_TYPE_PRECONFIG,
LPCTSTR pstrProxyName = NULL,
LPCTSTR pstrProxyBypass = NULL,
DWORD dwFlags = 0
); Hanh vi tao lap va khi tao thong so cho oi tng giao tac internet.
pstrAgent : Ten ng dung. Mot so ng dung dung ten lam gia
tr nhan dien oi vi server.
dwContext : So hieu nhan dien dien tien cua tac vu.
dwAccessType : Kieu truy xuat.
INTERNET_OPEN_TYPE_PRECONFIG :
Theo an nh mac nhien cua he thong.
INTERNET_OPEN_TYPE_DIRECT :
Trc tiep khong thong qua proxy.
INTERNET_OPEN_TYPE_PROXY :
Thong qua proxy.
224 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
pstrProxyName : Proxy. S dung cho truy xuat thong qua proxy.
pstrProxyBypass : Danh sach a ch cac server c truy xuat trc
tiep (dung cho an nh truy xuat qua proxy).
dwFlags : Thong so ve che o toi u trong truy xuat server.
INTERNET_FLAG_DONT_CACHE :
Khong s dung cache tat ca cac host lien
quan en cac tac vu tap tin cua giao tac.
INTERNET_FLAG_OFFLINE :
S dung cache cho cac tac vu tap tin.
CFtpConnection* GetFtpConnection (
LPCTSTR pstrServer, // a ch FTP server
LPCTSTR pstrUserName = NULL, // Ten ang nhap
LPCTSTR pstrPassword = NULL, // password hp le
INTERNET_PORT nPort = /* so hieu port ket noi */
INTERNET_INVALID_PORT_NUMBER,
BOOL bPassive = FALSE // C che ket noi
); Tra ve con tro oi tng quan ly lien ket vi FTP server.
bPassive : Qui nh c che chon port cho ket noi.
- TRUE : Do ngi dung chon.
- FALSE: Do FTP Server chon (la c che mac nhien).
CHttpConnection* GetHttpConnection (
LPCTSTR pstrServer, // a ch HTTP server
INTERNET_PORT nPort = /* so hieu port */
INTERNET_INVALID_PORT_NUMBER,
LPCTSTR pstrUserName = NULL, // Ten ang nhap
LPCTSTR pstrPassword = NULL // password hp le
); Tra ve con tro oi tng quan ly lien ket vi HTTP server.

13.8.2 CInternetFile:
CInternetFile la lp oi tng quan ly mot tap tin tren mang internet.
CInternetFile( ); Tao lap oi tng quan ly tap tin.
virtual LONG Seek (
LONG lOffset, // C ly di tng oi
UINT nFrom // V tr lam moc.
); An nh v tr con tro (au oc/ghi d lieu) trong tap tin.
Cac gia tr dung cho nFrom co the la:
- CFile::current : Tnh t v tr hien hanh cua con tro tap tin.
MFC vi Internet 225
- CFile::begin : Tnh t au tap tin.
- CFile::end : Tnh t cuoi tap tin.
virtual UINT Read (
void* lpBuf, // a ch vung em cha d lieu oc
UINT nCount // Kch thc d lieu oc vao
); oc d lieu t tap tin.
virtual void Write (
const void* lpBuf, // a ch vung em cha d lieu ghi ra
UINT nCount // Kch thc d lieu c ghi
); Ghi d lieu ra tap tin.
virtual BOOL ReadString (
CString& rString // Bien cha chuoi oc vao
); oc mot chuoi t tap tin.
virtual void WriteString (
LPCTSTR pstr // Bien cha chuoi c ghi ra
); Ghi mot chuoi ra tap tin.
virtual void Close( ); ong tap tin, cham dt moi tac vu lien quan.

13.8.3 CFtpConnection:
CFtpConnection la lp oi tng quan ly mot lien ket vi FTP server. oi
tng nay co the nhan c t oi tng quan ly giao tac vi mang internet
thong qua hanh vi GetFtpConnection vi thong so thch hp (13.8.1). Cac
hanh vi ac trng cua lp oi tng CFtpConnection nh sau:
BOOL SetCurrentDirectory (
LPCTSTR pstrDirName // ng dan cua th muc.
); An nh th muc lam viec mac nhien tren FTP server.
BOOL GetCurrentDirectory (
CString& strDirName // Bien cha ket qua
); Lay ng dan cua th muc lam viec tren FTP server.
BOOL RemoveDirectory (
LPCTSTR pstrDirName // ng dan th muc
); Xoa th muc tren FTP server.
BOOL CreateDirectory (
LPCTSTR pstrDirName // ng dan va ten th muc
); Tao mi th muc tren FTP server.
BOOL Rename (
LPCTSTR pstrExisting, // ng dan va ten cu cua th muc
226 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
LPCTSTR pstrNew // Ten mi cua th muc
); oi ten th muc tren FTP server.
BOOL Remove (
LPCTSTR pstrFileName // ng dan va ten tap tin
); Xoa tap tin tren FTP server.
CInternetFile* OpenFile (
LPCTSTR pstrFileName, // ng dan va ten tap tin c m
DWORD dwAccess = GENERIC_READ,
DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY,
DWORD dwContext = 1
); M tap tin tren FTP server. Tra ve con tro oi tng CInternetFile
quan ly tap tin c m.
dwAccess : Che o m tap tin, chon mot trong cac che o m sau:
GENERIC_WRITE : M e ghi.
GENERIC_READ : M e oc.
dwFlags : Kieu noi dung tap tin.
FTP_TRANSFER_TYPE_ASCII : Ma ASCII
FTP_TRANSFER_TYPE_BINARY : Ma nh phan
BOOL PutFile (
LPCTSTR pstrLocalFile, // ng dan va ten tap tin client
LPCTSTR pstrRemoteFile, // ng dan va ten tap tin server
DWORD dwFlags = /* Kieu noi dung tap tin */
FTP_TRANSFER_TYPE_BINARY,
DWORD dwContext = 1 // So hieu nhan dien tac vu
); Tai mot tap tin t host lam viec len FTP server (upload).
BOOL GetFile (
LPCTSTR pstrRemoteFile, // ng dan ten tap tin tren server
LPCTSTR pstrLocalFile, // ng dan ten tap tin tren client
BOOL bFailIfExists = TRUE, // Che o x ly trung ten tap tin.
DWORD dwAttributes = FILE_ATTRIBUTE_NORMAL,
DWORD dwFlags = /* Kieu noi dung tap tin */
FTP_TRANSFER_TYPE_BINARY,
DWORD dwContext = 1
); Tai mot tap tin t FTP server ve host lam viec.
bFailIfExists : Qui nh cach thc hien khi ten dung cho tap tin ghi
trung vi ten mot tap tin a co tren host lam viec.
MFC vi Internet 227
TRUE Thong bao loi.
FALSE T ong ghi chong len noi dung a co.
dwAttributes : Thuoc tnh tap tin. Co the ket hp cac gia tr sau:
FILE_ATTRIBUTE_ARCHIVE : Tap tin c cap nhat.
FILE_ATTRIBUTE_DIRECTORY : Th muc.
FILE_ATTRIBUTE_NORMAL : Tap tin bnh thng.
FILE_ATTRIBUTE_HIDDEN : Tap tin an mat.
FILE_ATTRIBUTE_READONLY : Tap tin ch oc.
FILE_ATTRIBUTE_SYSTEM : Tap tin he thong.
FILE_ATTRIBUTE_TEMPORARY : Tap tin s dung tam thi.
virtual void Close( ); Ket thuc lien ket vi FTP server.

13.8.4 CFtpFindFile:
CFtpFindFile la lp oi tng quan ly mot cong cu tm kiem tap tin tren
FTP server. Cac hanh vi ac trng cua lp nh sau:
CFtpFileFind( CFtpConnection* pConnection ); Tao lap va khi tao
thong so cho oi tng tm kiem tap tin.
virtual BOOL FindFile (
LPCTSTR pstrName = NULL, // Dang ten tap tin can tm
DWORD dwFlags = INTERNET_FLAG_RELOAD
); Khi ong qua trnh tm kiem tap tin. Tra ve gia tr TRUE neu khi
iem tm kiem thanh cong.
Co the s dung ? , * e an nh dang ten cua tap tin can tm.
dwFlags = INTERNET_FLAG_DONT_CACHE khong s dung cache.
virtual BOOL FindNextFile( ); Tm tap tin ke tiep thoa ieu kien. Tra
ve gia tr TRUE neu tac vu tm kiem thanh cong, neu ngc lai th xem
nh a tm het cac tap tin thoa ieu kien tm kiem.
CString GetFileURL( ); Tra ve chuoi ng dan cua tap tin va tm
c theo yeu cau.
oan chng trnh sau thc hien tm kiem cac tap tin vi ten co phan
m rong la txt tren FTP server:

CInternetSession sess(_T("FTP - Example")); // Quan ly giao tac
CFtpConnection* pConnect =NULL; // Lien ket vi server
try {
pConnect =sess.GetFtpConnection(ftp.hcmueco.edu.vn);
CFtpFileFind TimFile ( pConnect ); // oi tng tm kiem
228 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
BOOL TimThay =TimFile.FindFile(_T("*.TXT"));
while (TimThay) {
TimThay =TimFile.FindNextFile();
// X ly tap tin tm thay
}
}
catch (CInternetException* pEx) {
// Co loi
}
if (pConnect !=NULL) pConnect->Close();
delete pConnect;

13.8.5 CHttpConnection:
CHttpConnection la lp oi tng quan ly mot lien ket vi HTTP server.
oi tng nay co the nhan c t oi tng quan ly giao tac vi mang
internet thong qua hanh vi GetHttpConnection vi thong so thch hp (13.8.1).
Lp CHttpConnection co hanh vi ac trng sau:
CHttpFile* OpenRequest (
int nVerb,
LPCTSTR pstrObjectName,
LPCTSTR pstrReferer = NULL,
DWORD dwContext = 1,
LPCTSTR* pstrAcceptTypes = NULL,
LPCTSTR pstrVersion = NULL,
DWORD dwFlags = INTERNET_FLAG_EXISTING_CONNECT
); Tra ve con tro oi tng CHttpFile quan ly tap tin d lieu can truy
xuat tren HTTP server.
nVerb: An nh loai tac vu truy xuat oi vi tap tin d lieu.
CHttpConnection::HTTP_VERB_POST : Ghi d lieu
CHttpConnection::HTTP_VERB_GET : oc d lieu
CHttpConnection::HTTP_VERB_DELETE : Xoa tap tin d lieu.
pstrObjectName : ng dan va ten tap tin d lieu tren HTTP server.
pstrReferer : a ch (root) cua tap tin d lieu.
dwContext : So hieu nhan dien tac vu truy xuat.
pstrAcceptTypes : Cha cac kieu d lieu ma client mong muon khai
thac trong noi dung cua tap tin d lieu c truy
xuat. V du: "text/*" = Ch lay noi dung text, khong
nhan d lieu la hnh anh, ma,
MFC vi Internet 229
pstrVersion: Giao thc s dung, mac nhien la "HTTP/1.0"
dwFlags : Toi u trong truy xuat
INTERNET_FLAG_RELOAD : Khong oc t cache.
INTERNET_FLAG_DONT_CACHE : Khong e lai cache.

13.8.6 CHttpFile:
CHttpFile la lp oi tng quan ly mot tap tin d lieu oc lap ang c
truy xuat tren HTTP server.
BOOL QueryInfo (
DWORD dwInfoLevel, // Thong so truy van
LPVOID lpvBuffer, // Vung em nhan ket qua
LPDWORD lpdwBufferLength, // Chieu dai vung em
LPDWORD lpdwIndex = NULL
); Truy van thong tin lien quan en tap tin d lieu. Tra ve gia tr TRUE
neu tac vu truy van thanh cong. Thong so truy van co the la:
HTTP_QUERY_FLAG_REQUEST_HEADERS : Thong tin header.
HTTP_QUERY_LAST_MODIFIED : Ngay cap nhat cuoi cung.
BOOL AddRequestHeaders (
CString& str, // Noi dung thong so yeu cau
DWORD dwFlags = HTTP_ADDREQ_FLAG_ADD_IF_NEW
); Cap nhat mot yeu cau mi vao danh sach cac yeu cau oi vi tap tin
d lieu. Cac yeu cau nay se c gi len HTTP server thc hien.
Noi dung moi yeu cau phai ket thuc bang <CRLF>. Xem (RFC2616):
- Accept : e ngh kieu d lieu truy xuat trong tap tin.
Cu phap: "Accept: (media-range [ accept-params ][,])* "
V du: "Accept: audio/*" , "Accept: text/plain"
- User-Agent : Ten, dung nhan dien ng dung yeu cau.
Cu phap : "User-Agent" ":" Name( product | comment )*"
V du : "User-Agent: Mr.EMP"
- Content-Type : Kieu noi dung tap tin d lieu.
Cu phap : "Content-Type: media-type*"
V du: "Content-Type: text/html; charset=ISO-8859-4"
dwFlags : Thong so an nh c che cap nhat:
HTTP_ADDREQ_FLAG_COALESCE : Tron cac noi dung cua
cung mot loai yeu cau:
"Accept: text/*" va "Accept: audio/*" "Accept: text/*, audio/*"
230 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
HTTP_ADDREQ_FLAG_REPLACE : Thay the noi dung trc
bi noi dugn sau co cung
loai yeu cau.
"Accept: text/*" va "Accept: audio/*" "Accept: audio/*"
HTTP_ADDREQ_FLAG_ADD : Nh _REPLACE va t
ong bo sung neu loai
yeu cau mi la cha co.
BOOL SendRequest (
CString& strHeaders, // Noi dung yeu cau.
LPVOID lpOptional = NULL, // Cac dien giai cua client (khong
DWORD dwOptionalLen = 0 // bat buoc )
); Gi yeu cau lien quan tap tin d lieu len HTTP server. Neu khong
ch ra noi dung yeu cau th mac nhien dung yeu cau an nh bi hanh
vi AddRequestHeaders.
BOOL SendRequestEx (
LPINTERNET_BUFFERS lpBuffIn, // Kch thc d lieu
LPINTERNET_BUFFERS lpBuffOut, // Vung em cha d lieu
DWORD dwFlags = HSR_INITIATE,
DWORD dwContext = 1
); Ghi thong tin len tap tin d lieu tren HTTP server.
BOOL EndRequest (
DWORD dwFlags = 0,
LPINTERNET_BUFFERS lpBuffIn = NULL,
DWORD dwContext = 1
); Ngng tac vu ghi tren tap tin d lieu cua HTTP server.
virtual CString GetFileURL( ); Tra ve ng dan va ten cua tap tin d
lieu tren HTTP server.
virtual void Close( ); Ket thuc truy xuat tap tin d lieu.

V du: oan chng trnh sau thc hien ket noi vi HTTP server. oc va
hien th noi dung cua tap tin /index.html tren server nay.
MFC vi Internet 231
CInternetSession session("HTTP - Example");
CHttpFile* file=NULL;
CString strServer ="www.hcmueco.edu.vn";
CString strObject("/index.html");
INTERNET_PORT port =INTERNET_DEFAULT_HTTP_PORT;
CString strHeaders (
"Accept: text/*\r\n
User-Agent: Mr.Emp\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n");
CHttpConnection* server =NULL;
try {
server=session.GetHttpConnection(strServer, port);
file=server->OpenRequest (
CHttpConnection::HTTP_VERB_POST,strObject );
}
catch (CInternetException* pEx) {
// Co loi
}
if (server==NULL) return;
if (file!=NULL) {
file->AddRequestHeaders(strHeaders);
file->SendRequest(); // Xac lap yeu cau truy xuat
CString line; // S dung cho oc chuoi
while (file->ReadString(line)) {
// X ly noi dung oc c
}
file->Close();
delete file;
}
server->Close();
delete server;

13.8.7 Thc hien ng dung FTP client n gian:
Trnh t tien hanh cac x ly cua ng dung nh sau:
- Thiet lap giao tac internet, tao lien ket FTP t giao tac nay.
- Tao oi tng CFtpFileFind t lien ket FTP, tm tap tin tren ftp server.
- Tao oi tng CInternetFile t tap tin tm c. Thc hien cac tac vu
oc ghi mot cach thch hp.
- ong cac oi tng.
232 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Sau ay la cac bc thc hien d an cua ng dung noi tren:
Dung MFC Wizard, tao d an Ftp vi giao dien chnh la dialog.
Bo sung ch th: #include <afxinet.h> cho tap tin stdafx.h cua d an.
Thc hien cac cai at sau cho lp dialog CFtpDlg cua d an:
- M dialog resource, cai at cac control sau:
- Hop nhap a ch FTP server : Edit IDC_URL
- Hop hien th danh sach cac tap tin : ListBox IDC_FILE_LIST
- Nut lenh thc hien tm kiem tap tin : Button IDOK
- Tao bien m_fileList cho control IDC_FILE_LIST.
- Hanh vi OnOK ng vi nut chon IDOK thc hien tm tat ca cac tap
tin trong th muc goc cua FTP server va a vao danh sach:
Cai at tng t v du muc (13.8.4)
Phan cai at cua X ly tap tin tm thay nh sau:
m_fileList.ResetContent();
while (TimThay) {
bWorking =TimFile.FindNextFile();
m_fileList.AddString(TimFile.GetFileURL());
}
Bien dch va chay ng dung.

13.8.8 Thc hien ng dung HTTP client n gian:
Trnh t tien hanh cac x ly cua ng dung nh sau:
- Thiet lap giao tac internet, tao lien ket HTTP t giao tac nay.
- Tao oi tng CHttpFile cho tap tin quan tam tren HTTP server.
- S dung oi tng CHttpFile e QueryInfo hoac an nh truy xuat vi
AddRequestHeaders va SendRequest tren noi dung tap tin.
- Truy xuat d lieu: Read, ReadString hoac Write, WriteString.


Sau ay la cac bc thc hien d an cua ng dung noi tren:
Dung MFC Wizard, tao d an Http vi giao dien chnh la dialog.
Bo sung ch th: #include <afxinet.h> cho tap tin stdafx.h cua d an.
Thc hien cac cai at sau cho lp dialog CHttpDlg cua d an:
- M dialog resource, cai at cac control sau:
- Hop nhap a ch HTTP server : Edit IDC_URL
- Hop hien th noi dung tap tin : Edit IDC_SOURCE
- Nut lenh thc hien tai tap tin ve : Button IDOK

MFC vi Internet 233
- Hanh vi OnOK ng vi nut chon IDOK thc hien tai noi dung tap tin
t a ch nhap trong hop nhap:
Cai at tng t v du muc (13.8.6)
Phan cai at cua X ly noi dung oc c nh sau:
CString line, info;
info.Empty();
while (file->ReadString(line)) {
info =info +line;
info =info +"\r\n";
}
SetDlgItemText(IDC_SOURCE, info);
Bien dch va chay ng dung.

THC HANH:
1. Xay dng ng dung CHAT vi mot trong cac giao thc TCP va UDP.
2. Xay dng ng dung FTP explorer (xem windows explorer).
3. Xay dng ng dung chi bai tien len tren mang (mo hnh client/server).
4. Xay dng ng dung thi trac nghiem tren mang.
- ng dung giam th la trung tam ket noi vi cac ng dung kiem tra chay
tren cac host lam bai. ng dung giam th ieu khien ong bo cac ng
dung kiem tra.
- ng dung kiem tra ch ch th t ng dung giam th, tao giao dien lam
bai vi ngi dung, thng xuyen thong bao tnh trang bai lam cua
ngi dung cho ng dung giam th quan ly va bao lu.
- Khi bat au, ng dung gam th chu ong ket noi, ng dung lam bai ch
ket noi e lay thong tin ve ng dung giam th va cac thong tin khac ve
e thi, thong tin bao lu neu trc o co s co.
5. Quan sat ng dung Yahoo Messenger!. Ket hp hai kieu ng dung rtf view
(11.8) va ng dung TCP (13.5) e thc hien ng dung tng t.
6. Viet ng dung mail server va mail client n gian.
7. Viet ng dung ftp server n gian.
8. Viet ng dung http server n gian (RFC1945).
9. Viet ng dung voice chat n gian.

234 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
PHU LUC A:

Mot so van e
lap trnh hng oi tng

A.1 LAP TRNH HNG OI TNG (OOP):
Lap trnh hng oi tng (Object-Oriented Programming) la phng phap
lap trnh giai quyet bai toan da tren s phoi hp cac oi tng khach quan
trong khong gian bai toan. Cac oi tng nay hoat ong va tng tac lan nhau
e a bai toan ve trang thai mong muon.

Phng phap tiep can nay cho phep tach khong gian bai toan thanh cac
tap hp nhieu oi tng, cac oi tng co tnh oc lap tng oi vi nhau. Do
o, t mot cong viec ln phc tap ta co the phan chia thanh nhieu cong viec
nho n gian va de thc hien hn, ong thi viec ieu chnh bo sung tnh
nang cho moi oi tng cung khong anh hng en hoat ong cua cac oi
tng khac. Nh o, khi co nhu cau phat trien bai toan th ta khong phai xay
dng lai t au ma co the da tren nhng noi dung a co. ay chnh la mot
u iem ln so vi lap trnh cau truc.

A.2 CAC KHAI NIEM:
A.2.1 Lp (Class):
Lp la mot tap hp cac oi tng co cung mot so tnh chat khao sat. Cac
tnh chat nay co the la trang thai (thuoc tnh) hay hoat ong cua oi tng.
V du:
Lp ca la tap hp bao gom nhng ong vat co cung ac iem: vay, mang,
mau lanh va co cac hanh vi: song di nc, th bang mang, e trng.

A.2.2 oi tng (Object):
oi tng la mot the hien cu the cua lp. Mot oi tng thuoc lp nao se
co nhng thuoc tnh, hanh vi cua lp o.
S khac nhau ve cach the hien thuoc tnh, hanh vi cua oi tng la c s
phan biet oi tng vi cac oi tng khac trong cung mot lp.

A.2.3 Thuoc tnh (Attribute):
Thuoc tnh la gia tr phan anh trang thai cua oi tng tai mot thi iem
xac nh, giup the hien oi tng. oi tng co mot hoac nhieu thuoc tnh.
A.2.4 Hanh vi (Method):
Phu luc A: Mot so van e lap trnh hng oi tng 235
Hanh vi la kha nang ng x cua oi tng vi moi trng xung quanh, no
tac ong va thay oi thuoc tnh cua ban than oi tng va cac oi tung lien
quan. Hanh vi the hien mat hoat ong cua oi tng.
V du:
Hoat ong song cua con ngi la qua trnh van ong thay oi ban than con
ngi va tac ong (cung nh b tac ong) en moi trng xung quanh.

Ta co mo hnh cua oi tng nh sau:



A.2.5 Chng trnh (Program):
Di goc o OOP, chng trnh la chuoi thao tac phoi hp cua mot hay
nhieu oi tng nham at en mot ket cuc mong muon. Cac thao tac nay cua
cac oi tng phai c dan dng trc, ta co the goi o la kch ban.



A.3 AC IEM LAP TRNH HNG OI TNG:
- Tnh khach quan (Objective):
Mot lp oi tng hnh thanh la xuat phat t mot chu the khach quan
vi nhng thuoc tnh va hanh vi the hien ban chat va chc nang cua no.
Kch ban cua chng trnh van dung nhng yeu to khach quan nay mot
cach hp ly e at c muc ch cua chng trnh.
- Tnh ong goi (Encapsulation):
Viec bao ham cac thuoc tnh va hanh vi trong oi tng giup oi tng
co the hoat ong phoi hp trong oc lap vi cac lp oi tng khac.
- Tnh ke tha (Inheritance):
Viec nh ngha mot lp oi tng da tren cac lp oi tng a co goi
la s ke tha. Cac lp a co goi la lp c s (based class), lp c
nh ngha goi la lp ke tha (derived class). Ben canh viec ke tha,
lp ke tha co the c bo sung nhng hanh vi va thuoc tnh can thiet
e phuc vu cho nhu cau mi phat sinh. C che o a tao s phat trien
cho ng dung ma oi tng tham gia.
- Tnh a hnh (Polymorphism):
oi tng = Thuoc tnh + Hanh vi
Chng trnh = Tap hp cac oi tng + Kch ban
236 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
C che trien khai nhieu cach the hien khac nhau cho mot hanh vi theo
nguyen tac xay dng lp c s cha hanh vi can trien khai va cac lp
ke tha. Moi lp ke tha se phat trien hanh vi o theo mot cach khac
nhau. Mot oi tng ai dien lp c s se c kien tao t lp ke tha
phu hp e co cach the hien hanh vi can trien khai theo y muon. C
che nay tao kha nang ng x phong phu cua oi tng.

A.4 PHAN LOAI THUOC TNH VA HANH VI:
Cac thuoc tnh va hanh vi cua oi tng co the c chia thanh ba loai:
- Public: Cac thuoc tnh, hanh vi c oi tng the hien ben ngoai.
- Protected: Cac thuoc tnh, hanh vi an cha ben trong oi tng, ho tr
cac hoat ong cua oi tng va co the truyen lai cho cac
lp oi tng ke tha.
- Private: Cac thuoc tnh, hanh vi an cha ben trong oi tng, ho tr
cac hoat ong cua oi tng va khong the truyen lai cho
cac lp oi tng ke tha.

A.5 CAC HANH VI AC BIET:
- Hanh vi tao tap: Hanh vi c thc hien ngay khi oi tng va hnh
thanh. Hanh vi nay dung e cai at cac x ly khi
tao cac gia tr thuoc tnh cua oi tng.
Mot lp oi tng co the co mot hoac nhieu hanh
vi tao lap. Ten hanh vi tao lap trung vi ten lp. Cac
hanh vi tao lap c phan biet lan nhau bi cau truc
cac tham so cua chung.
- Hanh vi huy bo: Hanh vi c thc hien trc khi oi tng cham dt
s ton tai cua no.
Mot lp oi tng co mot hanh vi huy bo duy
nhat. Ten hanh vi huy bo trung vi ten cua lp
nhng c bat au bang dau ~. Hanh vi huy bo
khong co tham so.
Ca hanh vi tao lap va huy bo eu khong co kieu tra ve.

A.6 KHAI BAO LP, OI TNG TRONG C++:
A.6.1 Khai bao lp:
Lp oi tng c khai bao trong C++ nh sau:
// Phan khai bao cua lp:
Phu luc A: Mot so van e lap trnh hng oi tng 237
class Ten_lp {
public:
[ Khai bao cac thuoc tnh, hanh vi kieu public ]
protected:
[ Khai bao cac thuoc tnh, hanh vi kieu private ]
privated:
[ Khai bao cac thuoc tnh, hanh vi kieu private ]
};

// Phan cai at cua lp:
kieu Ten_lp::Ten_hanh_vi_1( [ Danh_sach_tham_so ] ) {
// Cac x ly trong hanh vi
}

kieu Ten_lp::Ten_hanh_vi_n( [ Danh_sach_tham_so ] ) {
// Cac x ly trong hanh vi
}

Noi dung phan khai bao va cai at cua lp c at trong hai tap tin
khai bao (.h) va cai at (.cpp). Trong o:
- Tap tin .H : Cha toan bo phan khai bao cua lp va cac ch th
nh hng bien dch (neu can).
- Tap tin .CPP : Cha toan bo phan cai at cua lp. au tap tin
nay khai bao ch th s dung tap tin .H:
#include "Ten_tap_tin_h_lien_quan"

Thc hanh 1: Xet bai toan quan ly chuoi, khong gian bai toan la cac
gia tr kieu chuoi cua C can quan ly va truy xuat.
Di goc o OOP, lp oi tng chuoi giup bieu dien chuoi co cac
thuoc tnh va hanh vi nh sau:
- Thuoc tnh: char* info c s dung e xin cap phat vung nh
cha noi dung chuoi.
- Hanh vi: - Hanh vi tao lap vi mot tham so la gia tr chuoi
lam noi dung khi au cho oi tng chuoi.
- Hanh vi huy bo giai phong vung nh info.
- Hanh vi lay a ch vung cha noi dung chuoi.
Lp chuoi c khai bao trong C++ nh sau:
238 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
// Tap tin String1.h
class CString1 {
public:
CString1 ( char* s ); // Hanh vi tao lap
~CString1 ( void ); // Hanh vi huy bo
char* GetInfo( void );
protected:
char* info;
};

// Tap tin String1.cpp
CString1::CString1( char* s ) {
info =new char[ strlen( s ) +1 ];
strcpy( info, s );
}
CString1::~CString1( ) {
delete info;
}
char* CString1::GetInfo( void ) {
return info;
}

A.6.2 Khai bao oi tng:
oi tng c khai bao nh lp tng ng. Lp co the xem nh la mot
kieu d lieu va oi tng chnh la bien ng vi kieu o.
Cu phap khai bao bien oi tng trong C++ nh sau:

Ten_lp Ten_bien_oi_tng( [Danh sach gia tr lam tham so ] );


A.6.3 S dung oi tng trong chng trnh:
Thc hien hanh vi cua bien oi tng (cac hanh vi public) nh sau:

Ten_bien_oi_tng.Ten_hanh_vi( [Danh sach gia tr lam tham so ] );


// Chng trnh Main.cpp s dung lp CString1 khai bao tren.
#include "String1.h"
void main( void ) {
CString1 a( Vo Van A );
printf( "Gia tri chuoi luu la: %s ", a.GetInfo() );
}
A.7 KE THA TRONG C++:
Phu luc A: Mot so van e lap trnh hng oi tng 239
C++ cho phep nh ngha lp ke tha t mot hoac nhieu lp c s. Cu
phap thc hien khai bao nay nh sau:

class Ten_lp_ke_tha: [ public | private ] Ten_lp_c_s1
[, [public | private ] Ten_lp_c_s2 [ , ]
{
// Cac khai bao bo sung cua lp ke tha
};

ac iem ke tha qui nh mc o ke tha cua lp ke tha t lp c s.
Co hai kieu khac nhau cua ac iem ke tha va co y ngha nh sau:

Thuoc tnh lp c s Thuoc tnh nhan c cho lp ke tha
public public private
protected protected private
private Khong truy xuat c Khong truy xuat c
ac iem ke tha public Private

V du: Khai bao lp CString1B ke tha hoan toan t lp CString1.


class CString1B : public CString1 {};

A.7.1 Ke tha hanh vi tao lap:
Moi hanh vi tao lap bo sung cua lp ke tha ch c phep s dung mot
hanh vi tao lap duy nhat t mot lp c s. Khai bao co cu phap nh sau:

Hanh_vi_tao_lap_cua_lp_ke_tha( [ Danh sach thamm so ] ) :
Hanh_vi_tao_lap_cua_lp_s_s_1( [ Cac gia tr thamm so ] )
[ , Hanh_vi_tao_lap_cua_lp_s_s_2( [ Cac gia tr thamm so ] )
[ , ] ] {

};

Khi mot oi tng thuoc lp ke tha hnh thanh, x ly trong hanh vi tao
lap cua lp ke tha va x ly trong cac hanh vi tao lap cua cac lp c s ma
lp ang ky ke tha se c thc hien theo th t nh sau:
Hanh_vi_tao_lap_cua_lp_s_s_1
240 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

Hanh_vi_tao_lap_cua_lp_s_s_2



Hanh_vi_tao_lap_cua_lp_s_s_n

Hanh_vi_tao_lap_cua_lp_ke_tha

A.7.2 Ke tha hanh vi huy bo:
Hanh vi huy bo cua lp ke tha (mac nhien thuoc loai public) t ong ke
tha hanh vi huy bo cua lp c s ma khong can phai khai bao.

Khi mot oi tng thuoc lp ke tha cham dt hoat ong, x ly trong hanh
vi huy bo cua cua lp ke tha va x ly trong cac hanh vi huy bo cua cac lp
c s se c thc hien theo th t nh sau:

Hanh_vi_huy_bo_cua_lp_ke_tha

Hanh_vi_huy_bo_cua_lp_s_s_(n)

Hanh_vi_huy_bo_cua_lp_s_s_(n-1)



Hanh_vi_tao_lap_cua_lp_s_s_1

A.7.3 Thc hien hanh vi lp c s:
Hanh vi cua lp ke tha c phep chu ong s dung hanh vi cua lp c
s cua no. Cach thc hien hanh vi cua lp c s nh sau:

Ten_lp_c_s::Ten_hanh_vi( [ Danh_sach_gia_tr_tham_so ] );


Thc hanh 2: M rong khong gian bai toan thc hanh 1, vi lp oi
tng CString2 ke tha t CString1 va bo sung hanh vi tao lap nhan
tham so la mot oi tng CString1.
Lp CString2 c khai bao trong C++ nh sau:
// Tap tin String2.h
#include String1.h
Phu luc A: Mot so van e lap trnh hng oi tng 241
class CString2 : public CString1 {
public:
// Hanh vi tao lap bo sung nhan mot tham so la oi tng CString1
CString2( CString1* s ) : CString1( s->GetInfo() ) {}
};
// Chng trnh Main2.cpp s dung lp CString2 khai bao tren.
#include "String2.h"
void main( void ) {
CString2 a( Vo Van B );
CString2 b( &a );
printf( "Gia tri chuoi luu la: %s ", b.GetInfo() );
// Ket qua nhan c: Gia tri chuoi luu la: Vo Van B
}

A.8 KHAI BAO HANH VI TOAN T SO HOC:
Khai bao hanh vi toan t so hoc la hnh thc thay the hien hanh vi theo
dang ham (kieu ai so) thanh dang toan t (kieu so hoc).
Co hai loai hanh vi toan t:
Hanh vi toan t hai ngoi: La hanh vi co mot tham so oi tac.
Khai bao:

Kieu Ten lp::operator Ky_ hieu_hanh_vi ( [ Danh sach tham so ] );

Hanh vi toan t mot ngoi: La hanh vi khong co tham so oi tac nao.
Hanh vi nay co the c s dung cho phep chuyen kieu oi tng.
Khai bao:

Ten lp::operator Ky_hieu_hanh_vi ( void );

Thc hanh 3: M rong khong gian bai toan thc hanh 1, vi cac toan t
gan ( = ), cong ( + ), va chuyen kieu lp oi tng chuoi ve kieu chuoi
cua C (char*) thay cho hanh vi GetInfo.
Tao lp ke tha CString3 t lp c s CString1. Thc hien bo sung
cac hanh vi toan t sau ay:
- Toan t chuyen kieu: char *
- Toan t gan ( = ) vi tham so la mot gia tr kieu chuoi cua C.
- Toan t cong ( + ) vi tham so la mot gia tr kieu chuoi cua C va
tra ve con tro en oi tng chuoi mi.
Lp CString3 c khai bao trong C++ nh sau:
// Tap tin String3.h
242 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
#include String1.h
class CString3 : public CString1 {
public:
CString3( char* s ) : CString1( s ) {}
// Toan t chuyen kieu
operator char* ( void ) {
return info;
}
void operator =( char* s );
CString3* operator +( char* s );
};
// Tap tin String3.cpp
#include "String3.h"
void CString3::operator =( char* s ) {
delete info;
info =new char[ strlen( s ) +1 ];
strcpy( info, s );
}
CString3* CString3::operator +( char* s ) {
char* ketqua;
ketqua =new char[ strlen(info) +strlen( s ) +1 ];
sprintf( ketqua, "%s%s", info, s );
CString3* kq =new CString3( ketqua );
delete ketqua;
return kq;
}
// Chng trnh Main3.cpp s dung lp CString3 khai bao tren.
#include "String3.h"
void main( void ) {
CString3 s1( "Chao Cac " );
CString3 s2( "Ban" );
CString3 *s =(s1 +s2);
printf( "Cong hai chuoi la: %s", *s );
delete s;
// Ket qua nhan c: Cong hai chuoi la: Chao Cac Ban
}
A.9. CON TRO this:
Phu luc A: Mot so van e lap trnh hng oi tng 243
this la con tro dung tham chieu en ban than oi tng trong noi dung cai
at cua no. Hanh vi toan t = cua lp CString3 co the viet nh sau:

void CString3::operator =( char* s ) {
delete this->info;
this->info =new char[ strlen( s ) +1 ];
strcpy( this->info, s );
}

A.10 HANH VI virtual:
Hanh vi virtual c cai at trong lp c s nham muc ch trien khai
nhieu cach the hien khac nhau cua hanh vi nay tren cac lp ke tha.
Trong v du sau, lp A c cai at vi hanh vi khung Action. Trong cac
lp B va C ke tha t A, hanh vi nay c the hien khac nhau nh sau:
- Lp B : Bat tieng beep cua PC speaker.
- Lp C : Bat hoac tat ky t x.

class A {
public:
void Action( void ) {} // Hanh vi khung c s
}
class B : public A {
public:
void Action( void ) {
// Cach the hien Action cua lp B
putch( 7 );
}
}
class C : public A {
public:
void Action( void ) {
// Cach the hien Action cua lp C ; bat, tat ch x
static char ch = x;
putch(x);
ch = ( ch == x )? : x ;
}
}
void main ( void ) {
244 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
A* a[5]; // 5 phan t kieu lp A
for ( int i =0; i<5; i++) {
if ( i % 2 )
a[ i ] =new B(); // Khi tao ngau nhien theo kieu lp B
else
a[ i ] =new C(); // hoac lp C
}
while ( !kbhit() ) {
for ( i =0; i <5 ; i++)
a[ i ]->Action( ); // Hanh ong theo cach cua lp B hoac C
delay( 100 ); // Tam dng
}
for ( i =0; i <5 ; i++)
delete a[ i ];
}

A.11 THUOC TNH VA HANH VI TNH:
Thuoc tnh va hanh vi tnh la nhng thuoc tnh va hanh vi co the khai thac
c ma khong can s dung oi tng cu the cua lp.
Trong phan khai bao cua lp:

static Kieuthuoctnh Thuoctnh;
static Kieutrave Hanhvi ( [ Danh_sach_tham_so ] );

Trong phan cai at cua lp:

Kieuthuoctnh Tenlpshu::Thuoctnh = Gia_tr_khi_au;
Kieutrave Tenlpshu::Hanhvi ( [ Danh_sach_tham_so ] ) {
// Noi dung cai at cua hanh vi
}

Lu y: Hanh vi static ch c phep s dung cac thuoc tnh static va hanh
vi static cua lp.

Trong v du sau, ta cai at lp Duongtron vi thuoc tnh ban knh, thuoc
tnh pi, va hanh vi Chuvi co hai the hien nh sau:
- Chuvi( float R ) : Tra ve chu vi cua mot ng tron co ban knh R.
- Chuvi( void ) : Tra ve chu vi cua ng tron quan ly bi oi tng.
Co the s dung hanh vi Chuvi(R) ma khong dung oi tng thuoc lp.
Lp Duongtron c khai bao nh sau:
Phu luc A: Mot so van e lap trnh hng oi tng 245
class Duongtron {
protected:
float R;
static float pi;
public:
Duongtron( float bankinh ) {
R =bankinh;
}
float Chuvi( void )
{
return R * R * pi;
}
static float Chuvi( float bankinh )
{
return R * R * pi;
}
};
float Duongtron::pi =3.14159;

// Chng trnh minh hoa s dung lp Duongtron

void main( void ) {
// Dung hanh vi tnh Chuvi( . ) cua Duongtron e tnh chu vi
// cua mot ng tron bat ky
printf( Chu vi duong tron ban kinh R =10 la : %0.2f ,
Duongtron::Chuvi( 10 ) );
// Dung hanh vi Chuvi() e tnh chu vi cua oi tng Duongtron
Duongtron a( 20 );
printf( Chu vi duong tron ban kinh R =20 la : %0.2f, a.Chuvi() );
}

Neu thuoc tnh pi cua Duongtron khong phai la thuoc tnh static th
hanh vi Chuvi( float Bankinh ) cua Duongtron se khong hp le v hanh
vi nay a s dung mot thuoc tnh khong phai static.

Potrebbero piacerti anche