Professional Documents
Culture Documents
lntmail@yahoo.com
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
10
10
10
10
11
12
14
20
25
27
27
29
29
29
29
30
30
3.4.2 Lp Cpen
3.4.3 Lp CBrush
3.4.4 Lp CFont
3.4.5 Lp CBitmap
3.4.6 Lp CPalette
3.4.7 Lp CRgn
3.5 Lp CDC
3.6 Lp CImageList
31
31
32
32
33
34
35
38
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
60
60
60
63
64
65
66
67
69
69
69
7.3
7.4
7.5
7.6
7.7
71
72
73
75
77
78
78
80
84
85
88
91
93
94
96
97
97
97
99
99
103
104
104
106
106
107
109
112
117
117
117
119
120
121
121
123
123
124
130
134
134
135
136
136
137
138
139
143
146
149
149
150
152
154
155
158
158
160
162
167
168
168
170
171
175
175
12.6
12.7
12.8
12.9
177
179
179
181
182
183
183
183
184
185
186
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
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:
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
CHNG 2:
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
11
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
13
- Win32 Application
- Location
- Project Name
Sau chn OK.
14
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
15
#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:
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
17
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
19
20
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
21
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
22
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
23
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
#include "stdafx.h"
#include "Emp.h"
CEmpApp theApp;
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
25
Chn mc Insert...
- ID
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
27
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:
29
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
31
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
33
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
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
39
CHNG 4:
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
// Dng ca lp ng k
// Con tr hm WindowProc ca
// ca s. C th ly hm do
MFC
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
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
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
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);
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
49
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
}
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
51
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
52
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
ON_REGISTERED_MESSAGE(UserRegMessageID, UserFuncName)
53
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
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:
57
58
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
X ly Message
59
CHNG 6:
- 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:
- 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
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
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
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
{
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
67
68
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
CHNG 7:
69
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
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;
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:
73
74
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
UINT nCheck
// Cach thc anh dau muc chon
); anh dau hoac huy bo anh dau muc chon tren menu.
nCheck la gia tr ket hp cua hai noi dung:
: 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.
75
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.
77
CHNG 8:
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
79
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.
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
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
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
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.
89
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,
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;
}
92
Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
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
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:
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
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
102 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
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();
void CEmpWnd::OnGameOption ()
{
COptionDlg dlg(this);
dlg.DoModal();
}
- Name
Hop hoi thoai
= COptionDlg
: 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
}
// COptionDlg is a friend
// other declarations
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.
107
108 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
e thc hien ong bo hai noi dung khi mot trong hai hien tng noi
tren xay ra, ta s dung hanh vi sau ma lp CDialog ke tha t CWnd:
BOOL UpdateData( BOOL bSaveAndValidate = TRUE );
Tham so bSaveAndValidate co y ngha nh sau:
TRUE : Chuyen gia tr trong control vao bien gia tr.
FALSE : Chuyen gia tr trong bien gia tr vao control.
S dung bien ieu khien:
Bien ieu khien la oi tng thuoc mot lp oi tng nhap lieu (xem
chng 8) co kieu phu hp vi control. Thong qua cac hanh vi cua bien oi
tng nay, ta co the thc hien cac tac ong cho phep len control.
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.
109
110 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
void CEmpDlg::OnDat()
{
m_editNhap.SetWindowText( "Mr.Emp, Hello !" );
}
Bien dch va chay th ng dung.
) Hanh vi OnDat co the cai at nh sau:
void CEmpDlg::OnDat()
{
m_szNhap = "Mr.Emp, Hello !";
UpdateData(FALSE);
// Cap nhat gia tr bien cho control
}
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:
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
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:
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
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
121
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;
}
124Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
123
125
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
";
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
Chon Next.
131
133
CHNG 11:
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
135
137
oi tng view:
) Nham ho tr ngi dung thc hien cac d an lien quan en viec s dung
d lieu, MFC cung cap cac bo DVF pho bien va cai at cac bo nay trong
phan ho tr MFC Wizard. Sau ay la mot so bo DVF ac trng cua MFC.
11.7 TEXT DOCUMENT APPICATION:
Chon File / New:
139
140 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
141
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.
142 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
143
144 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
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.
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.
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
150 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
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:
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;
}
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:
157
CHNG 12:
159
- 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 );
161
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 ) {
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
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.
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
}
171
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
175
- 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.
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
// MCI library
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
183
lParam
wParam
lParam
Handle cua 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 )
hMod :
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:
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
hien chia he mang tren thanh 256 subnet da tren byte th ba, ta c cac
subnet 8-bit a ch lp B:
191
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
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:
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
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.
MFC vi Internet
197
// Co gia tr la AF_INET
// So hieu port
// a ch IP 4 bytes cua host
// Ch e tng thch vi SOCKADDR
};
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
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
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
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
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( );
// Truyen d lieu 6 .
...
sockClient.Close()
208 Lap trnh Windows vi MFC - Microsoft Visual C++ 6.0 - Le Ngoc Thanh - lntmail@yahoo.com
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
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
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
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
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
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.
219
- 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, "LIST\r\n");
// Lay thong tin hop mail
m_sock.Send(&s, strlen(s));
if ( (port = m_sock.Receive(s, 1024)) < 1 || !isOK(s) )
return;
s[port] = '\0';
SetDlgItemText(IDC_MAIL, s+4); // Bo qua +OK<SP>
// Ket thuc...
strcpy(s, "QUIT\r\n");
m_sock.Send(&s, strlen(s));
m_sock.Close();
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.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
- 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
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 :
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
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
231
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
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
}
237
public
public
private
protected
protected
private
private
ac iem ke tha
public
Private
};
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
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
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
}
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:
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() );
}
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.
245