You are on page 1of 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

Trang

1
1
1
1
1
2
2
2
3
3
3
5
7
8

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

10
10
10
10
11
12
14
20
25
27
27

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

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

31
31
32
32
33
34
35
38

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

40
40
40
49
49
50

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

51
51
52
55
55
55
58

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

60
60
60
63
64
65
66
67

CHNG 7 : MENU PHM TAT


7.1 nh ngha
7.2 Menu resoure

69
69
69

7.3
7.4
7.5
7.6
7.7

S dung menu resource


Muc x ly command message t muc chon cua menu
Phm tat (hot key ) cho muc chon tren menu
Lp quan ly menu CMenu
X ly ieu khien muc chon cua menu

71
72
73
75
77

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

78
78
80
84
85
88
91
93
94
96

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

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

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

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

120
121
121
123
123
124
130

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

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

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

158
158
160
162
167
168
168
170
171
175
175

12.6
12.7
12.8

12.9

12.5.2 Tieu trnh giao dien


12.5.3 Cac ham ho tr
Lap trnh Multimedia vi MCI
An nh mot so tnh nang cua Windows
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
Cai at che o thc hien ng dung t ong

177
179
179
181
182
183
183
183
184
185
186

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

220
223
223
224
225
227
228
229
231
232

Phu luc A:
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

187
187
187
187
189
190
191
192
194
197
197
198
198
199
200
200
200
204
207
215
215
217
219
219

A.1
A.2

A.3
A.4
A.5
A.6

A.7

A.8
A.9
A.10
A.11

MOT SO VAN E
LAP TRNH HNG OI TNG
Lap trnh hng oi tng (OOP)
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)
ac iem lap trnh hng oi tng
Phan loai thuoc tnh va hanh vi
Cac hanh vi ac biet
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
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
Khai bao hanh vi toan t so hoc
Con tro this
Hanh vi virtual
Thuoc tnh va hanh vi tnh

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
Y^ ]Z

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.
YX WZ
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:
- C quan:
- a ch e-mail:

Le Ngoc Thanh
Khoa Tin Hoc Quan Ly, Trng HKT TP.HCM
a ch: 279 Nguyen Tri Phng Q10, TP.HCM.
lntmail@yahoo.com
emp@ueh.edu.vn

CHNG 1:

Mt s khi nim Lp trnh


Trong mi trng Windows
1.1 CHNG TRNH (PROGRAM):
Chng trnh my tnh l tp hp cc ch th iu khin hot ng ca
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
(source code) hay m my (machine code). Chng trnh m my c th
thc hin c trn my c b lnh tng thch, vi chng trnh m
ngun th phi s dng mt ng dng chuyn dng chuyn sang m
my trc khi thc hin.
Vic chuyn cc ch th dng m ngun sang ch th m my thc
hin c tin hnh bng mt trong hai c ch sau:
Thng dch: Mi ch th m ngun c chuyn sang ch th m my
tng ng v c thc hin ngay, sau tip tc vi ch th k tip.
Bin dch: Tt c cc ch th m ngun c chuyn sang cc ch th
m my tng ng. Tp hp cc ch th m my ny gi l chng
trnh m my. Chng trnh m my c lu li trong tp tin chng
trnh v v sau ta c th thc hin chng mt cch c lp trn my.
1.2 NG DNG (APPLICATION):
Khi mt chng trnh c ci t trn my tnh s dng, ta gi
l ng dng, v d nh ng dng NotePad, ng dng Microsoft Word,....
Trong mi trng windows, mi ng dng c th c thi hnh nhiu
ln thnh nhiu bn khc nhau. Mi bn ang thc hin ca mt ng
dng gi l th hin (instance) ca ng dng .
1.3 TIN TRNH (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, ta c mt tin trnh ca ng dng NotePad.

Tiu trnh giao din (user-interface thread): C nhim v x l cc yu


cu ca ngi dng trong qu trnh giao tc vi h.
Tiu trnh x l ni (worker thread): C nhim v thc hin cc x l
tnh ton bn trong, khng trc tip nhn yu cu ca ngi dng.
2 Thc ra, c th xem tiu trnh giao din nh l mt tiu trnh x l ni
nhng c tnh nng giao tc vi ngi s dng.
1.5 THNG IP (MESSAGE):
Thng ip (message) l gi tr phn nh mt ni dung giao tip hay
yu cu x l gia h thng (windows) v ng dng, gia cc ng dng
vi nhau hoc gia cc thnh phn trong cng mt ng dng.
1.5.1 Ngun gc message:
C windows v ng dng u c th pht sinh message.
Windows pht sinh message khi cn thng tin cho ng dng cc
hot ng nhp-xut (hot ng g phm, di chuyn hay click chut,
. ca ngi dng), cc thay i ca h thng (font ch, ch phn
gii mn hnh, mu sc,...) hoc nhng bin i khc lin quan n
ng dng.
ng dng pht sinh message khi x l iu khin cc thnh phn
bn trong ng dng phi hp thc hin chc nng giao tip vi ngi
dng, hoc khi ng dng thc hin giao tip vi windows hay vi cc
ng dng khc ang thc hin trong cng h thng.
1.5.2 Cc loi message:
Message c nh ngha bi h thng: L cc message do h iu
hnh windows to ra nhm phc v hot ng iu khin ton b h
thng, x l thng tin vo-ra hoc cc thng tin khc cho ng dng.
Khi c nhu cu, ng dng c th s dng nhng message ny
pht ng mt chc nng iu khin no ca windows.
Message c nh ngha bi ngi dng: L cc message do ngi
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
cc ng dng khc ang thc hin trong cng h thng.

1.4 TIU TRNH (THREAD):


Tiu trnh l mt nhnh x l c lp trong tin trnh. Khi mt ng
dng c thc hin ta c thm mt tin trnh. Do bn cht chng trnh
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
nhnh x l: mt nhnh x l chnh (primary thread), cc nhnh x l ph
(other threads). Cc nhnh x l ny gi l cc tiu trnh. C hai loi tiu
trnh:
Mot so khai niem lap trnh trong moi trng Windows

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

1.5.3 S hiu message (Message Indentifier - 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
nguyn khng m c t, gi tr ny gi l s hiu message.
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
dng WM_xxx. Cc messges do ngi dng nh ngha cng phi ng
k s hiu. S hiu ng k khng c trng lp v c gi tr nh nht
bng WM_USER (mt hng s do windows nh ngha).
S hiu message l c s phn bit cc message ln nhau.
1.5.4 c t message:
i tng nhn message c thm thng tin v hon cnh pht
sinh v ngha c th ca message, windows cho php message c
nhn thng qua mt cu trc cha s hiu message v cc thng s
km theo. Cu trc ny c khai bo thnh kiu MSG vi ni dung nh
sau:
typedef struct tagMSG {
HWND
hwnd;
UINT
message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT
pt;
} MSG;

// Gi tr c kch thc 4 bytes (long)


// S hiu ca message
// Gi tr khng m c kch thc 2 bytes
// Gi tr khng m c kch thc 4 bytes
// Thi im sinh ra messsge
// Ta cursor khi message c gi.

Trng hwnd (window handle) ca cu trc cha th (handle) qun l


ca s giao din lin quan n message. wParam v lParam l hai tham
s gi km theo message lm nhim v cha thng tin b sung. Hai
tham s ny c dng khi message c nhiu ngha thc t khc nhau.
) 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
trong windows.
1.6 CA S GIAO DIN (WINDOW) CA NG DNG:
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
thay i theo vi chiu hng sinh ng hn v hnh thc v phong ph
hn v chc nng. iu khng ch gp phn tng tnh thm m m
Mot so khai niem lap trnh trong moi trng Windows

cn to s gn gi hn gia giao din ca ng dng trong windows vi


ngi dng.
Dng thng thng ca mt ca s giao din trong windows:

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


menu h thng vi cc mc di chuyn, thay i kch thc hoc ng
ca s.
Caption bar: Thanh tiu ca ng dng.
Menu bar: H thng menu vi cc mc la chn x l.
Minimize / Maximize Box : Nt iu khin thu nh / phng to ca s.
Restore Box : Nt khi phc kch thc trc ca ca s.
Border: ng vin bao quanh ca s.
Client area: Vng lm vic ca ca s, dng hin th thng tin.
Scroll bar: Thanh cun ni dung vng lm vic ca ca s.
Window Procedure: Ngoi giao din ha, ca s ca windows c
kh nng tip nhn v x l message. Kh nng ny c thc hin
thng qua hm x l message m ta gn cho ca s. Hm x l
ny c khai bo nh sau:
LRESULT CALLBACK WindowProc (
HWND hwnd,
// Tham s cha Handle ca ca s lin
quan
UINT uMsg,
// Tham s cha s hiu message
WPARAM wParam,
// Tham s b sung th nht kiu WORD
LPARAM lParam
// Tham s b sung th hai kiu LONG
) ; Hm tr v mt gi tr c kch thc l 32 bits.
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) chn x l ph hp. Theo nguyn tc, nu message c
x l hon tt th hm tr v gi tr 0, ngc li (message khng thuc
4

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

kh nng x l ca ca s) hm phi chuyn message cho windows


x l thng qua li gi hm x l message mc nhin ca windows.
Hm x l ny c tn gi l DefWindowProc vi khai bo nh sau:
LRESULT DefWindowProc( // Default Window Procedure
HWND
hWnd,
// Vi cc tham s c ngha nh trn
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.7 MESSAGE QUEUE:
Message queue l danh sch th t cc message do windows to ra
v c dng cha cc message ang ch c x l. Message
queue hot ng theo nguyn tc FIFO (First-In, First-Out: vo trc, ra
trc). C hai loi message queue trong windows:
Message queue ca h thng (system queue): c windows dng
ring cho vic lu tr cc messge c t thng tin nhp-xut lin quan
n thit b phn cng trong qu trnh h thng giao tc vi ngi
dng.
Message queue ca ng dng (application queue): c windows to
ra v cp cho cc th hin ca ng dng. Windows t ng iu phi
cc message t system queue sang application queue mt cch ph
hp, nh mi ng dng c th tip nhn v thc hin cc yu cu
x l ca ngi dng thng qua h thng. C ch ny ngn cc ng
dng trong windows quyn truy cp trc tip cc thit b phn cng
ca my tnh.
2 Vic truy cp message queue ca ng dng c thc hin vi s h
tr ca cc hm lin quan do windows cung cp nh sau:
Ch v ly mt message t message queue ca ng dng:
BOOL GetMessage (
LPMSG lpMsg,
// Con tr n bin MSG nhn thng tin
// Handle ca ca s lin quan
HWND hWnd,
wMsgFilterMin, // S hiu message nh nht nhn c
UINT
UINT
wMsgFilterMax // S hiu message ln nht nhn c
);
Hm t ng ch n khi pht hin c message cn x l trong
message queue. Khi , message vo trc nht s c ly ra khi
hng ch v thng tin ca n c in vo bin kiu MSG ch bi
Mot so khai niem lap trnh trong moi trng Windows

con tr tham s plMSG. Khi ly c mt message, hm kt thc


v tr v mt gi tr nguyn. Nu message nhn c l message kt
thc ng dng (s hiu WM_QUIT) th hm tr v gi tr 0. Ngc li,
hm tr v gi tr khc 0.
Kim tra v ly mt message trong message queue ca ng dng:
BOOL PeekMessage(
// . Nh GetMessage
LPMSG lpMsg;
HWND hWnd;
wMsgFilterMin;
UINT
wMsgFilterMax;
UINT
UINT
wRemoveMsg; // C thc hin xa message khng ?
// PM_NOREMOVE: khng xa
);
Hm tr v gi tr 0 nu message queue rng. Ngc li, hm tr v
mt gi tr khc khng v thng tin v message c in vo bin
kiu MSG c ch bi tham s kiu con tr lpMSG.
Din dch message ca bn phm sang m phm ASCII:
BOOL TranslateMessage(
// con tr n bin cha message
CONST MSG *lpMsg;
);
Tham s lpMsg l con tr ch n bin kiu MSG cha ni dung c
t message c ly t message queue v cn din dch.
Hm tr v gi tr khc 0 nu message nhn c tng ng vi mt
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
vic din dch sang m phm ASCII l thnh cng. Khi hm t ng
to message WM_CHAR cho phm din dch c. Trong cc trng
hp khc, hm tr v gi tr 0.

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

Kin trc x l chung ca ng dng trong mi trng windows

iu phi message n ca s giao din chnh:


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
th iu phi message ly t message queue ca ng dng n cho
ca s chnh x l. Vic iu phi c thc hin thng qua hm sau:
LRESULT DispatchMessage(
// Con tr n bin cha message
CONST MSG *lpmsg;
);
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
gi tr kt thc ca hm ny lm gi tr tr v ca chnh n.
) Qu trnh tip nhn v iu phi x l message t message queue
ca ng dng c tin hnh lin tc cho n khi nhn c message
kt thc ng dng (WM_QUIT). Qu trnh ny c tn gi l vng lp
nhn v iu phi message (MessageLoop). on chng trnh nhn
v iu phi message trong ng dng c ci t nh sau:
MSG msg;
// bin cha ni dung c t message nhn c
while( GetMessage( &msg, NULL, 0, 0 ) != 0 ) {
// Nu message nhn c khng phi l WM_QUIT
TranslateMessage(&msg); // Din dch nu l phm
DispatchMessage(&msg); // iu phi cho ca s chnh.
}
1.8 KIN TRC X L CA NG DNG TRONG WINDOWS:
Khi ng dng c thc hin, windows to thm mt tin trnh cho th
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, ng thi khi to cc giao din v tiu trnh h tr (nu cn).
2 Cc cch x l ca tiu trnh chnh khi nm quyn iu khin ng
dng:
Khng thc hin x l no c: ng dng kt thc.
Thc hin MessageLoop nhng khng to ca s giao din chnh:
ng dng ch nhn message nhng ngi dng khng giao tc c.
Khi to mt ca s vi hm x l message WindowProc v chn ca
s ny lm ca s giao din chnh: Hm WindowProc ca ca s s
tip nhn v x l message c iu phi t MessageLoop ca tiu
trnh chnh. Ngi dng c th giao tc v kt thc ng dng c.
Nh mc th ba, ng thi to ra cc tiu trnh phc v: ng dng c
kh nng tip nhn v thc hin ng thi nhiu yu cu x l.

1.9 RESOURCE CA NG DNG:


i vi mt chng trnh trong windows, ngoi phn m lnh ca cc
hm x l, resource l mt thnh phn khng km phn quan trng cha
cc ni dung h tr cho vic trang tr hoc phc v cho mt mc ch c
bit ca ng dng. Cc ni dung ph bin trong resource nh sau:
Cursor: nh nh c t v tr lm vic ca thit b lin quan nh
mouse, pen, trackball. Khi ngi dng tc ng ln nhng thit b ny
th windows s dng cursor phn nh hin tng .
Bitmap: Tp nh im (pixels) ca mt nh. Cc nh im ny b tr
theo cc dng v phi hp lm nn hnh nh ca i tng.
Dialog: Thng tin m t khung giao din vi cc i tng nhp liu
bn trong, l c s to ra cc hp hi thoi trong ng dng.
Icon : nh nh c dng c t chc nng ca mt i tng,
ng dng hay mt ni dung d liu.
HTML (Hypertext Markup Language): Ngn ng dng to ra nhng ti
liu dng vn bn vi nhng k php v k thut nh dng m trnh
duyt tng ng c th th hin mt cch xc tch.

Mot so khai niem lap trnh trong moi trng Windows

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

Menu : Mt danh sch cc la chn x l m ngi dng c th chn


nhm thc hin mt x l xc nh
String Table: Bng cha cc chui c nh du phn bit bi cc
s hiu v c s dng nh cc thng bo trong chng trnh. Vic
s dng String Table gip ng dng d dng thay i ngn ng giao
din ca n m khng cn phi c s chnh sa trn phn m lnh.
ToolbarBitmap: Tp cc nh con xc nh cc nt c ci t trn
thanh cng c ca ca s hay hp hi thoi trong ng dng. Mi nt
ny l mt mc chn (c th thay th mc chn ca menu) gip to ra
cc message lnh (WM_COMMAND) vi s hiu phn bit c th
n nh x l cn thit.
Version: Phn khai bo cc thng tin lin quan n ng dng, tc gi.
Font: Cha thng tin v b font ch c lu trong tp tin fnt.
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 ng dng, ng thi phi t ci t x l thch hp cho
cc resource ny trong chng trnh.

Mot so khai niem lap trnh trong moi trng Windows

CHNG 2:

Th vin MFC ca microsoft


& ng dng c bn trong windows
2.1 TH VIN MFC (MICROSOFT FOUNDATION CLASS):
Th vin MFC ca Microsoft bao gm cc lp c bn, ci t bng
ngn ng C++, h tr vic lp trnh trong mi trng windows. T cc lp
ny, MFC xc lp nn tng hnh thnh ng dng ca windows, bao gm
vic nh ngha b khung ng dng, cc cng c chun v ph bin
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
dng kt qu mong mun.
Lp trnh windows vi MFC v MicroSoft Visual C++ 6.0 (VC) t
c hiu qu cao bi khng ch khai thc c phin bn mi nht ca
MFC m cn nhn c nhiu tin nghi lp trnh m VC cung cp. y l
con ng ngn v n gin, c bit vi ngi t hc, vit ng dng
windows.
2.2 TIP CN MFC:
MFC l th vin khng l vi khong 200 lp i tng m vic hiu
r v vn dng chng trong mt khong thi gian ngn l khng th
c. Mc tiu ca chng ta l hiu v vn dng nhng thnh phn ph
bin nht ca th vin xy dng ng dng thng thng. Khi c
kh nng nht nh v s dng MFC th vi ti liu MSDN, s chng kh
khn g trong vic m rng khai thc th vin ng dng tr nn mnh
m v tinh t hn.
Trong nhng phn trnh by sau, chng ta s ln lt tip nhn h
thng ni dung hi nng tnh l thuyt m bo cu trc kin thc, v
phn thc hnh phi hp s gip chng ta kim nghim v hiu r vn
.
2.3 TO NG DNG WINDOWS VI MFC NH TH NO ?:
Theo m hnh kin trc ng dng windows mc (1.8), vic gii quyt
vn trn chnh l vic thc hin tr li cc cu hi sau y:
Lm th no to i tng tiu trnh chnh ca ng dng ?
Lm th no to i tng giao din ca ng dng ?
Qun l tng tc gia i tng ng dng v i tng giao din ?
Bng vic xem xt cc lp MFC lin quan s gip ln lt l gii cc
cu hi c t ra. Tip theo, chng ta tm hiu xem nhng lp no
ca MFC gip khai bo i tng tiu trnh trong ng dng.
10

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

2.4 LP QUN L TIU TRNH CWinThread:


CWinThread l mt lp ca MFC, lp i tng qun l tiu trnh c
to ra trong tin trnh ca mt ng dng ang c thc hin. Tiu trnh
c qun l c th l l tiu trnh giao din hoc tiu trnh x l ni. Cc
dch v c bn phc v cho qun l tiu trnh do CWinThread cung cp
thng qua cc thuc tnh v hnh vi ca n.
DWORD m_nThreadID : Thuc tnh lu s hiu ca tiu trnh.
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, tiu trnh lin quan s kt thc. Nu tiu trnh thuc loi tiu
trnh x l ni th gi tr ny k tha t tiu trnh giao din cp cao
hn.
CWinThread( ); Hnh vi to lp (constructor) i tng tiu trnh.
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.
virtual int ExitInstance( ); Hnh vi kt thc ca i tng tiu trnh.
Thng qua hnh vi ny, i tng qun l tiu trnh thc hin hon
tr cc ti nguyn ca h thng m n ng k s dng.
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
TranslateMessage v hm iu phi message DispatchMessage.
virtual BOOL PreTranslateMessage(MSG *pMsg); Hnh vi cho
php can thip trc trn cc message nhn c t message
queue ca ng dng. Thng qua , tiu trnh giao din c th thc
hin cc tin x l message c trng nhm p ng yu cu t
ra cho ng dng.
) Khi CWinThread c dng qun l i tng tiu trnh chnh th

hm WinMain (ci sn bn trong lp bi th vin MFC) t ng thc


hin cc hnh vi InitInstance(), Run() v ExitInstance() theo th t.

Th vien MFC cua Microsoft & ng dung c ban trong windows

11

2.5 LP QUN L TIU TRNH GIAO DIN CHNH CWinApp:


CWinApp, k tha t CWinThread, l lp i tng chuyn dng qun
l tiu trnh giao din chnh ca ng dng. ng dng windows ch c
php s dng mt i tng thuc lp ny. Ngoi cc thuc tnh, hnh vi
k tha public t CWinThread, CWinApp c cc thuc tnh v hnh vi b
sung sau:
const char* m_pszAppName: Lu chui tn ca ng dng.
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
ng khc nhau th vic s dng tham s dng lnh l mt c ch
xc lp cc giao c gia ng dng v ngi dng chn ch
s dng ng dng thch hp.
int m_nCmdShow: Lu gi tr thng s c dng kch hot
ca s giao din chnh ca ng dng.
CWinApp( ); To lp i tng tiu trnh chnh.
HCURSOR LoadCursor( int nID ); Np cursor t resource ca ng
dng vo b nh (nu cursor cha c np). nID l s hiu ca
cursor. Hm tr v gi tr handle qun l cursor. Gi tr ny c kiu
HCURSOR (handle of cursor) m windows dng qun l cursor.
HICON LoadIcon ( int nID ); Np icon t resource ca ng dng
vo b nh. nID l s hiu ca icon. Hm tr v gi tr handle qun
l icon. Gi tr ny c kiu HICON (handle of icon).
Hnh vi hin th hp thng bo v ch nhn kin ngi dng:
virtual int DoMessageBox (
LPCTSTR lpszPrompt, // Ni dung thng bo
// Dng hp thng bo
UINT nType,
// S hiu mc gip (WinHelp)
UINT hlpIndex = 0
);
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.
int AfxMessageBox (
LPCTSTR lpszPrompt, UINT nType, UINT hlpIndex = 0
);
nType: n nh dng hp thng bo. Gi tr ny l s kt hp gia
thng s qui nh biu tng hin th v cc nt chn b tr trong
hp.
Cc thng s qui nh cc nt chn b tr trong hp thng bo:
Gi tr thng s
Nt chn b tr trong hp
12

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

MB_OK
MB_OKCANCEL
MB_YESNO
MB_YESNOCANCEL
MB_ABORTRETRYIGNORE
MB_RETRYCANCEL

OK
OK - Cancel
Yes - No
Yes - No - Cancel
Abort - Retry - Ignore
Retry - Cancel

Cc thng s qui nh biu tng dng trong nt chn:


Gi tr thng s
Biu tng
MB_ICONHAND, MB_ICONSTOP,
MB_ICONERROR
MB_ICONQUESTION
MB_ICONEXCLAMATION, MB_ICONWARNING
MB_ICONASTERISK, MB_ICONINFORMATION
S hiu cc nt chn c s dng trong hp thng bo:
S hiu
Nt chn
S hiu
Nt chn
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
thc vi gi tr tr v l s hiu ca nt c chn. K tha hnh
vi ny chn v thc hin x l c trng (s dng dng hp
thng bo ring) cho tt c cc li gi AfxMessageBox trong
ng dng.
Hm AfxMessageBox s dng DoMessageBox hin th hp
thng bo v ly gi tr ca hnh vi ny lm kt qu tr v ca
n.
V d: AfxMessageBox( "Chao Ban", MB_ICONSTOP | MB_OK, 0 );
)
Hm trn thc hin hin th hp thng bo vi ni dung l
"Chao Ban" , biu tng

i km, v nt chn OK kt thc.

Th vien MFC cua Microsoft & ng dung c ban trong windows

13

2.6 THC HIN NG DNG N GIN:


Trong phn ny, chng ta thc hin ng dng vi i tng thuc lp
CWinApp qun l tiu trnh chnh. t tn cho d n ca ng dng l
VD0.
Cc bc thc hin d n VD0 nh sau:
Khi ng windows vi h iu hnh Win95 hoc bn mi hn.
To mi mt th mc cha cc d n. V d C:\VC6.
Thc hin ng dng Microsoft Visual C++ 6.0 (VC).
Chn mc File / New t h thng menu ca VC.
Trong hp hi thoi New, chn trang Projects :

- Win32 Application
- Location
- Project Name
Sau chn OK.

VC hin th hp hi thoi New Project Information thng bo


cc thng tin lin quan n d n va to. Chn OK.
) Mt d n c to ra trn a. Vi thng tin nhp nh trn,

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.

Tip tc thc hin cc bc sau hon tt d n theo yu cu.


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.
Vic b sung tp tin stdafx.h vo d n c tin hnh nh sau:
Chn mc File / New t h thng menu ca VC.
Trong hp hi thoi New, chn trang Files:

: Loi ng dng thc hin.


: ng dn th mc ca d n.
: Tn d n.

Tip theo, trong hp hi thoi Step 1 of 1.


: To d n rng.
- An empty project
: Hon tt vic khi to d n.
- Finish

- C/C++ Header File


: Loi ni dung tp tin (.h).
: B sung tp tin vo d n VD0.
- Add To Project
- File Name
: Tn tp tin (StdAfx.h)
Chn OK, tip tc thc hin cc cng vic sau.
Son tho tp tin stdafx.h, nhp cc nh hng bin dch v
cc ch th s dng th vin MFC cn cho d n:

14

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

Th vien MFC cua Microsoft & ng dung c ban trong windows

15

#if !defined( _DU_AN_0_ )


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

resource v i tng lp trnh tng ng ca MFC trong d n.


Thc hin nh sau:
- Right-click trn mc tn resource (VD0 Resource):

#include

#include <afxwin.h>
// th vin chun ca MFC
#endif
Sau khi nhp xong ni dung tp tin stdafx.h, chn mc File /
Save (hoc click biu tung trn thanh cng c) lu tp tin.
To tp tin Resource Script ca d n: Tp tin ny cha khai bo
ca cc resource c s dng trong ng dng. Khi bin dch, cc
resource ny s c nhng vo tp tin chng trnh (.EXE). Cc
bc to tp tin Resource Script trong d n nh sau:
Chn mc File / New. Trong hp hi thoi New, chn trang
Files.

- Chn mc Properties:

Chn cc mc nh trn, g phm Enter kt thc.


Son tho resource: D n VD0 cha cn s dng resource, tp
tin resource script s tm thi b trng. Chn mc File / Save,
v ng mn hnh son tho resource kt thc bc ny.
Chn phin bn bin dch: C hai phin bn bin dch chng
trnh.
: Bin dch chng trnh vi thng tin
Debug version
debug.
Release version
: Phin bn em giao, khng cha thng
tin debug.
Chn mc Build / Set Active Configurations:
- Resource Script
- Add To Project
- File Name
Sau chn OK.
ng k cc h tr ca
ng k ny l c s
16

: Loi ni dung tp tin (.rc).


: B sung tp tin vo d n.
: Tn tp tin, trng vi tn ca d n.
MFC cho thao tc trn resource: Vic
to quan h gia cc ni dung ca

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

Chn phin bn bin dch ( chng hn Win32 Debug ). Chn OK.


Th vien MFC cua Microsoft & ng dung c ban trong windows

17

n nh bin dch vi th vin MFC: Chn mc Project / Setting.

Trong hp hi thoi Project Settings,


- Setting For: : Chn phin bn n nh (v d: Win32 Debug ),
: Cc n nh chung cho d n.
- General
Microsoft Foundation Classes: Cch lin kt th vin MFC vo
ng dng. C th ty chn mt trong hai cch sau:
Use MFC in Shared DLL: Chng trnh s dng th vin
MFC theo c ch lin kt ng. Tp tin chng trnh c kch
thc nh nhng khi thc hin cn c cc tp tin th vin
(DLL) ca MFC trong th mc h thng ca windows.
Use MFC in Static Library: Th vin MFC c nhng vo
chng trnh trong lc bin dch. Tp tin chng trnh c kch
thc ln hn nhng ng dng c th hot ng c lp.
Sau khi n nh xong, chn OK.
Khai bo i tng thuc lp CWinApp: Dng bt k tp tin CPP
no ca d n thc hin cng vic ny. V d n VD0 ang thc
hin y cha c tp tin CPP, chng ta to mi tp tin CPP cho
d n. Gi s tp tin CPP ny c tn l MAIN.CPP. Cch thc hin
nh sau:
Chn mc File / New. Trong hp hi thoi New, chn trang
Files:
18

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

- C++ Source File : Loi ni dung tp tin (.cpp).


- Add To Project : B sung tp tin vo d n.
- File Name
: Tn tp tin (MAIN). Sau chn OK.
Trong mn hnh son tho ca main.cpp, nhp ni dung tp tin:
#include "stdafx.h" // Tp tin cha ng k th vin ca MFC
CWinApp theApp; // i tng qun l tiu trnh chnh
Sau khi nhp xong, chn mc File / Save lu tp tin.
Bin dch chng trnh: Chn mc Build / Build <project name>.exe
hoc chn mc trn thanh cng c.
Ta thc hin xong mt ng dng n gin trong mi trng
windows. Tp tin chng trnh c lu trong th mc DEBUG
(phin bn bin dch debug) hoc RELEASE (phin bn bin dch
release).
Chy chng trnh: C th chy chng trnh trc tip trong VC
bng cch nhn phm F5 hoc click chn trn thanh cng c.
Nhn xt: ng dng VD0 khng thc hin mt giao tc hay cng vic
g c bi n ch l mt ng dng khung - c xy dng hon ton t
lp CWinApp ca MFC m khng c mt x l b sung no.
2.7 THC HIN NG DNG GIAO TC N GIN:
Th vien MFC cua Microsoft & ng dung c ban trong windows

19

Trong phn ny ta thit k mt ng dng m khi thc hin s hin th


v cc nt chn
hp thng bo "Do You want to Stop" vi biu tng
YES- NO. ng dng kt thc khi ngi dng chn mc YES.
Nhn xt: ng dng ch hon thnh cng vic xc nh khi i tng
qun l tiu trnh chnh ca ng dng tin hnh x l thch hp. i tng
ny thuc lp k tha t lp CWinApp vi x l b sung nhm thc hin
cng vic mong mun. Hnh vi InitInstance ca CWinApp l hnh vi
thch hp cho vic k tha v thc hin cc b sung ny.
Gi s d n ca ng dng c tn l VD01. Cc bc thc hin nh
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
bc ny). Tip tc thc hin cc bc sau y.
To mi lp CEmpApp k tha t CWinApp: M mn hnh
Workspace ca d n (nu cha m) bng cch chn mc menu
View/Workspace hoc click chn biu tng trn thanh cng c.
Chn trang ClassView:

Right-click trn mc VD01 Classes, chn New Class.


Khai bo lp CEmpApp thng qua hp hi thoi New Class.

20

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

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


MFC khng h tr lp CWinApp trong ClassWizard ca n.
Name = CEmpApp : Tn ca lp mi.
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 ):

Sau chn OK.


Derived From = CWinApp : Chn CWinApp lm lp c s.
As = public : K tha public. Chn OK kt thc.
Lp CEmpApp c b sung vo d n VD01 cng vi hai
tp tin l VD01.H v VD01.CPP:
: Cha ni dung khai bo (header) ca lp.
VD01.H
VD01.CPP : Cha ni dung ci t (implement) ca lp.
C th m v chnh sa ni dung cc tp tin ca lp bng cch
thao tc trc tip trn cu trc ClassView ca mn hnh
Workspace.
Th vien MFC cua Microsoft & ng dung c ban trong windows

21

Khi to thng tin ClassWizard: Thao tc ny l c s khai thc


tin ch ca ClassWizard trong vic nh ngha lp, khai bo thng
tin k tha, n nh x l message, nh ngha bin,.
Chn menu View / Classwizard:

Chn Yes:
iu chnh lp CEmpApp nhn c h tr ca ClassWizard:
M tp tin VD01.H cha khai bo ca lp, b sung cc ni
dung:
class CEmpApp : public CWinApp {
Phn b sung
public: CEmpApp();
virtual ~CEmpApp();
//{{AFX_VIRTUAL(CEmpApp)
//}}AFX_VIRTUAL
// H tr k tha hnh vi o
//{{AFX_MSG(CEmpApp)
//}}AFX_MSG
// H tr n nh x l

message
}

DECLARE_MESSAGE_MAP() // ng k MessageMap

Lu : //{{ v //}} l k php s dng ca ClassWizard.


M tp tin VD01.CPP cha ci t ca lp, b sung ni
dung:
#include "stdafx.h"
B sung
#include "Emp.h"
BEGIN_MESSAGE_MAP(CEmpApp, CWinApp)
//{{AFX_MSG_MAP(CEmpApp)
// Bng message map,
//}}AFX_MSG_MAP
// s cp n cc
END_MESSAGE_MAP()
// phn sau

22

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

Chn Add All, sau chn OK.


Trong hp hi thoi MFC Class Wizard, Chn OK kt thc.
Thng tin ClassWizard c lu trong tp tin c cng tn vi tn
ca d n v phn m rng l .CLW.
K tha hnh vi InitInstance ca lp CWinApp cho lp CEmpApp.
Dng hnh vi ny ci t x l b sung nh yu cu ca ng dng:
Th vien MFC cua Microsoft & ng dung c ban trong windows

23

Trong mn hnh Workspace ca d n, chn ClassView, rightclick trn tiu ca lp CEmpApp:

// Bin kim tra ng dng?

UINT stop;

do {
stop = AfxMessageBox( "Do You want to stop",
MB_YESNO | MB_ICONQUESTION, 0 );
} while (stop == IDNO );
// Tip tc lp nu chn NO
return TRUE;
// X l tin hnh bnh thng

Dng lp CEmpApp khai bo i tng qun l tiu trnh chnh ca


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

Chn mc Add Virtual Function.

#include "stdafx.h"
#include "Emp.h"
CEmpApp theApp;

// i tng kiu CEmpApp, dng qun l


// tiu trnh chnh ca ng dng.
// Khng chnh sa cc ni dung khc!

Bin dch v chy chng trnh.


2.8 TO MI ICON RESOURCE CHO NG DNG:
i vi ng dng trong windows, icon khng ch l hnh nh trang tr
n thun m cn l yu t gi nh v ng dng tt nht. Windows s
dng icon ca ng dng i din cho ng dng tt c nhng ni no
m ngi dng c th nhn thy v khai thc ng dng.

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


thng qua cc bc sau:
M d n trong VC.
M mn hnh Workspace ca d n, chn trang ResourceView.
right-click trn tiu resource ca d n.

Chn hnh vi InitInstance, sau chn mc Add and Edit.


Trong phn son tho ni dung ca hnh vi InitInstance thuc
lp CEmpApp, ta ci t on chng trnh x l sau:
BOOL CEmpApp::InitInstance()
{
24

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

Th vien MFC cua Microsoft & ng dung c ban trong windows

25

Chn mc Insert...

Thc hin n nh thng s ca icon thng qua hp hi thoi sau:

- ID

Chn mc Icon, sau chn New:


Ta nhn c mn hnh thit k icon. V icon c ni dung ty .

n nh cc thng s
thuc tnh ca icon (s
hiu icon, tn th mc
v tn tp tin cha
icon) trong d n: Chn
ResourceView
trong
Workspace ca d n,
rigth-click trn icon mi
thm.
Chn mc Properties.

26

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

: S hiu icon. IDR_MAINFRAME l s hiu qui c


dng cho icon chnh ca ng dng.
- File name : Tn tp tin cha icon. RES l th mc con s c
to trong th mc d n cha cc tp tin
resource.
Sau khi n nh xong, g phm Enter kt thc.
ng mn hnh thit k icon resource.
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
icon ring.
2.9 LU TR CHNG TRNH NGUN:
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
th mc d n cc tp tin khng cn thit. l cc tp tin sau:
Th mc d n : Cc tp tin .NCB, .PLG, .OPT, .APS.
Th mc Debug : Tt c cc tp tin, tr tp tin .exe cn gia li.
Th mc Release
: Tt c cc tp tin, tr tp tin .exe cn gia
li.
2.10 LP CString CA MFC:
CString l lp i tng ca MFC cho php qun l mt ni dung
chui trong b nh vi nhng c tnh u vit sau:
- Ni dung chui lu tr c di ln vi c ch s dng b nh ti
u.
- Xy dng da trn kiu TCHAR nn thch nghi vi b m
UNICODE.
- Cc hnh vi x l sn sng cho cc tc v chui thng thng.
Mt s hnh vi c s dng ph bin ca CString nh sau:
CString( ); Hnh vi to lp i tng chui.
int GetLength( ) const; Tr v s o chiu di chui.
Th vien MFC cua Microsoft & ng dung c ban trong windows

27

void Empty( ); Xa rng ni dung i tng chui.


BOOL IsEmpty( ) const; Tr v TRUE nu ni dung chui l rng.
TCHAR operator []( int nIndex ) const; Tr v k t v tr nIndex.
void SetAt( int nIndex, TCHAR ch ); t k t ch vo v tr nIndex.
operator LPCTSTR ( ) const; Chuyn v kiu chui ca C.
CString::operator = ; Php ton gn chui cho i tng.
CString::operator + ; Php ton cng chui.
CString::operator += ; Php ton ni chui mi vo i tng.
CString Comparison Operators ; Trong Operators l php ton
quan h thng thng nh: == , < , <= , > , >= , !=.
CString Mid( int nFirst [, int nCount] ) const; Trch chui con gia.
CString Left( int nCount ) const; Trch chui con bn tri.
CString Right( int nCount ) const; Trch chui con bn phi.
) nCount l chiu di (s k t) ca chui con c trch ra.
void MakeUpper( ) / void MakeLower( ); Vit hoa / thng ni
dung.
void Format( LPCTSTR lpszFormat, ... ); To ni dung cho chui.
void TrimLeft( ) / void TrimRight( ); Hy khong trng tri / 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.

THC HNH:
1. Vit ng dng cho php hin th ng dn n tp tin chng trnh v
chui tham s dng lnh thc thi n.
2. Vit ng dng c ci t DoMessageBox sao cho hm
AfxMessageBox s dng trong ng dng hin th hp thng bo vi icon
ring ca ng dng.
HD: S dng hm: int MessageBoxIndirect( LPMSGBOXPARAMS pMsg
);
typedef struct {
UINT
cbSize;
// Kch thc, = sizeof( MSGBOXPARAMS )
HWND
hwndOwner; // Handle ca ca s cha, c th = NULL
HINSTANCE hInstance;
//
Handle
ng
dng
=
AfxGetInstanceHandle()
LPCTSTR
lpszText;
// Ni dung chui thng bo
LPCTSTR
lpszCaption; // Ni dung chui tiu
DWORD
dwStyle;
// Dng hp, cha thng s MB_USERICON
LPCTSTR
lpszIcon;
// Chui tn icon c hin tr trong hp
DWORD_PTR dwContextHelpId;
// S hiu gip
MSGBOXCALLBACK lpfnMsgBoxCallback; // Hm x l
DWORD
dwLanguageId;
// S hiu ngn ng s dng
} MSGBOXPARAMS, *PMSGBOXPARAMS;
28

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

CHNG 3:

Cu trc qun l 1 im:


typedef struct _POINT {
// Ta ( honh , tung ) ca im
int x, y
} POINT ;
Cu trc qun l 1 vng hnh ch nht:
typedef struct _RECT {
int top, left;
// Ta gc tri trn hnh ch nht.
int right, bottom; // Ta gc phi di hnh ch nht.
} RECT ;
Cu trc qun l chiu rng v chiu cao vng hnh ch nht:
typedef struct _SIZE {
// Chiu rng, chiu cao vng hnh ch
int cx, cy;
nht.
} SIZE ;

Cc lp GIAO DIN ha ca MFC


3.1 CC CNG C GIAO DIN HA:
h tr ng dng trong vic trang tr giao din ha (Graphic
Device Interface - GDI) nh mn hnh, my in., windows cung cp mt
h thng cc cng c ha c bn nh sau:
Pen : Cng c v im hoc ng thng.
Brush : Cng c t mu.
Font : Cng c qui nh kiu k t cho ni dung vn bn.
Bitmap : Cng c qun l vng nh im.
Palette : Cng c qun l b mu hin th.
Region : Cng c qun l vng hin th c dng bt k.
Thng qua cc cng c ni trn, ng dng trong windows c th thc
hin cc tc v ha c bn mt cch d dng m khng phi bn tm
n cu trc vt l ca thit b hin th. Cc cng c ny gi l cng c
GDI.
3.2 DEVICE CONTEXT:
Vic khai thc kh nng ca cc cng c GDI c thc hin thng
qua mt cu trc cha thng tin qun l thit b hin th: Device Context
(DC). Ti mi thi im, mi DC c php gn vi mt thit b hin th
ha v s dng mt b cc cng c GDI duy nht. Mun s dng mt
cng c GDI mi th DC phi chm dt s dng cng c tng ng m
n ang dng.
Mi khi mt DC c to mi, h thng t ng chun b mt b cng
c GDI (tr bitmap) mc nhin cho n. ng dng c th ty nghi thay i
cc cng c ny cho ph hp vi nhu cu ca ng dng.
3.3. TA TRN GIAO DIN HA:
Vic nh v trn giao din ha c thc hin da trn h trc ta
c gc (0,0) l gc tri-trn (top-left corner) ca giao din ha,
chiu dng ca trc honh (trc x) hng t tri sang phi, chiu dng
ca trc tung (trc y) hng t trn xung di. Trn mt phng giao
din ha :
im: Biu din bng cp ta (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
tng trong mt phng giao din ha c c t thng qua cc cu
trc sau:
Cac lp giao dien o hoa cua MFC

29

3.4 CC LP MFC H TR GDI:


MCF cung cp mt h thng phong ph cc lp vi y chc nng
nhm h tr ngi dng ti a trong lp trnh GDI. Vi vic vn dng k
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.1 Cc lp i tng im, hnh ch nht:
CPoint : Lp i tng im, tng ng vi cu trc POINT.
CRect : Lp i tng vng hnh ch nht trn giao din ha,
tng ng vi cu trc RECT. CRect c cc hnh vi c trng sau:
CRect( ); To lp i tng vng hnh ch nht rng.
CRect (int left, int top, int right, int bottom); To lp i tng
vng hnh ch nht c thng s xc nh.
int Width( ) const; Tr v rng vng hnh ch nht.
int Heigth( ) const; Tr v cao vng hnh ch nht.
void NormalizeRect( ); Hp l ha cc thnh phn ta ca
rect m khng lm thay i v tr v kch thc ca n.
VD: Gi s khi to mt rect khng hp l nh sau:
CRect rect( 100, 0, 0, 50 ); // rect.left = 100 > rect.right = 0
rect. NormalizeRect();
rect tr nn hp l vi: rect ( 0, 0, 100, 50 );
CSize : Lp i tng kch thc, tng ng vi cu trc SIZE.
3.4.2 Lp CPen:
CPen l lp i tng qun l pen, mt cng c GDI quan trng ca
DC. Thng qua i tng ny, DC c th thay i mu sc, nt v ca
30

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

im hay ng thng m DC s trc hin. CPen c cc hnh vi c


trng sau:
CPen( ); To lp i tng pen rng. Chng ta phi khi to tham
s cho i tng ny trc khi s dng.
CPen (
// To lp i tng pen vi tham s
// Kiu nt v
int nPenStyle,
int nWidth,
// rng nt v (=1: mc nhin)
COLORREF crColor // Mu sc ca nt v
);
nPenStyle c th nhn mt trong cc gi tr sau:
PS_SOLID :
PS_DASH :
PS_DOT :
PS_DASHDOT :
crColor c th nhn gi tr t macro phi mu RGB( ) nh sau:
RGB (int mu_ , int mu_xanh_l_cy , int mu_xanh_dng
)
Mi mu c c trng bng mt gi tr trong on 0255 phn
nh sng ca n. B phi mu theo qui tc phi mu t
nhin.
BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor
); Khi to thng s cho i tng pen. ngha tham s nh trn.
operator HPEN() const; Ton t chuyn kiu, tr v handle ca
pen (HPEN) qun l bi i tng.
3.4.3 Lp CBrush:
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
mt vng hnh ch nht m DC s trc hin. CBrush c cc hnh vi c
trng sau:
CBrush( ); To lp i tng brush rng.
CBrush( COLORREF crColor ); To lp i tng brush c mu t
tng ng vi mu qui nh bi tham s crColor.
CBrush( int nIndex, COLORREF crColor ); To lp i tng brush
c mu t crColor, v nt t nIndex.
Gi tr nt t c th l: HS_VERTICAL (ng k sc ng),
HS_HORIZAONTAL (ng k sc ngang).
BOOL CreateSolidBrush( COLORREF crColor ); To c tnh t
c vi mu crColor cho i tng brush cha c thng s.
operator HBRUSH() const; Ton t chuyn kiu, tr v handle ca
brush (HBRUSH) qun l bi i tng.
3.4.4 Lp CFont:
CFont l lp i tng qun l font, cng c GDI ca DC. Thng qua
i tng ny, DC thc hin n nh font, kiu dng, kch thc ca b k
Cac lp giao dien o hoa cua MFC

31

t c s dng cho vic hin th cc ni dung vn bn. Cc hnh vi c


trng:
CFont( ); To lp i tng font rng.
CFont(const LOGFONT* lpLogFont ); To lp i tng font vi
thng s y . Gi tr thng s c n nh bi tham s kiu
cu trc LOGFONT cha thng tin. LOGFONT c khai bo nh
sau:
typedef struct tagLOGFONT {
LONG lfHeight;
// chiu cao ca k t
LONG lfWidth;
// chiu rng trung bnh cc k t
LONG lfEscapement; // gc (1/10) gia hng in v trc X
LONG lfOrientation;
// gc (1/10) gia k t v trc X (No 9x)
LONG lfWeight;
// mc m ca font ch (0 - 1000)
BYTE lfItalic;
// = TRUE : Ch nghing
BYTE lfUnderline;
// = TRUE : Ch gch di
BYTE lfStrikeOut;
// = TRUE : Ch gch ngang thn
BYTE lfCharSet;
// b k t (=DEFAULT_CHARSET )
BYTE lfOutPrecision; // = OUT_DEFAULT_PRECIS
BYTE lfClipPrecision; // = CLIP_DEFAULT_PRECIS
BYTE lfQuality;
// = DEFAULT_QUALITY
BYTE lfPitchAndFamily; // =DEFAULT_PITCH|FF_DONTCARE
TCHAR lfFaceName[LF_FACESIZE]; // Chui tn ca font
} LOGFONT ;
) Win9x ch dng lfEscapement.
int GetLogFont( LOGFONT * pLogFont ); Ly thng tin ca font
qun l bi i tng font ch. Kt qu c in vo bin kiu
LOGFONT ch bi tham s kiu con tr LOGFONT* : pLogFont.
operator HFONT( ); Ton t chuyn kiu, tr v handle ca font
c qun l bi i tng.
BOOL CreateFontIndirect( LOGFONT *lpLogFont ); Khi to thng
s cho i tng font t thng tin lu trong cu trc ch bi
lpLogFont.
3.4.5 Lp CBitmap:
CBitmap l lp i tng qun l bitmap, mt cng c GDI quan trng
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
dung nh c sn c lu trong tp tin, ng thi thc hin cc tc v x
l nh c bn trn ni dung . CBitmap cung cp cc hnh vi c trng
sau:
CBitmap( ); To lp i tng bitmap rng.
32

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

BOOL LoadBitmap( UINT nIDResource ); To ni dung cho i


tng bitmap vi thng tin c ly t mt nh trong resource.
nIDResource : s hiu ca nh bitmap trong resource ca chng
trnh.
BOOL CreateCompatibleBitmap (
CDC* pDC, // Con tr i tng DC tng ng
int nWidth,
// Chiu rng,
int nHeight
// chiu cao tnh bng pixel ca bitmap c to.
); To ni dung cho i tng bitmap vi thng tin v mu sc,
phn gii tng ng vi DC ch bi con tr tham s pDC.
int GetBitmap( BITMAP* pBitMap ); Ly thng tin v bitmap c
qun l bi i tng. Kt qu nhn c s c in vo bin c
kiu BITMAP ch bi tham s kiu con tr BITMAP* : pBitmap.
Cu trc BITMAP bao gm cc trng c ngha nh sau:
typedef struct tagBITMAP { /* bm */
int bmType ;
// Kiu bitmap,
int bmWidth ;
// Chiu rng bitmap tnh bng pixel
int bmHeight ;
// Chiu cao bitmap tnh bng pixel
int bmWidthBytes ;
// Kch thc 1 dng pixel trong bitmap
BYTE bmPlanes ;
// S mu.
BYTE bmBitsPixel ;
// S bit mu ca 1 pixel
LPVOID bmBits ;
// a ch vng nh cha pixel ca
bitmap
} BITMAP;
operator HBITMAP() const; Ton t chuyn kiu, tr v handle ca
bitmap c qun l bi i tng.
3.4.6 Lp CPalette:
CPalette l lp i tng qun l palette, mt cng c GDI ca DC.
Thng qua i tng ny, DC c th to ra cc hiu ng mu trn giao
din ha bng cch thay i cc b mu mt cch ph hp.
CPalette( ); To lp i tng palette rng.
CreatePalette( LPLOGPALETTE lpLogPalette ); Khi to thng s
cho i tng palette rng. Con tr tham s lpLogPalette ch n
bin kiu cu trc LOGPALETTE cha thng tin b mu dng khi
to.
typedef struct tagLOGPALETTE {
// S hiu palette h thng
WORD palVersion;
// S mu s dng
WORD palNumEntries;
PALETTEENTRY palPalEntry[1]; // Cha cc gi tr mu,
// c s phn t mng bng palNumEntries
} LOGPALETTE ;
Cac lp giao dien o hoa cua MFC

33

) Mi phn t ca palPalEntry c kiu PALETTEENTRY phn nh


gi tr mu dng hin th mu ch mc (color index) tng ng vi v
tr th t ca n. Cu trc PALETTEENTRY c ni dung nh sau:
typedef struct tagPALETTEENTRY {
BYTE peRed ;
// Gi tr thnh phn mu
BYTE peGreen ;
// Gi tr thnh phn mu xanh l cy
BYTE peBlue ;
// Gi tr thnh phn mu xanh dng
BYTE peFlags ;
// Vai tr mu trong h thng.
} PALETTEENTRY;
operator HPALETTE( ) const; Ton t chuyn kiu, tr v handle
ca palette qun l bi i tng.
3.4.7 Lp CRgn:
CRgn l lp i tng qun l region, mt cng c GDI quan trng
gip DC n nh vng nh x l c hnh dng ty trn giao din ha
ca n.
CRgn( ); To lp i tng vng nh rng.
BOOL CreateRectRgn( int x1, int y1, int x2, int y2 ); Khi to thng
s cho i tng vng nh bng 1 hnh ch nht vi ta gc tri
trn v gc phi di ln lt l (x1, y1) v (x2, y2).
BOOL CreateEllipticRgn( int x1, int y1, int x2, int y2 ); Khi to
thng s cho i tng vng nh bi hnh ellipse ni tip hnh ch
nht c gc tri trn (x1, y1) v gc phi di (x2, y2).
BOOL CreatePolygonRgn (
LPPOINT lpPoints, // Mng cha ta cc im ziczac
int nCount,
// S phn t POINT trong mng trn
int nMode
// = 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.
int CombineRgn (
CRgn* pRgn1, // Con tr i tng qun l vng nh th nht
CRgn* pRgn2, // Con tr i tng qun l vng nh th hai
int nCombineMode
// Cch kt hp hai vng nh
); To thng s cho i tng vng nh trn c s kt hp hai vng
nh c. Tham s nCombineMode c th l:
RGN_AND : Vng nh kt qu l vng giao nhau gia hai vng
nh.
RGN_OR : Vng nh kt qu l vng hp gia hai vng nh.
RGN_DIFF : Vng nh kt qu l vng b gia hai vng nh.
34

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

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


vng nh qun l bi i tng.
3.5 LP CDC:
CDC l lp i tng qun l DC. Thng qua i tng DC, kh nng
ca cc cng c ha c khai thc cho vic trang tr giao din
ha qun l bi DC. CDC c cc hnh vi c trng nh sau:
CDC( ); To lp i tng DC rng.
virtual BOOL CreateCompatibleDC( CDC* pDC ); Khi to thng
s cho i tng DC mt cch tng thch vi mt DC c sn c
ch bi con tr tham s pDC.
virtual BOOL DeleteDC( ); Hy b i tng DC.
CPen* SelectObject( CPen* pPen ); Chn cng c v mi cho DC.
pPen : con tr n i tng pen s c dng cho DC.
Hm tr v con tr ch n i tng pen m DC ang s dng.
) C th s dng hnh vi ny cho cc cng c trang tr khc ca
DC. Kt qu tr v l con tr n i tng ang dng tng ng.
CPent* GetCurrentPen( ); Tr v gi tr con tr ca i tng pen
ang c s dng bi DC.
) Mt cch tng t cho cc cng c trang tr khc.
virtual COLORREF SetBkColor( COLORREF crColor ); t mu
nn cho DC. crColor l gi tr mu t.
COLORREF GetBkColor( ); Tr v gi tr mu nn ca DC.
virtual COLORREF SetTextColor( COLORREF crColor ); n nh
mu c s dng hin th cc ni dung vn bn trn DC.
COLORREF GetTextColor( ); Tr v gi tr mu hin dng hin
th cc ni dung vn bn trn DC.
int SetBkMode ( int nBkMode ); n nh ch hin th nn k t
biu din ni dung vn bn. nbkMode cha thng s n nh:
TRANSPARENT : Nn ch hin th trong sut.
OPAQUE
: Ch hin th c mu nn.
int GetBkMode( ); Ly ch hin th ch ca DC.
virtual BOOL TextOut (
// Ta bt u hin th
int x, y ,
// Ni dung chui hin th.
LPCTSTR lpszString,
// Chiu di chui.
int nCount
); Hin th ni dung chui vn bn ln giao din ha ca DC.
virtual int DrawText (
LPCTSTR lpszString, // Ni dung chui hin th
// Chiu di chui
int nCount,
// Con tr n bin kiu RECT
LPRECT lpRect,
Cac lp giao dien o hoa cua MFC

35

36

UINT nFormat
// Cha thng tin canh chnh chui hin
th.
); In ni dung chui ln giao din ha ca DC vi cc canh
chnh.
lpRect : Ch n bin kiu RECT cha thng tin gii hn vng hin
th.
nFormat : Cho php kt hp mt cch hp l cc canh chnh trong
vng hnh ch nht gii hn. Cc thng s canh chnh c th l:
DT_CENTER
: Chnh gia theo chiu ngang
DT_VCENTER : Chnh gia theo chiu dc
DT_RIGHT
: Chnh phi.
CPoint MoveTo( int x, int y ); n nh im v hin hnh.
BOOL LineTo( int x, int y ); V ng thng t im v hin hnh
n im c ta (x, y).
void FillRect (
LPCRECT lpRect, // Con tr ch n bin kiu RECT.
CBrush* pBrush // Con tr n i tng brush dng t mu.
); T mu vng hnh ch nht c xc nh bi cc gi tr cha
trong bin kiu RECT do tham s lpRect ch n.
void Draw3dRect (
// V hnh ch nht 3 chiu
// Con tr n bin RECT
LPCRECT lpRect,
COLORREF clrTopLeft,
// Mu v cnh tri v cnh trn.
COLORREF clrBottomRight // Mu v cnh phi v cnh di
);
BOOL DrawEdge (
// Con tr n bin kiu RECT.
LPRECT lpRect,
// Cch v trn cc g (trong, ngoi) cnh.
UINT nEdge,
// Cc cnh c v.
UINT nFlags
); V khung ch nht vi hiu ng 3 chiu.
nEdge c th kt hp cc gi tr sau:
BDR_RAISEDINNER : V ni g trong
BDR_SUNKENINNER : V chm g trong
BDR_RAISEDOUTER : V ni g ngoi
BDR_SUNKENOUTER
: V chm g ngoi
nFlags c th kt hp cc gi tr sau:
BF_RECT
: V tt c cc cnh
BF_TOPLEFT
: V cnh tri v cnh trn
BF_BOTTOMRIGHT
: V cnh phi v cnh di
BOOL DrawState (
CPoint pt,
// im t gc tri trn ca nh trn DC
CSize size,
// Kch thc vng hin th nh
CBitmap* pBitmap, // Con tr i tng bitmap c v
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

UINT nFlags,
CBrush* pBrush

// = DST_BITMAP (v bitmap)
// Con tr i tng Brush, s dng khi v
// Bitmap n: nFlags |= DSS_DISABLED
); V bitmap hoc icon ln DC.
BOOL BitBlt (
// Ta gc tri trn v
int x, int y,
int nWidth, int nHeight,
// kch thc vng nhn nh.
CDC* pSrcDC,
// Con tr i tng qun l DC ngun.
// Gc tri trn phn nh ngun c
int xSrc, int ySrc,
chp.
// Cch chp pixel t nh ngun.
DWORD dwRop
); 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) trong DC qun l bi i tng.
Gi tr pixel c 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 : Gi tr pixel ly trc tip t pixel ca nh ngun.
SRCPAINT : L kt qu OR ca pixel nh ngun v nh nhn.
SRCAND
: L kt qu AND ca pixel nh ngun v nh
nhn.
BOOL MaskBlt (
int x, int y,
// Ta gc tri trn v
int nWidth, int nHeight, // Kch thc vng nhn nh
CDC* pSrcDC,
// Con tr i tng qun l DC ngun
int xSrc, int ySrc,
// Gc tri trn phn nh c chp
CBitmap& maskBitmap, // Con tr i tng bitmap mt n
// Gc tri trn vng nh lm mt n
int xMask, int yMask,
// Cch chp pixel t nh ngun.
DWORD dwRop
); 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
ngun sang DC qun l bi i tng, cc v tr khc c chuyn
bnh thng.
BOOL StretchBlt (
// Ta gc tri trn v
int x, int y,
// Kch thc vng nhn nh.
int nWidth, int nHeight,
CDC* pSrcDC,
// Con tr i tng DC ngun.
int xSrc, int ySrc,
// Ta gc tri trn v
int nSrcWidth, int nSrcHeight, // Kch thc phn nh c
chp.
Cac lp giao dien o hoa cua MFC

37

DWORD dwRop
// Cch chp pixel t nh ngun.
); 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
nh ngun.
BOOL DrawIcon (
// Ta gc tri trn ni t icon trn DC
int x, int y,
HICON hIcon
// Handle ca icon
); V icon hIcon ln v tr (x, y) ca DC qun l bi i tng.
3.6 LP CImagelist:
CImageList l lp i tng imagelist. Mi imagelist cho php qun l
danh sch nh c cng kch thc v h tr nhiu tin ch trn chng.
CImageList( ); To lp i tng imagelist rng.
BOOL Create (
UINT nBitmapID, // S hiu ca resource bitmap cha cc
nh
// rng mi nh trong bitmap ni trn
int cx,
int nGrow,
// S nh trong bitmap
COLORREF crMask // Mu mt n (khng hin th)
); Khi to ni dung cho i tng t mt bitmap trong resource.
int GetImageCount( ); S nh ca imagelist qun l bi i tng.
int Add (
CBitmap* pbmImage, // Con tr i tng bitmap ca nh
mi.
// i tng bitmap mt n hoc
CBitmap* pbmMask |
[ COLORREF crMask ] // mu mt n ca nh mi.
); Thm mt nh (bitmap) vo imagelist.
BOOL BeginDrag( int nImage, CPoint ptHotSpot ); Chun b
chuyn nh th nImage trong imagelist vi v tr bt u ptHotSpot.
static BOOL DragEnter( CWnd* pWndLock, CPoint point ); Cm
ca s pWndLock, ni m imagelist ang thc hin chuyn nh.
static BOOL DragMove(CPoint pt); Chuyn nh nImage n v tr
pt.
static BOOL DragLeave( CWnd* pWndLock ); Chm dt tnh trng
b cm ca ca s pWndLock.
static void EndDrag( ); Chm dt tc v chuyn nh.
static BOOL DragShowNolock( BOOL bShow ); Hin th hoc che
nh trong qu trnh chuyn hnh.
BOOL Draw (
// i tng DC dng v hnh
CDC* pdc,
// S th t hnh c v trong imagelist
int nImage,
POINT pt,
// Ta gc tri trn ni v hnh
38

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

UINT nStyle // Kiu v = ILD_NORMAL


); V hnh nImage ca imagelist qun l bi i tng ln DC.
BOOL DrawIndirect (
CDC* pDC, int nImage,POINT pt, // Tng t Draw
// Kch thc vng nhn nh
SIZE sz,
POINT ptOrigin,
// Gc tri trn phn nh c v
UINT fStyle,
// Kiu nh ( = ILD_NORMAL )
DWORD dwRop ,
// Cch chp pixel ( = SRCCOPY )
COLORREF rgbBack , // Mu vng b lc = CLR_DEFAULT
COLORREF rgbFore // Mu phi hp cho fStyle c thng s
// ILD_BLEND25 hoc ILD_BLEND50 ( = CLR_DEFAULT)
); V hnh nImage.
) i tng GDI c khi to trong chng trnh bi hnh vi Createxxx
cn c hy b khi chm dt s dng trnh lng ph b nh h
thng:
- Cc i tng cng c GDI, s dng hnh vi: DeleteObject( );
- Cc i tng qun l thit b ha, s dng hnh vi: DeleteDC(
);

Cac lp giao dien o hoa cua MFC

39

CHNG 4:

Ca s giao din v lp CWnd


4.1 CA S GIAO DIN:
Ca s giao din l thnh phn quan trng ca ng dng. N khng
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
message hiu qu v khng th thiu cho c ch iu phi message ca
ng dng windows.
Bn cnh , ca s giao din cn lm chc nng nhn din ng
dng, l th thng hnh cho ng dng trong hnh trnh tn ti, hot ng
c lp cng nh phi hp trao i d liu vi cc ng dng khc trong
windows.
4.2 LP CWnd:
CWnd l lp i tng qun l ca s ca windows. Thng qua cc
thuc tnh v hnh vi ca lp CWnd, MFC cung cp cc dch v cn thit
cho php to lp v khai thc cc tnh nng ca ca s windows mt
cch d dng.
HWND m_hWnd : Thuc tnh lu handle ca ca s.
CWnd( ); Hnh vi to lp i tng ca s.
virtual BOOL Create (
LPCTSTR lpszClassName, // Tn ng k ca lp ca s
// Tn ca s.
LPCTSTR lpszWindowName,
DWORD dwStyle,
// Cc thng s v dng ca s
// Qui nh v tr, kch thc ca s
const RECT& rect,
CWnd* pParentWnd,
// Con tr i tng ca s cha
UINT nID,
// S hiu ca s
CCreateContext* pContex = NULL
); Khi to thng s cho ca s qun l bi i tng.
Tham s dwStyle qui nh c im v kiu dng ca s. Gi tr
dng cho tham s ny c th kt hp mt s trong cc gi tr sau:
WS_POPUP
: Ca s c to l ca s chnh.
WS_CHILD
: Ca s c to l ca s con.
WS_TABSTOP
: Ca s con, chuyn c bng phm tab.
WS_OVERLAPPED : Ca s chnh.
WS_SYSMENU
: Ca s c hp menu h thng.
WS_BORDER
: Ca s c vin.
WS_CAPTION
: Ca s c tiu (caption)
WS_DISABLED
: Ca s b cm.
WS_DLGFRAME
: Ca s c vin m kiu hp thoi,
40

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

WS_HSCROLL
: Ca s c thanh trt ngang bin.
WS_VSCROLL
: Ca s c thanh trt dc bin.
WS_MAXIMIZEBOX : C hp phng to trn caption ca ca
s.
WS_MINIMIZEBOX : C hp thu nh trn caption ca ca s.
WS_THICKFRAME : Vin cho php thay i kch thc ca
s.
WS_VISIBLE
: Ca s nhn thy c (hin th).
V d: WS_POPUP | WS_CAPTION : Ca s chnh c tiu .
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
cch ty . Vic ng k tn lp ca s c th thc hin bng mt
trong hai cch sau:
ng k trc tip:
LPCTSTR AFXAPI AfxRegisterWndClass (
UINT nClassStyle,
// Thng s dng ca ca s
HCURSOR hCursor = 0,
// Cursor hin th trong ca s
HBRUSH hbrBackground = 0, // Brush dng t nn ca s
HICON hIcon = 0
// Icon trn tiu ca ca s
); Tr v chui tn lp ca s c ng k. Cc ln ng k
tn lp ca s c tham s ging nhau s nhn c mt tn duy
nht.
Tham s nClassStyle c th kt hp t cc gi tr sau:
CS_HREDRAW : Ca s c v li khi chiu rng thay i.
CS_VREDRAW : Ca s c v li khi chiu cao thay i.
CS_NOCLOSE : Cm hp ng [] trn tiu ca ca s.
V d: ng k lp ca s c nn mu xanh dng.
CString
myClassName;
CBRUSH
myBrush;
myBrush.CreateSolidBrush( RGB ( 0, 0, 255 ) );
myClassName = AfxRegisterWndClass (
CS_VREDRAW | CS_HREDRAW,
NULL, myBrush, NULL );
ng k qua cu trc cha cc thng s:
BOOL AFXAPI AfxRegisterClass( 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
ca s hai ng dng khc nhau khi hai ng dng ny tnh c
ng k cc tn lp ca s ging nhau v thng s.
Ca so giao dien va lp CWnd

41

lpWndClass l con tr ch n bin c kiu cu trc


WNDCLASS.
typedef struct _WNDCLASS {
UINT style;
WNDPROC lpfnWndProc;

// Dng ca lp ng k
// Con tr hm WindowProc ca
// ca s. C th ly hm do

MFC

// khai bo sn: AfxWndProc


int cbClsExtra;
// Dnh ring ca h thng
int cbWndExtra;
// Dnh ring ca h thng
HINSTANCE hInstance;
// Instance handle ca ng
dng
HICON hIcon;
// Handle ca icon
HCURSOR hCursor;
// Handle ca cursor
HBRUSH hbrBackground; // Handle ca brush v nn
LPCTSTR lpszMenuName; // Chui tn menu trong
resource
LPCTSTR lpszClassName; // Tn lp ca s ng k
} WNDCLASS;
BOOL CreateEx (
// Cc thng s dng m rng
DWORD dwExStyle,
LPCTSTR lpszClassName, // Tn lp
LPCTSTR lpszWindowName,
// Tn ca s
DWORD dwStyle,
// Dng ca s
int x, int y,
// Ta gc tri trn ca ca s
int nWidth, int nHeight,
// Chiu rng v cao ca ca s
HWND hwndParent,
// Handle ca ca s cha
// Handle ca menu gn vi ca s
HMENU nIDorHMenu,
LPVOID lpParam = NULL
); Khi to ca s vi vic s dng cc thng s m rng v dng.
Tham s dwExStyle qui nh dng m rng ca ca s c th kt
hp t cc gi tr sau:
WS_EX_TOPMOST
: Ca s khng b che khut.
WS_EX_TOOLWINDOW : Ca s khng hin th trn taskbar.
WS_EX_TRANSPARENT : Ca s c nn trong sut.
WS_EX_CLIENTEDGE : Ca s c g quanh vng client.
virtual BOOL PreCreateWindow( CREATESTRUCT& cs ); Hnh vi
c thc hin trc khi windows khi to thng s cho ca s.
Tham bin cs kiu CREATESTRUCT cha thng s khi to.
typedef struct tagCREATESTRUCT {
42

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

LPVOID lpCreateParams; // Con tr vng cha thng s ca


s
HANDLE hInstance;
// Handle ca ng dng
HMENU hMenu;
// Handle ca menu gn vi ca s
HWND hwndParent;
// Handle ca ca s cha
int cy; int cx;
// Chiu rng v cao ca ca s
int y; int x;
// Ta gc tri trn ca ca s
LONG style;
// Thng s n nh dng ca s
LPCSTR lpszName;
// Tn ca s c to
LPCSTR lpszClass;
// Tn lp ca s dng cho ca s
DWORD dwExStyle;
// Thng s n nh dng m rng
} CREATESTRUCT;
) Trong cc lp k tha CWnd, hnh vi ny c dng can
thip ci t cc n nh ring trn cu trc thng s cs ca ca
s.
BOOL EnableWindow( BOOL bEnable = TRUE ); Cho php hoc
cm hot ng ca ca s.
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
: Du ca s
SW_MINIMIZE
: Thu nh ca s
SW_RESTORE
: a ca s v trng thi trc
SW_SHOW
: Hin th ca s
SW_SHOWNA
: Hin th nhng khng kch hot ca
s
SW_SHOWMAXIMIZED : Hin th v phng to ca s
SW_SHOWMINIMIZED : Hin th v thu nh ca s
BOOL SetWindowPos (
// Con tr ca s lm mc
const CWnd* pWndInsertAfter,
// Ta gc tri trn ca ca s
int x, int y,
int cx, int cy,
// Kch thc ca s
UINT nFlags
// Thng s trng thi
); n nh v tr ca s trn mn hnh.
Gi tr pWndInsertAfter qui nh v tr t ca s theo chiu th 3
(z-order). Gi tr ny c th nh sau:
wndBottom : Ca s c t di mi ca s.
wndTop
: Ca s c t trn cc ca s thng thng.
wndTopMost : Ca s c t trn mi ca s.
Tham s nFlags qui nh trng thi mi ca ca s:
SWP_SHOWWINDOW : Hin th ca s.
Ca so giao dien va lp CWnd

43

44

SWP_DRAWFRAME
: V li frame ca ca s.
SWP_NOREDRAW
: Khng cp nht li thng tin ca s.
void MoveWindow (
// Ta mi cho gc tri trn
int x, int y,
// Chiu rng v chiu cao ca ca s
int nWidth, int nHeight,
BOOL bRepaint = TRUE // Yu cu windows v li ca s
); Thay i v tr v kch thc ca ca s.
void GetWindowRect( LPRECT lpRect ); Ly thng tin ta , kch
thc ca ca s, lpRect ch n bin kiu RECT cha kt qu.
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.
int SetWindowRgn (
// Handle ca region qun l vng n nh
HRGN hRgn,
// V li ca s (TRUE) hay khng (FALSE)
BOOL bRedraw
); n nh vng hin th ca ca s theo dng ca region.
void GetWindowText( CString rString ); Ly ni dung chui tiu
ca ca s v lu vo bin i tng chui rString.
int GetWindowTextLength( ); Tr v chiu di ca chui tiu .
void ClientToScreen( LPPOINT lpPoint / LPRECT lpRect );
Chuyn ta im hay vng hnh ch nht trong client ca ca
s sang h trc ta ca mn hnh.
void ScreenToClient( LPPOINT lpPoint / LPRECT lpRect );
Chuyn ta im hay vng hnh ch nht trn mn hnh sang
h trc ta ca vng client trong ca s.
HICON GetIcon( BOOL bBigIcon ); Tr v handle ca icon m ca
s ang s dng. Gi tr tham s bBigIcon c ngha nh sau:
TRUE : Handle ca icon hin th trn taskbar (big Icon)
FALSE : Handle ca icon hin th trn caption (small Icon)
HICON SetIcon (
// handle ca icon
HICON hIcon,
BOOL bBigIcon // TRUE (t bigIcon) , FALSE (t smallIcon)
); t icon mi cho ca s.
static CWnd* PASCAL GetFocus( ); Tr v con tr ch n i
tng CWnd ang c php nhn thng tin nhp t bn phm.
CWnd* SetFocus( ); Kch hot ca s. Hm tr v con tr ca i
tng CWnd c kch hot trc .
CFont* GetFont( ); Tr v i tng font ch ca ca s.
void SetFont (
CFont* pFont,
// Con tr n i tng font ch
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

BOOL bRedraw = TRUE // V li ca s sau tc v t font ?


); n nh font ch cho ca s.
CMenu* GetMenu( ); Tr v con tr i tng menu gn vi ca
s.
BOOL SetMenu( CMenu* pMenu ); Gn menu cho ca s.
CWnd* GetParent( ); Tr v con tr n i tng ca s cha.
int GetScrollPos( int nBar ); Tr v v tr hin hnh ca nt cun
trn thanh cun. nBar cha s hiu thanh cun quan tm. nBar c
th l:
SB_HORZ : Thanh cun ngang.
SB_VERT : Thanh cun dc.

int SetScrollPos (
// Thanh cun c chn
int nBar,
// V tr t
int nPos,
BOOL bRedraw = TRUE // V li thanh cun sau tc v t
); t v tr nt cun cho thanh cun tng ng.
UINT SetTimer (
UINT nIDEvent, // S hiu ca timer, phn bit duy nht
UINT nElapse, // Chu k timer (tnh bng mili-second)
NULL
// S dng hnh vi OnTimer x l timer
); 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
theo s hiu ca timer n cho ca s.
BOOL KillTimer( int nIDEvent ); Hy b timer c s hiu nIDEvent.
afx_msg void OnTimer( UINT nIDEvent ); Hnh vi x l WM_TIMER
ca ca s. Tham s nIDEvent cha s hiu ca timer lin quan.
void Invalidate( BOOL bErase = TRUE ); Kch hot c ch v li
vng client ca ca s. Nu bErase = FALSE, windows khng thc
hin xa thng tin trong vng cn v li.
void InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );
Kch hot c ch v li mt vng trong client ca ca s. Thng tin
v v tr v kch thc ca vng cn v li c lu trong bin kiu
RECT ch bi lpRect. Tham s bErase c ngha nh Invalidate.
int MessageBox (
// Ni dung thng bo
LPCTSTR lpszText,
LPCTSTR lpszCaption = NULL // Tiu hp thng bo
// Dng hp thng bo
UINT nType = MB_OK
); Hin th hp thng bo v tr v s hiu ca nt c chn.
LRESULT SendMessage (
// S hiu message
UINT message,
WPARAM wParam = 0, // Tham s kiu WORD
LPARAM lParam = 0
// v kiu LONG km theo message
Ca so giao dien va lp CWnd

45

46

); Gi message v tham s km theo n hm WindowProc ca


ca s qun l bi i tng, v ch n khi hm WindowProc x
l xong.
BOOL PostMessage( UINT message,
WPARAM wParam = 0, LPARAM lParam=0
); t message v cc tham s km theo vo message queue ca
ng dng. Hnh vi kt thc m khng ch message c x l.
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
thay i kch thc ca s hon tt. cx, cy cha kch thc mi ca
ca s.
afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct );
Hnh vi x l WM_CREATE, message do windows gi n ca s
khi tc v khi to thng s cho ca s c thc hin xong.
afx_msg void OnClose( ); Hnh vi x l WM_CLOSE, message do
windows gi n ca s khi tc v ng ca s ang xy ra.
afx_msg void OnDestroy( ); Hnh vi x l WM_DESTROY,
message do windows gi n ca s khi tc v hy b ca s
ang xy ra.
afx_msg void OnKeyDown (
// M phm
UINT nChar,
UINT nRepCnt,
// S ln g phm
UINT nFlags
// Trng thi cc phm km theo
); Hnh vi x l WM_KEYDOWN, message do windows gi n
ca s khi ca s ang c kch hot, ng thi c phm va c
n xung m khng c s s dng phm Alt km theo.
afx_msg void OnKeyUp (
// Cc tham s tng t nh trn
UINT nChar, UINT nRepCnt , UINT nFlags
); Hnh vi x l WM_KEYUP. Mt cch tng t WM_KEYDOWN.
afx_msg void OnChar (
// M ASCII
UINT nChar ,
UINT nRepCnt ,
// S ln g
// Trng thi cc phm km theo
UINT nFlags
); Hnh vi x l WM_CHAR, message do windows gi n ca s
khi mt phm k t c g.
afx_msg void OnLButtonDblClk (
// Cha gi tr phm c nhn km
UINT nFlags,
// V tr double-click chut
CPoint point
); Hnh vi x l WM_LBUTTONDBLCLK, message do windows gi
n ca s khi ngi dng double-click vo nt chut tri.
Tham s nFlag c th l kt hp ca cc gi tr sau:
MK_CONTROL : Phm CTRL c nhn km theo
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

MK_SHIFT
: Phm SHIFT c nhn km theo
afx_msg void OnLButtonDown( UINT nFlags, CPoint point ); Hnh
vi x l WM_LBUTTONDOWN, message do windows gi n ca
s khi ngi dng n nt chut tri. Cc thng tin nh trn.
afx_msg void OnLButtonUp( UINT nFlags, CPoint point ); Hnh vi
x l WM_LBUTTONUP, message do windows gi n ca s khi
ngi dng nh nt chut tri. Cc thng tin nh trn.
Mt cch tng t cho cc hnh vi x l message ca nt chut
phi.
afx_msg void OnMouseMove( UINT nFlags, CPoint point ); Hnh
vi x l WM_MOUSEMOVE, message do windows gi n ca s
khi ngi dng di chuyn chut trong ca s. Cc thng tin nh
trn.
int GetDlgCtrlID( ); Tr v s hiu ca i tng ca s con.
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
trang tr li mt phn hay ton b giao din ca ca s.
Cng vic thng thng ca OnPaint l v li cc ni dung cn duy
tr trn b mt giao din ca ca s. thc hin vic ny,
OnPaint s dng mt i tng CDC v dng n cho cc thao tc
ha cn thit nhm hon thnh yu cu ni trn.
B cc x l thng thng ca hnh vi OnPaint nh sau:
PAINTSTRUCT ps ;
CDC* pDC = BeginPaint(&ps);
.
EndPaint(&ps);

// Bin cha thng tin trang tr


// Ly DC ca giao din ca s
// X l trang tr giao din ha
// Chm dt.

afx_msg void OnHScroll (


// S hiu ghi nhn c im tc ng
UINT nSBCode,
UINT nPos,
// V tr nt cun / nt trt trn mc
CScrollBar* pScrollBar // Con tr i tng qun l mc
); Hnh vi x l WM_HSCROLL, message do windows gi n ca
s khi c mt mc l thanh cun hay thanh trt t ngang
(horizontal scrollbar hoc horizontal sliderCtrl) trong ca s b tc
ng.
nSBCode ghi nhn c im tc ng ln nt cun / trt nh sau:
SB_LEFT
: Gim nt v v tr thp nht
SB_ENDSCROLL
: Chm dt tc v chuyn nt
SB_LINELEFT
: Gim nt mt v tr
SB_LINERIGHT
: Tng nt mt v tr
SB_PAGELEFT
: Gim nt mt on
Ca so giao dien va lp CWnd

47

SB_PAGERIGHT
: Tng nt mt on
SB_RIGHT
: Tng nt n v tr cao nht
SB_THUMBPOSITION : Chuyn nt bng chut
SB_THUMBTRACK : ang chuyn nt bng chut .
nPos c s dng trong cc tc v nh v nt tuyt i ( ).
) 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_msg void OnVScroll (
// S hiu ghi nhn c im tc ng
UINT nSBCode,
// V tr nt cun / nt trt trn mc
UINT nPos,
CScrollBar* pScrollBar // Con tr i tng qun l mc
); Hnh vi x l WM_VSCROLL, message do windows gi n ca
s khi c mt mc l thanh cun hay thanh trt t thng ng
(vertical scrollbar hoc vertical sliderCtrl) trong ca s b tc ng.
) X l ca hnh vi ny c ci t tng t hnh vi OnHScroll.
afx_msg BOOL OnSetCursor (
CWnd* pWnd, // Con tr n i tng ca s cha cursor
UINT nHitTest, // Thng tin v v tr cursor
UINT message // Cha cc s hiu message c lin quan n
// trng thi hin thi ca cc nt con chut
); Hnh vi x l WM_SETCURSOR, message do windows gi n
ca s khi windows cn n nh li hnh dng cursor cho ph hp
vi v tr hin thi ca n trn ca s.
nHitTest cha thng tin v tr hin thi ca cursor:
HTBORDER : Cursor hin nm trn bin ca s
HTCLIENT
: Cursor hin nm trong vng client
HTCAPTION : Cursor hin nm trn tiu ca ca s
virtual LRESULT WindowProc( UINT message,
WPARAM wParam, LPARAM lParam );
Hnh vi x l cc message gi n ca s. Mc nhin, hnh vi ny
da vo bng MessageMap chuyn message n hnh vi x l
message tng ng ca i tng qun l ca s.
4.3 S DNG I TNG CWnd:
4.3.1 S dng CWnd lm giao din chnh ca ng dng:
To d n VD02 nh d n VD01. Thc hin cc b sung sau:
To icon c s hiu l IDC_MAINFRAME. Tham kho (2.8).
To cursor c s hiu l IDC_MAINFRAME:
To mi cursor: Thc hin tng t nh to mi icon, (2.8).
48

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

t im ch (hotpot) ca cursor: Trong mn hnh thit k


cursor:
trn thanh cng c.
- Click chn biu tng
- Click ti v tr hotpot ca cursor trn mn hnh thit k.
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
CWinApp cho lp CEmpApp (xem 2.7). Ni dung ci t ca hnh
vi nh sau:
CWnd* main = new CWnd(); // Con tr i tng CWnd.
HICON
myIcon;
// Khai bo bin qun l
HCURSOR myCursor;
// handle ca cursor v icon
CBrush
myBrush;
// Np cursor v icon t resource vo b nh.
myIcon = LoadIcon ( IDR_MAINFRAME );
myCursor = LoadCursor ( IDR_MAINFRAME );
// To brush t nn ca s vi mu RGB(190, 190, 0)
myBrush. CreateSolidBrush (RGB(190, 190, 0) );
// Khi to thng s cho i tng ca s main
main->CreateEx( WS_EX_TOPMOST,
AfxRegisterWndClass(
CS_HREDRAW|CS_VREDRAW,
myCursor, myBrush, myIcon),
"Emp.Example 2",
WS_SYSMENU | WS_VISIBLE | WS_MINIMIZEBOX,
100, 100, 300, 200, NULL, NULL );
// Dng main lm ca s giao din chnh
m_pMainWnd = main;
main->ShowWindow ( SW_SHOW );
// Kch hot ca s main
) Khi i tng ca s main ngng hot ng th ng dng cng kt
thc.
2 Xem VD02: Ca s main vi ExStyle l WS_EX_TOPMOST c th ni
trn mi ca s khc ngay c khi n khng phi l ca s kch hot. Vi
ExStyle l WS_EX_TOOLWINDOW, ca s s khng hin th trn
taskbar.
4.3.2 ng dng ch chy mt bn (instance) ti mi thi im:
ng dng ch c thc hin vi 1 bn duy nht, ta ci t c ch
nh du v kim tra. Trong chng trnh ca ng dng, ta qui c ng
Ca so giao dien va lp CWnd

49

k v s dng mt tn duy nht cho ca s chnh. Khi chng trnh c


thc hin, n kim tra xem tn c ng k cha thng qua hm
sau:
HANDLE CreateMutex( NULL, FALSE, LPCTSTR Tn );
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
ng dng c thc hin, chng trnh kt thc ch cho php mt
instance duy nht.
) Hy ci t c ch ny cho ng dng VD02 (Tham kho VD03).
THC HNH:
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
dng ca s giao din lun c kch thc 100100 v tiu l "Hello
!" bt chp gi tr kch thc v tiu dng cho khi to thng s ca
i tng ca s.

50

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

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 (
X ly Message

51

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
- UserFuncName

: So hieu message do ngi dung chon trc


: 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
);

52

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

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:

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:

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_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:

ON_REGISTERED_MESSAGE(UserRegMessageID, UserFuncName)

* Khai bao lp (tep tin .H):

Sau ay la mot v du:

class CMyClass: public CBasedWnd {


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

// 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 ( )

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

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:

#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()

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:
X ly Message

53

Cac muc x ly message do Classwizard quan ly at gia //{{ va //}}


54

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

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 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 )
{

- Chon muc Add Windows Message Handler... :


X ly Message

55

56

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.

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:

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:

Chon Resource Symbols...:


X ly Message

Chon muc New:

57

58

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

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.

X ly Message

59

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:
60

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

- 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:
ng dung cong cu GDI

61

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:

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:
: Sao chep va gi nguyen ty le trong noi dung anh.
- BitBlt
- 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:


62

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

ng dung cong cu GDI

63

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();
2 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.
64

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

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.
2 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:
oi tng CDC, quan ly DC long anh.
- m_butterDC :
- 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.
Kieu int, quan ly so th t cua hnh ang c
- m_pictNo :
hien th trong cac anh hoat hnh noi tren.
Hanh vi OnCreate cua CEmpWnd thc hien cac chuan b:
int CEmpWnd::OnCreate( LPCREATESTRUCT lpCreateStruct )
ng dung cong cu GDI

65

Hanh vi OnCreate cua CEmpWnd thc hien cac chuan b nh sau:

{
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.
66

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;
// 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.
ng dung cong cu GDI

67

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.

68

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

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:
- 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:

- 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).

- 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.

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:
Menu & Phm tat

69

2 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
= ID_EXIT
- Exit
70

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

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
// Chuoi ten resource cua menu
LPCTSTR lpMenuName
); 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:

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.
2 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...

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;

- Chon so hieu ID_GAME_ABOUT, click chon COMMAND. Sau o


chon muc Add and Edit.

} // Xem VD13 (he thong menu cha co x ly)


Menu & Phm tat

71

72

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.
: Phm tat.
- Key
- Modifier : Cac phm he thong phoi hp.
: ASCII Phm ky t ; VirtKey Phm bat ky.
- Type
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 (
// Handle ca so giao dien dung phm tat
HWND hWnd,
HACCEL hAccTable, // Handle cua bang phm tat
// Con tro bien cha message ieu phoi
LPMSG lpMsg
); 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:

- 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 thc 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.
2 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:

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

73

74

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

- 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:

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:
: anh dau
- Cach anh dau muc: = MF_CHECKED
= MF_UNCHECKED : Bo anh dau
: Theo v tr
- Cach ch nh muc: = MF_BYPOSITION
= 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 (
// So hieu muc chon
UINT nIDItem,
// Tham bien nhan ket qua
CString& rString,
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
// So hieu | vi tr mi cua muc chon
UINT nIDNewItem = 0,
LPCTSTR lpszNewItem = NULL // Thong bao mi cua muc chon
); Thay oi cac thong so lien quan en muc chon.

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
// Chuoi thong bao cua muc
LPCTSTR lpszNewItem=NULL
); 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 (
// V tr c chen.
UINT nPosition,
UINT nFlags,
// Cac thong tin khac
// tng t AppendMenu().
UINT nIDNewItem = 0,
LPCTSTR lpszNewItem = NULL
); Chen them muc chon vao trc muc c ch bi nPosition.
UINT CheckMenuItem (
UINT nIDCheckItem,
// So hieu | v tr muc chon
Menu & Phm tat

75

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.
2 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:
76

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

2 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.
9 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.
9 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.

Menu & Phm tat

77

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
// Toa o, kch thc cua muc
const RECT& rect,
CWnd* pParentWnd,
// Con tro oi tng ca so cha
78

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

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 (
// Handle cua icon
HICON hIcon
); Dung icon lam noi dung cua muc thong bao.
HICON GetIcon( ); Tra ve handle cua icon ang dung.
HCURSOR SetCursor (
// Handle cua cursor
HCURSOR hCursor
); 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").
2 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:
Cac lp oi tng nhap lieu

79

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 (
// Thong so dang hop nhap
DWORD dwStyle,
// Toa o va kch thc hop nhap
const RECT& rect,
// Con tro oi tng ca so cha
CWnd* pParentWnd,
// So hieu hop nhap, phai duy nhat
UINT nID
); 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.
80

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

void SetMargins (
// Le trai va
UINT nLeft,
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 (
// Ky t c chon
TCHAR ch
); 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.

Cac lp oi tng nhap lieu

81

int LineFromChar (
// Ch so ky t. 1 la ky t cuoi cung.
int nIndex = -1
); 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 (
// So dong cuon doc, < 0 la cuon xuong.
int nLines,
// So ky t cuon ngang, < 0 la cuon trai.
int nChars = 0
); Cuon noi dung van ban ang hien th trong hop nhap.
2 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
ON_EN_CHANGE
ON_EN_HSCROLL
ON_EN_VSCROLL
ON_EN_KILLFOCUS
ON_EN_MAXTEXT
ON_EN_SETFOCUS
ON_EN_UPDATE
82

Y ngha cua message c x ly


Noi dung edit ang thay oi.
Ngi dung click chon thanh trt ngang.
Ngi dung click chon thanh trt doc.
Edit cham dt hoat ong.
Noi dung vt qua chieu dai cho phep.
Edit bat au hoat ong.
D lieu nhap ang c cap nhat cho edit.

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

2 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;
}
2 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 );
Cac lp oi tng nhap lieu

83

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()
Muc bo sung
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
// Thong so dang nut (BS_PUSHBUTTON)
DWORD dwStyle,
const RECT& rect,
// Toa o, kch thc nut chon
// Con tro ca so cha
CWnd* pParentWnd,
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.
2 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
ON_BN_CLICKED
ON_BN_DOUBLECLICKED
84

Y ngha cua message c x ly


Ngi dung click tren nut.
Ngi dung double-click tren nut

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

2 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.
Cac lp oi tng nhap lieu

85

BOOL Create (
// Thong so an nh dang listbox
DWORD dwStyle,
const RECT& rect,
// Toa o, kch thc cua listbox
// Con tro oi tng ca so cha
CWnd* pParentWnd,
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 (
// Ch so muc c chon
int nSelect
); 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 (
// So muc c chon va
int nMaxItems,
// mang cha cac ch so cua chung
LPINT rgIndex
); 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.
86

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

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
// Ch so muc hien hanh trong listbox
UINT nIndex
); Hanh vi ke tha cho phep tuy nghi x ly tren phm.
virtual int CharToItem (
// Ma phm (character) c go
UINT nKey,
// Ch so muc hien hanh trong listbox
UINT nIndex
); Hanh vi ke tha cho phep tuy nghi x ly phm ky t.
2 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
ON_LBN_DBLCLK
ON_LBN_KILLFOCUS
ON_LBN_SELCANCEL
ON_LBN_SELCHANGE
ON_LBN_SETFOCUS
ON_WM_CHARTOITEM
ON_WM_VKEYTOITEM

Y ngha cua message c x ly


Ngi dung double-click tren listbox.
Ket thuc hoat ong nhap.
Huy bo thao tac chon.
Thay oi muc chon trong listbox.
Bat au nhap lieu tren listbox.
Dung cho ownerDraw listbox.
X ly WM_KEYDOWN

2 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()
Cac lp oi tng nhap lieu

87

{
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:
: Gia tr nhap ch c chon t danh sach.
- Drop-list
: Nh Drop-list ma danh sach hien th thng trc.
- Simple
- Drop-down : Nh Drop-list va co the nhap noi dung mi.
CComboBox( ); Tao lap oi tng rong.
88

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

BOOL Create (
// Cha thong so ve dang cua comboBox
DWORD dwStyle,
const RECT& rect,
// Toa o, kch thc comboBox
// Con tro oi tng ca so cha
CWnd* pParentWnd,
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 (
// Ch so muc trong comboBox
int nIndex,
// Bien cha ket qua
CString& rString
); 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.

Cac lp oi tng nhap lieu

89

2 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
ON_CBN_CLOSEUP
ON_CBN_DBLCLK
ON_CBN_DROPDOWN
ON_CBN_EDITCHANGE
ON_CBN_EDITUPDATE
ON_CBN_SELENDCANCEL
ON_CBN_SELENDOK
ON_CBN_KILLFOCUS
ON_CBN_SELCHANGE
ON_CBN_SETFOCUS

Y ngha cua message c x ly


Danh sach va c ong lai
Double-click tren muc chon
Danh sach va c m ra
Noi dung hop nhap ang thay oi
Sap cap nhat noi dung hop nhap
Bo qua viec thay oi muc chon.
Mot muc trong danh sach c chon
Ket thuc nhap lieu trong comboBox
Thay oi muc chon trong danh sach
Bat au nhap lieu trong comboBox

2 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;
90

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

...
// 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.

Cac lp oi tng nhap lieu

91

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.
2 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 15250. 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;

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
// Toa o, kch thc cua thanh
const RECT& rect,
// Con tro oi tng ca so cha
CWnd* pParentWnd,
// So hieu cua thanh tien o
UINT nID
); 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.

}
92

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

Cac lp oi tng nhap lieu

93

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
// Toa o, kch thc cua thanh cuon
const RECT& rect,
CWnd* pParentWnd,
// Con tro oi tng ca so cha
// So hieu thanh cuon
UINT nID
); 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 (
// V tr at nut cuon
int nPos,
BOOL bRedraw = TRUE // Cap nhat lai hnh anh thanh cuon
); at v tr nut cuon tren thanh cuon.
void SetScrollRange (
// Gia tr nho nhat
int nMinPos,
// Gia tr ln nhat
int nMaxPos,
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.
2 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.
2 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:

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.

94

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

Cac lp oi tng nhap lieu

95

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.
// Toa o, kch thc cua thanh
const RECT& rect,
CWnd* pParentWnd,
// Con tro oi tng ca so cha
// So hieu thanh trt
UINT nID
); 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
// Lay gia tr ln nhat
LPINT lpMaxPos
); Lay gia tr gii han nho nhat va ln nhat cua thanh trt.
2 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.
96

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

CHNG 9:

Hop hoi thoai

9.1 HOP HOI THOAI (DIALOG):


Dialog la ca so giao dien 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 (
// So hieu cua dialog resource
UINT nIDTemplate,
// Con tro oi tng ca so cha
CWnd* pParentWnd = NULL
); 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
Hop hoi thoai

97

98

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 (
// So hieu dialog resource
UINT nIDTemplate,
// Con tro oi tng ca so cha.
CWnd* pParentWnd = NULL
); 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.

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

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.
2 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 ).
Hop hoi thoai

99

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.


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

ID
: So hieu cua dialog resource.
Caption : Noi dung tieu e cua dialog.
Menu : So hieu cua menu resource gan vao dialog.
: An nh font dung cho noi dung ch tren dialog.
Font
- Chon Styles e an nh thong so dang ca so cua dialog:
ac tnh cua dialog. Chang han chon Popup cho
Style :
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:
tren thanh cong cu.
- Click chon bieu tng
- 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.
Hop hoi thoai

101

Static edge : Khung chm.


Cai oi tng hop nhap len dialog:
tren thanh cong cu.
- Click chon bieu tng
- 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.

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

- 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:

- File name = OptDlg


: Ten tap tin,
: Lp c s
- Base class = CDialog
- 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.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).

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"
...
COptionDlg dlg (this);

// EmpWnd.cpp : implement file


// 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

2 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:

Chon OK e tao lp mi ng vi dialog resource.

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

- Name
Hop hoi thoai

= COptionDlg

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.

: Nhap ten lp mi
103

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

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.
2 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
}

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;
public:
CEmpWnd();
...
};

// COptionDlg is a friend

// 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

105

106 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.

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.

Hop hoi thoai

107

Chon muc Dialog Based, sau o chon Next.

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

An nh cac muc chon nh tren. Sau o chon Next.

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.
2 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.

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 c s dung e lu tr gia tr
- Bien gia tr (value variable):
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.
Hop hoi thoai

109

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

Chon trang Member Variables, chon muc co so hieu IDC_NHAP.


Sau o chon muc Add Variable.

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
}

- Meber variable name = m_szNhap : Ten bien


= Value
: Loai bien
- Category
- 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:

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

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:
Hop hoi thoai

111

Chon nhom tien ch: Double-click muc nhom tien ch can dung.
112 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

2 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:

(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.
Hop hoi thoai

113

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.
2 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
114 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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.
Hop hoi thoai

115

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
khi di chuyen
"Mailto: emp@hcmueco.edu.vn". Hnh anh chuot oi thanh
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
// ng dan tap tin chng trnh
LPCTSTR lpFile,
LPCTSTR lpParameters, // Chuoi tham so dong lenh
// ng dan th muc lam viec
LPCTSTR lpDirectory,
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 );

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

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:
Khung ca so giao dien chnh

117

CStatusBar( ); Tao lap oi tng rong.


BOOL Create (
/* Con tro oi tng ca so cha */
CWnd* pParentWnd,
/* 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 (
// Noi dung thong bao cap nhat
LPCTSTR lpszString
); 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
// Ve lai thong tin cap nhat
BOOL bUpdate=TRUE
); Cap nhat noi dung thong bao trong pane mot pane.
void SetPaneInfo (
int nIndex,
// So th t pane trong statusbar
// So hieu gan cho pane
UINT nID,
UINT nStyle,
// Thong so dang cua pane
// o rong pane (tnh bang pixel)
int cxWidth
); 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 ).
118Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

SBPS_NORMAL
: Khong co kieu dang ac biet,
void SetPaneStyle (
// So th t pane trong statusbar
int nIndex,
// Thong so dang cua pane
UINT nStyle
); 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.
Khung ca so giao dien chnh

119

void SetHeight( int cyHeight ); An nh chieu cao cua toolbar.


void EnableDocking (
// Cach ket toolbar vao frame window
DWORD dwStyle
// 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.
120Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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 */
Khung ca so giao dien chnh

121

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).
// Thong so dang frame window
DWORD dwDefaultStyle
= WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,
// Con tro oi tng ca so cha
CWnd* pParentWnd
); 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.

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

void DockControlBar (
// Con tro oi tng toolbar
CControlBar * pBar,
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.

2 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 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:
2 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;
}

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.

Khung ca so giao dien chnh

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

123

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

- 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.
2 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:
Khung ca so giao dien chnh

125

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;
}
2 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;
}
126Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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;
}
2 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);
}
Khung ca so giao dien chnh

- 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 hien 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).

127

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

2 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.
Khung ca so giao dien chnh

129

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.

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

An nh nh tren. Chon Next.

Chon Next.

An nh nh tren. Chon Next.


Khung ca so giao dien chnh

131

Chon StatusBar va ToolBar. Sau o chon Next


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

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.
Khung ca so giao dien chnh

133

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.

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 (
// ng dan va ten tap tin
LPCTSTR lpszPathFileName
); 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.1 CDocument:
CDocument la lp oi tung quan ly mot noi dung d lieu (Document).
CDocument( ); Tao lap oi tng rong.
void AddView (
// Con tro oi tng view
CView* pView
); 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
// So hieu cap nhat
LPARAM lHint = 0L,
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.

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 (
// Trang thai kch hoat
UINT nState,
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.

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

Cac kien truc Document & View

135

CDocument* GetDocument( ); Tra ve con tro oi tng CDocument


ang s dung view.
virtual void OnUpdate (
// oi tng view lam thay oi d lieu
CView* pSender,
LPARAM lHint,
// Tng t UpdateAllViews()
// cua CDocument
CObject* pHint
); 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 )
136 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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:
Tieu e
- CDocTemplate::windowTitle :
- 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.
Cac kien truc Document & View

137

afx_msg void OnFilePrintSetup(); Hanh vi x ly WM_COMMAND


c phat ra bi muc menu co so hieu ID_FILE_PRINT_SETUP.

oi tng view:

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


oi tng document:

) 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:

oi tng Frame window:

An nh nh tren. Chon OK.


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

Cac kien truc Document & View

139

An nh nh tren. Chon Next.

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

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

An nh cac muc can can thiet:

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

Cac kien truc Document & View

141

- Printing and print preview: Cho phep chc nang in an.


- MAPI: S dung dch vu mail cho d lieu cua ng dung.
Chon Next.

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.

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.

An nh nh tren. Chon Next.

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

Cac kien truc Document & View

143

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

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

ng dung s dung OLE (Container) t ng dung khac. Chon Next.

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

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

Cac kien truc Document & View

145

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.


146 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.

Chon None. Chon Next.


Cac kien truc Document & View

147

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

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.

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


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

2 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.
Cac kien truc Document & View

149

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 (
// Con tro en cau truc nhan thong tin
LVITEM* pItem
); 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.
2

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 (

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

CImageList* pImagelist, // Con tro oi tng imagelist


// Thong so qui nh cach s dung
int imgStyle
); 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 (
// Noi dung thong bao cua muc
LPCTSTR lpszItem,
// Ch so anh dung cho muc trang thai
int nImage,
int nImageSelected,
// bnh thng va khi muc c chon.
// Con tro muc cha
HTREEITEM parent = TVI_ROOT,
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

Cac kien truc Document & View

151

int nSelectedImage
// bnh thng va khi muc c chon.
); An nh ch so anh trong imagelist dung cho muc.
BOOL SetItemText (
// handle cua muc
HTREEITEM hItem,
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.
152 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

BOOL Create (
// Con tro oi tng ca so cha
CWnd* pParentWnd,
int nMaxRows,
// So hang toi a cua cac pane
// So cot toi a cua cac pane
int nMaxCols,
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
// So cot cac pane c tao
int nCols,
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 (
// Ch so hang va
int row,
// ch so cot cua pane trong splitter
int col,
CRuntimeClass* pViewClass, // Cau truc cha thong tin lp view
// Kch thc khi au cua pane
SIZE sizeInit
); 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
// o rong mong muon va
int cxIdeal,
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
// Tham bien cha o rong toi thieu
int& cxMin
); Lay thong tin ve o rong cua cot.
void SetRowInfo (
Cac kien truc Document & View

153

int row,
// Ch so hang
// o cao mong muon
int cyIdeal,
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
// Tham bien cha o cao toi thieu
int& cyMin
); 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:

2 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;

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);
...
return TRUE;

// Thc hien cac cai at khac

}
11.10.5 CAC V DU THC HANH:
154 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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;
}
2 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)
Cac kien truc Document & View

155

{
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);
}

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:

2 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:
156 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

Cac kien truc Document & View

157

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) );
158 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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 (
// Ten thanh phan
LPCTSTR lpszSection,
LPCTSTR lpszEntry,
// Ten muc
// Gia tr cua muc (kieu chuoi)
LPCTSTR lpszValue
); Lu gia tr kieu chuoi cua mot muc trong thanh phan xac nh.
BOOL WriteProfileInt (
// Ten thanh phan
LPCTSTR lpszSection,
// Ten muc
LPCTSTR lpszEntry,
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
// Vung em cha gia tr ma
LPBYTE pData,
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
// Ten muc. Neu muc oc khong
LPCTSTR lpszEntry,
// co th s dung gia tr nay.
int nDefault
); Tra ve gia tr kieu so nguyen cua mot muc trong thanh tng ng.
BOOL GetProfileBinary (
// Ten thanh phan
LPCTSTR lpszSection,
LPCTSTR lpszEntry,
// Ten muc
// a ch con tro vung em
LPBYTE *pData,
UINT *nBytes
// a ch bien nhan kch thc.
); oc khoi ma nh phan cua mot muc vao vung em.

Mot so van e trong Windows

159

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.
2 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);
2 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 )


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

- 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>.
2 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:
Mot so van e trong Windows

161

- Hop nhap gia tr muc MyName Edit


IDC_WRITE_NAME
Edit
IDC_WRITE_VERSION
- Hop nhap gia tr muc MyVer
- Hop hien th muc MyName
Static IDC_READ_NAME
Static IDC_READ_VERSION
- Hop hien th muc MyVer
- Nut chon thc hien ghi
Button IDC_WRITE
Button IDC_READ
- Nut chon thc hien oc
- 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:

Taskbar la thanh cong cu ac biet cua ng dung desktop trong windows.


Noi dung cua taskbar c chia thanh 4 thanh phan chnh:
Muc kch hoat he thong menu cac ng dung.
- Start menu:
- Quick Launch Bar: Danh muc cac ng dung thng dung.
- Taskbar Buttons:
Danh sach cac ng dung ang chay.
Cha icon giao dien cua cac ng dung ang chay.
- Status Area:
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.
162 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

Mot so van e trong Windows

163

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:
: So hieu message cua icon (trong uCallbackMessage).
- message
: So hieu cua icon.
- wParam
- 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);
}
2 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.
164 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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
Button IDC_ICON_SET
- Nut thc hien at icon
- 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:
Mot so van e trong Windows

165

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.
166 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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:

2 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.
Mot so van e trong Windows

167

2 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:
168 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

(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"
Mot so van e trong Windows

169

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.

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)));

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:
170 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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
}

Mot so van e trong Windows

171

- 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;
172 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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;
Mot so van e trong Windows

173

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.
174 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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
// Tham so cua ham.
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
2Sau 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 );
Mot so van e trong Windows

175

2 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:
176 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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:
Mot so van e trong Windows

177

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).
2 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.
178 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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
// Con tro en bien cha ket qua.
LPDWORD lpExitCode
); Lay gia tr ket thuc cua mot tieu 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:
Mot so van e trong Windows

179

Sau ay la cac ham MCI s dung pho bien (Vfw.h):


HWND MCIWndCreate (
// Handle ca so cha cua ca so MCI
HWND hwndParent,
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.
2 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


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

- M dialog resource, cai cac control sau:


Edit
IDC_FILE
- Hop nhap ng dan, ten tap tin
- Nut lenh thc hien Play
Button IDC_PLAY
Button IDC_STOP
- Nut lenh thc hien 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:
Mot so van e trong Windows

181

BOOL SystemParametersInfo (
// So hieu cua chc nang can thc hien
UINT uiAction,
UINT uiParam,
// An nh tuy thuoc uiAction
// Con tro vung em, tuy thuoc uiAction
PVOID pvParam,
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
2 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.
182 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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
Mot so van e trong Windows

183

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
HCBT_ACTIVATE
( Kch hoat ca so )
HCBT_CREATEWND
( Tao mi ca so )

wParam

lParam

Handle cua ca so

Con tro cau truc


cha thong tin.
Con tro cau truc
cha thong tin.

Handle cua ca so.

HCBT_DESTROYWND Handle cua ca so.


( Huy bo ca so )
HCBT_MINMAX
Handle cua ca so.
( Phong to hay Thu nho
ca so )

=NULL
Word thap cha
thong so hien th
ca so ( SW_xxx ).

HCBT_MOVESIZE
Handle cua ca so.
( Di chuyen hoac thay
oi kch thc 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
// a ch thu tuc hook
HOOKPROC lpfn,
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.
184 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

hMod :

Handle cua ng dung hoac DLL cha thu tuc hook.


LRESULT CallNextHookEx (
// Handle cua thu tuc hook chiem quyen
HHOOK hhk,
// Chuyen giao gia tr cac tham so
int nCode,
WPARAM wParam, // ma thu tuc hook chiem quyen
// nhan c t he thong
LPARAM lParam
); 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 (
// Handle cua DLL cha thu tuc
HMODULE hModule,
// Ten thu tuc
LPCSTR lpProcName
); 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()
{
Mot so van e trong Windows

185

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.
2 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.

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

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
MFC vi Internet

187

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):
188 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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).
2 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.
11000000 10101000 00000011 00011000
IP:
192.168.3.24
Hay:
MFC vi Internet

189

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
3 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
190 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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)
MFC vi Internet

191

2 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
2 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.00000001192.168.0.1 11000000.10101000.00011111.11111110
192.168.31.254
2
11000000.10101000.00100000.00000001192.168.32.1 11000000.10101000.00111111.11111110
192.168.63.254
3
11000000.10101000.01000000.00000001192.168.64.1 11000000.10101000.01011111.11111110
192.168.95.254
4
11000000.10101000.01100000.00000001192.168.96.1 11000000.10101000.01111111.11111110
192.168.127.254
5
11000000.10101000.10000000.00000001192.168.128.1 11000000.10101000.10011111.11111110
192.168.159.254
6
11000000.10101000.10100000.00000001192.168.160.1 11000000.10101000.10111111.11111110
192.168.191.254
7
11000000.10101000.11000000.00000001192.168.192.1 11000000.10101000.11011111.11111110
192.168.223.254
8
11000000.10101000.11100000.00000001192.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:
192 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

- 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
MFC vi Internet

193

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).
194 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

- Interface:
- Metric:

Thiet b giao tiep mang c s dung.


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.
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.
2 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.
MFC vi Internet

195

Network
Address
0.0.0.0
127.0.0.0

157.55.16.1
127.0.0.1

Address
Interface
157.55.27.90
127.0.0.1

0.0.0.0
255.0.0.0

1
1

157.55.16.0

255.255.240.0

157.55.27.90

157.55.27.90

157.55.27.90
157.55.255.255
224.0.0.0
255.255.255.255

255.255.255.255
255.255.255.255
224.0.0.0
255.255.255.255

127.0.0.1
157.55.27.90
157.55.27.90
157.55.27.90

127.0.0.1
157.55.27.90
157.55.27.90
157.55.27.90

1
1
1
1

Netmask

Gateway

Metric

Purpose
Default Route
Loopback Network
DirectyAttached
Network
Local Host
Network Broadcast
Multicast Address
Limited Broadcast

( Mot bang nh tuyen cua Windows NT )


2 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:
196 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

Host gi: Packet c gi t giao thc tang cap cao hn cua IP (TCP,

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:
C che truyen d lieu theo dong.
Stream Socket:
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.

Host nh tuyen: Vai tro cua IP nh sau:

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 :

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.
- 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:

MFC vi Internet

197

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 {
198 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
} SOCKADDR_IN ;

// Co gia tr la AF_INET
// So hieu port
// a ch IP 4 bytes cua host
// Ch e tng thch vi SOCKADDR

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.

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 (
// a ch IP 4 bytes
struct in_addr in
); Tra ve chuoi a ch num-dot tng ng.
unsigned long inet_addr (
// a ch IP num-dot
const char FAR *cp
); 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.
MFC vi Internet

- 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.

199

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 (
nSocketPort = 0,
UINT
nSocketType = SOCK_STREAM,
int
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.
200 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

- n SocketType : An nh giao thc s dung; SOCK_STREAM cho


TCP hoac SOCK_DGRAM cho UDP.
Bao gom cac thong so lien quan en cac bien co
- lEvent :
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 (
// So hieu port
UINT nSocketPort,
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
// Kch thc bien cha gia tr
int nOptionLen,
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
= sizeof (BOOL)
int nOptionLen,
MFC vi Internet

201

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
// Kch thc vung em
int nBufLen,
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
// Vung em d lieu
const void* lpBuf,
// Kch thc vung em
int nBufLen,

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

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
// Kch thc a ch
int nSockAddrLen,
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
// a ch vung em nhan d lieu
void* lpBuf,
// Kch thc vung em
int nBufLen,
// ac tnh nhan d lieu.
int nFlags = 0
); 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
// Kch thc vung em
int nBufLen,
CString& rSocketAddress,
// a ch num-dot oi tac
// So hieu port oi tac
UINT& rSocketPort,
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 ).

MFC vi Internet

203

virtual void OnConnect (


// Ma loi
int nErrorCode
); 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:
204 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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];
MFC vi Internet

205

}
- 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.
206 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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

MFC vi Internet

207

CSocket sockSrvr;
// Tao socket 1,2
sockSrvr.Create(nPort);
// Ch nhan ket noi
sockSrvr.Listen( );

CSocket sockClient;
// Tao socket 2
sockClient.Create( );

// 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 .
...
// Ket thuc ket noi 7 .
sockSrvr.Close();

// Truyen d lieu 6 .
...
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.

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

- 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;
MFC vi Internet

209

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
210 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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:
: Edit
So hieu IDC_FILE
- Hop nhap ten tap tin
: Static IDC_INFO
- Hop hien th trang thai he thong
- 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" );
MFC vi Internet

211

// 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;

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

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
: Static
IDC_INFO
- Hop hien th trang thai he thong
: IPControl IDC_HOSTIP
- Hop nhap a ch IP cua server
MFC vi Internet

213

- 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.

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

2 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

) 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

215

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

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
: Edit
IDC_MAIL_TO
- Hop nhap a ch ngi nhan
- Hop nhap tieu e cua mail
: Edit
IDC_MAIL_SUBJECT
: Edit
IDC_MAIL
- Hop soan thao noi dung 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_SUBJECT,
"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
}

// 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_SUBJECT, s + strlen(s), 1024);
strcpy(s + strlen(s), "\r\n");
m_sock.Send(&s, strlen(s));
// Noi dung mail

- Hanh vi OnOK ng vi nut chon IDOK thc hien gi mail:


MFC vi Internet

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;

217

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

-ERR error_message ket thuc.

GetDlgItemText(IDC_MAIL, s, 1024);
sprintf(s, "%s%s", s, "\r\n");
m_sock.Send(&s, strlen(s));

Sau khi ang nhap thanh cong, co the tuy y thc hien cac cong viec sau:

// 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
MFC vi Internet

219

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:
IDC_SERVER_IP
- Hop nhap a ch mail server : Edit
: Edit
IDC_SERVER_PORT
- Hop nhap so hieu port
- Hop nhap ten ngi truy cap : Edit
IDC_USER_NAME
IDC_USER_PASSWORD
- Hop nhap password truy cap : Edit
220 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

- Hop nhap so hieu mail nhan ve


:
Edit
IDC_MAIL_NO
: Edit
IDC_MAIL
- Hop hien th noi dung 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;

- 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 ");


// 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, "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, "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>

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"));

// Ket thuc...
strcpy(s, "QUIT\r\n");
m_sock.Send(&s, strlen(s));
m_sock.Close();

strcpy(s, "QUIT\r\n");
// Ket thuc
m_sock.Send(&s, strlen(s)); m_sock.Close();
}

}
MFC vi Internet

221

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

pstrProxyName :
pstrProxyBypass :

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.

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 (
// C ly di tng oi
LONG lOffset,
// V tr lam moc.
UINT nFrom
); 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

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

223

Proxy. S dung cho truy xuat thong qua proxy.


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
// Ten ang nhap
LPCTSTR pstrUserName = NULL,
LPCTSTR pstrPassword = NULL,
// password hp le
/* so hieu port ket noi */
INTERNET_PORT nPort =
INTERNET_INVALID_PORT_NUMBER,
// C che ket noi
BOOL bPassive = FALSE
); 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
// password hp le
LPCTSTR pstrPassword = NULL
); Tra ve con tro oi tng quan ly lien ket vi HTTP server.

- CFile::begin
: Tnh t au tap tin.
- CFile::end
: Tnh t cuoi tap tin.
virtual UINT Read (
// a ch vung em cha d lieu oc
void* lpBuf,
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 (
// Bien cha chuoi c ghi ra
LPCTSTR pstr
); 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 (
// ng dan th muc
LPCTSTR pstrDirName
); Xoa th muc tren FTP server.
BOOL CreateDirectory (
// ng dan va ten th muc
LPCTSTR pstrDirName
); Tao mi th muc tren FTP server.
BOOL Rename (
LPCTSTR pstrExisting,
// ng dan va ten cu cua th muc
MFC vi Internet

225

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 (
// ng dan va ten tap tin client
LPCTSTR pstrLocalFile,
LPCTSTR pstrRemoteFile, // ng dan va ten tap tin server
/* Kieu noi dung tap tin */
DWORD dwFlags =
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
// ng dan ten tap tin tren client
LPCTSTR pstrLocalFile,
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.

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

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.

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.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
MFC vi Internet

227

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,
228 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

pstrVersion:
dwFlags :

Giao thc s dung, mac nhien la "HTTP/1.0"


Toi u trong truy xuat
INTERNET_FLAG_RELOAD
: Khong oc t cache.
INTERNET_FLAG_DONT_CACHE
: Khong e lai cache.

HTTP_ADDREQ_FLAG_REPLACE :

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 (
// Thong so truy van
DWORD dwInfoLevel,
// Vung em nhan ket qua
LPVOID lpvBuffer,
// Chieu dai vung em
LPDWORD lpdwBufferLength,
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/*"
MFC vi Internet

229

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.
// Cac dien giai cua client (khong
LPVOID lpOptional = NULL,
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 (
// Kch thc d lieu
LPINTERNET_BUFFERS lpBuffIn,
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.

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

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.
MFC vi Internet

231

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:
: Edit
IDC_URL
- Hop nhap a ch FTP server
- 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:
: Edit
IDC_URL
- Hop nhap a ch HTTP server
: Edit
IDC_SOURCE
- Hop hien th noi dung tap tin
: Button IDOK
- Nut lenh thc hien tai tap tin ve

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

- 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.

MFC vi Internet

233

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):
234 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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:
oi tng = Thuoc tnh + Hanh vi
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.
Chng trnh = Tap hp cac oi tng + 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):
Phu luc A: Mot so van e lap trnh hng oi tng

235

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:
Cac thuoc tnh, hanh vi c oi tng the hien ben ngoai.
- Public:
- 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:
236 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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"
2 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:
Phu luc A: Mot so van e lap trnh hng oi tng

237

// 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++:
238 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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

Phu luc A: Mot so van e lap trnh hng oi tng

239

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 ] );
2 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
240 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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 );


2 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
Phu luc A: Mot so van e lap trnh hng oi tng

241

#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:
242 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

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 ) {
Phu luc A: Mot so van e lap trnh hng oi tng

243

A* a[5];
for ( int i = 0; i<5; i++ ) {
if ( i % 2 )
a[ i ] = new B();
else
a[ i ] = new C();
}
while ( !kbhit() ) {
for ( i = 0; i < 5 ; i++ )
a[ i ]->Action( );
delay( 100 );
}
for ( i = 0; i < 5 ; i++ )
delete a[ i ];

// 5 phan t kieu lp A
// Khi tao ngau nhien theo kieu lp B
// hoac lp C

// Hanh ong theo cach cua lp B hoac C


// Tam dng

}
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 ] ) {

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() );

// 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:
244 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com

}
) 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.

Phu luc A: Mot so van e lap trnh hng oi tng

245

You might also like