Thư viện tri thức trực tuyến
Kho tài liệu với 50,000+ tài liệu học thuật
© 2023 Siêu thị PDF - Kho tài liệu học thuật hàng đầu Việt Nam

Visual C++ lý thuyết và ứng dụng
Nội dung xem thử
Mô tả chi tiết
LEÂ NGOÏC THAÏNH
LAÄP TRÌNH WINDOWS VÔÙI MFC
Microsoft Visual C++ 6.0
NHAØ XUAÁT BAÛN THOÁNG KEÂ
MUÏC LUÏC
CHÖÔNG 1 : MOÄT SOÁ KHAÙI NIEÄM LAÄP TRÌNH
TRONG MOÂI TRÖÔØNG WINDOWS
1.1 Chöông trình ( Program )
1.2 ÖÙng duïng ( Application )
1.3 Tieán trình ( Process )
1.4 Tieåu trình (Thread )
1.5 Thoâng ñieäp ( Message )
1.5.1 Nguoàn goác cuûa message
1.5.2 Caùc loaïi message
1.5.3 Soá hieäu message (Message Indentifier – MessageID)
1.5.4 Ñaëc taû message
1.6 Cöûa soå giao dieän (window) cuûa öùng duïng
1.7 Message queue
1.8 Kieán truùc xöû lyù cuûa öùng duïng trong Windows
1.9 Resource cuûa öùng duïng
CHÖÔNG 2 : THÖ VIEÄN MFC CUÛA MICROSOFT
& ÖÙNG DUÏNG CÔ BAÛN TRONG WINDOWS
2.1 Thö vieän MFC (Microsoft Foundation Class)
2.2 Tieáp an MFC
2.3 Taïo öùng duïng windows vôùi MFC nhö theá naøo ?
2.4 Lôùp quaûn lyù tieåu trình CwinThread
2.5 Lôùp quaûn lyù tieåu trình giao dieän chính CwinApp
2.6 Thöïc hieän öùng duïng ñôn giaûn
2.7 Thöïc hieän öùng duïng giao taùc ñôn giaûn
2.8 Taïo môùi Icon Resource cho öùng duïng
2.9 Löu tröõ chöông trình nguoàn
2.10 Lôùp Cstring cuûa MFC
CHÖÔNG 3 : CAÙC LÔÙP GIAO DIEÄN ÑOÀ HOÏA CUÛA MFC
3.1 Caùc coâng cuï giao dieän ñoà hoïa
3.2 Device Context
3.3 Toïa ñoä treân giao dieän ñoà hoïa
3.4 Caùc lôùp MFC hoã trôï GDI
3.4.1 Caùc lôùp ñoái töôïng ñieåm, hình chöõ nhaät
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 Lôùp Cpen
3.4.3 Lôùp CBrush
3.4.4 Lôùp CFont
3.4.5 Lôùp CBitmap
3.4.6 Lôùp CPalette
3.4.7 Lôùp CRgn
3.5 Lôùp CDC
3.6 Lôùp CImageList
CHÖÔNG 4 : CÖÛA SOÅ GIAO DIEÄN LÔÙP VAØ LÔÙP CWnd
4.1 Cöûa soå giao dieän
4.2 Lôùp CWnd
4.3 Söû duïng ñoái töôïng CWnd
4.3.1 Söû duïng CWnd laøm giao dieän chính cuûa öùng duïng
4.3.2 ÖÙng duïng chæ chaïy moät baûn (instance) taïi moãi thôøi ñieåm
CHÖÔNG 5 : XÖÛ LYÙ MESSAGES
5.1 Lôùp xöû lyù message CCmdTarget:
5.2 Khai baùo muïc xöû lyù message trong MessageMap
5.3 Caùc lôùp keá thöøa CCmdTarget
5.4 MessageMap cuûa lôùp keá thöøa CWnd trong öùng duïng
5.4.1 Cöûa soå cuûa öùng duïng coù chöùc naêng hoaït ñoäng
5.4.2 WM_PAINT vaø haønh vi OnPaint cuûa CWnd
CHÖÔNG 6 : ÖÙNG DUÏNG COÂNG CUÏ GDI
6.1 DC vaø BITMAP
6.2 ÖÙng duïng vôùi cöûa soå chính hieån thò aûnh
6.3 Sao cheùp aûnh töø DC ñeán DC, phoùng to & thu nhoû aûnh
6.4 DC trong boä nhôù ( DC aûo) – vuøng veõ ñeäm lyù töôûng
6.5 AÛnh chuyeån ñoäng trong vuøng client
6.6 CImageList – coâng cuï quaûn lyù boä aûnh cuøng côõ
6.7 CRgn – Cöûa soå coù hình daïng tuøy yù
CHÖÔNG 7 : MENU – PHÍM TAÉT
7.1 Ñònh nghóa
7.2 Menu resoure
31
31
32
32
33
34
35
38
40
40
40
49
49
50
51
51
52
55
55
55
58
60
60
60
63
64
65
66
67
69
69
69
7.3 Söû duïng menu resource
7.4 Muïc xöû lyù command message töø muïc choïn cuûa menu
7.5 Phím taét (hot key ) cho muïc choïn treân menu
7.6 Lôùp quaûn lyù menu – CMenu
7.7 Xöû lyù ñieàu khieån muïc choïn cuûa menu
CHÖÔNG 8 : CAÙC LÔÙP ÑOÁI TÖÔÏNG NHAÄP LIEÄU
( WINDOWS CONTROLS )
8.1 CStatic
8.2 CEdit
8.3 CButton
8.4 ClistBox
8.5 CComboBox
8.6 CSpinButtonCtrl
8.7 CProgressCtrl
8.8 CscrollBar
8.9 CSliderBar
CHÖÔNG 9 : HOÄP HOÄI THOAÏI
9.1 Hoäp hoäi thoaïi (Dialog)
9.2 Lôùp CDialog
9.3 Taïo vaø söû duïng dialog trong chöông trình
9.3.1 Taïo dialog resource
9.3.2 Khai baùo lôùp keá thöøa CDialog söû duïng dialog resource
9.3.3 Söû duïng dialog trong chöông trình
9.4 Lieân keát giöõa dialog vaø caùc thaønh phaàn khaùc
9.5 Söû duïng dialog laøm giao dieän chính cuûa öùng duïng
9.5.1 Thöïc hieän öùng duïng vôùi giao dieän chính laø dialog
9.5.2 Duøng MFC wizard taïo öùng duïng vôùi giao dieän dialog
9.6 Khai baùo bieán cho control treân dialog
9.7 Khai thaùc caùc tieän ích hoã trôï
CHÖÔNG 10 : KHUNG CÖÛA SOÅ GIAO DIEÄN CHÍNH
10.1 Khung cöûa soå giao dieän (Frame Window)
10.2 Thanh traïng thaùi (statusbar) & lôùp CStatusbar
10.3 Thanh coâng cuï (toolbar) & lôùp CToolBar
71
72
73
75
77
78
78
80
84
85
88
91
93
94
96
97
97
97
99
99
103
104
104
106
106
107
109
112
117
117
117
119
10.3.1 Thieát keá ToolBar resource
10.3.2 Duøng toolbar resource cho CToolBar cuûa FrameWnd
10.4 Lôùp CFrameWnd
10.5 Söû duïng frame window laøm giao dieän chính
10.5.1 Thöïc hieän öùng duïng vôùi giao dieän frame window
10.5.2 String Table vaø CFrameWnd
10.5.3 Duøng MFC wizard taïo öùng duïng giao dieän framewindow
CHÖÔNG 11 : CAÙC KIEÁN TRUÙC DOCUMENT – VIEW
11.1 CDocument
11.2 CView
11.3 CFrameWnd
11.4 CDoctemplate
11.5 Hoã trôï töø phía ñoái töôïng quaûn lyù öùng duïng
11.6 Trình töï taïo laäp caùc ñoái töôïng tham gia boä DVF
11.7 Text Document Appication
11.8 Rich Text Format (rtf) Document Appication
11.9 HTML Document View Appication
11.10 Moät soá lôùp view ñaëc bieät
11.10.1 CListView
11.10.2 CTreeView
11.10.3 CSplitterWnd
11.10.4 Söû duïng splitterwnd trong frame window
11.10.5 Caùc ví duï thöïc haønh
CHÖÔNG 12 : MOÄT SOÁ VAÁN ÑEÀ TRONG WINDOWS
12.1 Taäp tin INI
12.2 System Registry
12.3 Vuøng Status Area treân Taskbar
12.4 ÖÙng duïng ScreenSaver
12.4.1 Ñaëc ñieåm
12.4.2 Tham soá doøng leänh
12.4.3 Ñaëc ñieåm giao taùc vôùi ngöôøi duøng
12.4.4 Thöïc hieän öùng duïng ScreenSaver ñôn giaûn
12.5 ÖÙng duïng söû duïng nhieàu tieåu trình
12.5.1 Tieåu trình xöû lyù noäi
120
121
121
123
123
124
130
134
134
135
136
136
137
138
139
143
146
149
149
150
152
154
155
158
158
160
162
167
168
168
170
171
175
175
12.5.2 Tieåu trình giao dieän
12.5.3 Caùc haøm hoã trôï
12.6 Laäp trình Multimedia vôùi MCI
12.7 AÁn ñònh moät soá tính naêng cuûa Windows
12.8 Baãy (hook) message (Windows Hook)
12.8.1 Caùc kieåu hook (Hook Type)
12.8.2 Danh saùch hook (Hook Chain)
12.8.3 Thuû tuïc hook (Hook Procedure)
12.8.4 Caùc dòch vuï lieân quan hook
12.8.5 ÖÙng duïng hook messages cuûa keyboard
12.9 Caøi ñaët cheá ñoä thöïc hieän öùng duïng töï ñoäng
CHÖÔNG 13 : MFC VÔÙI INTERNET
13.1 Giao thöùc truyeàn thoâng TCP/IP
13.1.1 Giôùi thieäu
13.1.2 Kieán truùc cuûa giao thöùc TCP/IP treân moâ hình 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 Laäp trình TCP/IP vôùi Winsock
13.2.1 Port
13.2.2 Socket
13.2.3 Moät soá caáu truùc döõ lieäu cuûa Winsock API
13.2.4 Moät soá dòch vuï cuûa Winsock API
13.3 MFC vôùi laäp trình Winsock
13.3.1 Khôûi ñoäng Winsock
13.3.2 Lôùp CAsyncSocket
13.4 Laäp trình Winsock cho giao thöùc UDP
13.5 Laäp trình Winsock cho giao thöùc TCP
13.6 TCP vôùi SMTP (Simple Mail Transfer Protocol)
13.6.1 Qui öôùc giöõa öùng duïng göûi mail vaø nhaän mail
13.6.2 Thieát keá öùng duïng göûi mail
13.7 TCP vôùi Pop3 (Post Office Protocol – Version 3)
13.7.1 Qui öôùc giöõa öùng duïng mail client vaø mail server
177
179
179
181
182
183
183
183
184
185
186
187
187
187
187
189
190
191
192
194
197
197
198
198
199
200
200
200
204
207
215
215
217
219
219
13.7.2 Thieát keá öùng duïng nhaän mail
13.8 TCP vôùi HTTP vaø FTP
13.8.1 Lôùp CInternetSession
13.8.2 Lôùp CInternetFile
13.8.3 Lôùp CFtpConnection
13.8.4 Lôùp CFtpFindFile
13.8.5 Lôùp CHttpConnection
13.8.6 Lôùp CHttpFile
13.8.7 Thöïc hieän öùng duïng FTP client ñôn giaûn
13.8.8 Thöïc hieän öùng duïng HTTP client ñôn giaûn
Phuï luïc A: MOÄT SOÁ VAÁN ÑEÀ
LAÄP TRÌNH HÖÔÙNG ÑOÁI TÖÔÏNG
A.1 Laäp trình höôùng ñoái töôïng (OOP)
A.2 Caùc khaùi nieäm
A.2.1 Lôùp (Class)
A.2.2 Ñoái töôïng (Object)
A.2.3 Thuoäc tính (Attribute)
A.2.4 Haønh vi (Method)
A.2.5 Chöông trình (Program)
A.3 Ñaëc ñieåm laäp trình höôùng ñoái töôïng
A.4 Phaân loaïi thuoäc tính vaø haønh vi
A.5 Caùc haønh vi ñaëc bieät
A.6 Khai baùo lôùp, ñoái töôïng trong C++
A.6.1 Khai baùo lôùp
A.6.2 Khai baùo ñoái töôïng
A.6.3 Söû duïng ñoái töôïng trong chöông trình
A.7 Keá thöøa trong C++
A.7.1 Keá thöøa haønh vi taïo laäp
A.7.2 Keá thöøa haønh vi huûy boû
A.7.3 Thöïc hieän haønh vi lôùp cô sôû
A.8 Khai baùo haønh vi toaùn töû soá hoïc
A.9 Con troû this
A.10 Haønh vi virtual
A.11 Thuoäc tính vaø haønh vi tónh
220
223
223
224
225
227
228
229
231
232
234
234
234
234
234
234
235
235
235
236
236
236
236
238
238
239
239
240
240
241
243
243
244
LÔØI MÔÛ ÑAÀU Y
^
]
Z
Ngoân ngöõ laäp trình C++ ñöôïc bieát ñeán nhö laø moät trong nhöõng ngoân ngöõ
laäp trình maïnh nhaát nhôø khaû naêng cuûa noù trong vieäc trieån khai phaàn meàm
ôû caùc möùc ñoä khaùc nhau. Töø möùc heä thoáng ñeán möùc öùng duïng, töø laäp trình
caáu truùc ñeán laäp trình höôùng ñoái töôïng, töø laäp trình döïa treân thuaät giaûi ñeán
laäp trình trí tueä nhaân taïo, vaø töø laäp trình cô sôû döõ lieäu ñeán laäp trình cô sôû
tri thöùc…, baát cöù ñaâu, khi maø ngöôøi laäp trình muoán theå hieän yù töôûng khoa
hoïc vaø ngheä thuaät cuûa mình treân maùy tính thì C++ laø moät ñieàu nghó ñeán
tröôùc tieân.
Nhöng duø yù töôûng coù bay boång theá naøo ñi nöõa thì cuõng khoâng theå boû qua
vaán ñeà caøi ñaët maø moâi tröôøng cho öùng duïng laø ñieàu phaûi quan taâm. Vôùi xu
höôùng söû duïng heä ñieàu haønh Microsoft Windows nhö hieän nay, chuùng ta
buoäc phaûi nghó ñeán vieäc caøi ñaët öùng duïng cuûa mình trong moâi tröôøng naøy
vaø khai thaùc noù sao cho öùng duïng hoaït ñoäng hieäu quaû nhaát.
Microsoft Visual C++, saûn phaåm cuûa Microsoft, vôùi khaû naêng bieân dòch öu
vieät vaø loái khai thaùc heä thoáng roäng môû nhôø taäp hôïp lôùp thö vieän MFC cho
C++ coù ñaày ñuû caùc tieän ích giuùp chuùng ta veùt ñöôïc moïi ngoõ ngaùch cuûa
Windows haàu phuïc vuï cho öùng duïng cuûa mình.
Töø nhöõng nhaän ñònh noùi treân, cuoán saùch naøy ñöôïc thöïc hieän ñeå cuøng caùc
baïn baét ñaàu laøm quen laäp trình trong Windows aùp duïng kyõ thuaät laäp trình
höôùng ñoái töôïng vôùi C++, nhaèm khai thaùc hieäu quaû thö vieän MFC vaø töøng
böôùc du nhaäp vaøo theá giôùi tuyeät vôøi naøy thoâng qua caùc öùng duïng ñöôïc saép
xeáp theo caùc caáp ñoä tieán trieån phuø hôïp.
Trong laàn xuaát baûn ñaàu tieân, cuoán saùch naøy chaéc khoâng traùnh khoûi thieáu
soùt. Chuùng toâi raát mong tieáp thu yù kieán ñoùng goùp vaø trao ñoåi cuøng baïn ñoïc.
Cuoái cuøng, chuùng toâi xin chaân thaønh caûm ôn baïn beø, ñoàng nghieäp ñaõ cung
caáp nhöõng nhaän xeùt vaø kieán thöùc quí baùu ñeå thöïc hieän cuoán saùch naøy. Xin
caûm ôn caùc baïn hoïc vieân-sinh vieân, nhöõng ngöôøi ñaõ cuøng laøm vieäc vôùi
chuùng toâi qua noäi dung naøy vaø ñaõ coù nhöõng yù kieán khaùch quan giuùp chænh
söûa cuoán saùch kòp thôøi.
Thaønh phoá Hoà Chí Minh, ngaøy 19.11.2002
Taùc giaû
TAØI LIEÄU THAM KHAÛO
[1] Richard Simon, Windows 95 - Win32 Programming API-BIBLE,
Waite Group Press 1996.
[2] Jeff Prosise, Programming Windows 95 with MFC, Microsoft Press.
[3] M. Tracy, Professional Visual C++ ISAPI Programming, Wrox Press.
[4] Dr. GUI, Microsoft Developer Network - MSDN,
Microsoft Corporation Software.
[5] Dino Esposito,Visual C++ Windows Shell Programming, Wrox Press.
YX WZ
PHAÀN MEÀM CAÀN CAØI ÑAËT:
- Microsoft Visual C++ 6.0 hoaëc Microsoft Visual C++ .NET.
- MSDN ( Microsoft Developer Network ), baûn thaùng 10/2003.
MAÕ NGUOÀN:
Source Code cuûa caùc ví duï minh hoïa trong cuoán saùch naøy vaø cuûa moät soá
chöông trình troø chôi maø chuùng toâi mong muoán chia xeû cuøng baïn ñoïc
ñöôïc löu trong ñóa meàm ñính keøm, vaø coù theå download töø ñòa chæ:
http://thanh.andisw.com/?id=16&id2=85
WEB SITE:
Source Code ñaëc saéc cuûa nhieàu taùc giaû treân theá giôùi coù theå download:
- http://msdn.microsoft.com
- http://www.codeguru.com
- http://www.codeproject.com
- http://www.softechsoftware.it
- http://www.flipcode.com
- http://nps.vnet.ee
LIEÂN HEÄ:
- Taùc giaû: Leâ Ngoïc Thaïnh
- Cô quan: Khoa Tin Hoïc Quaûn Lyù, Tröôøng ÑHKT TP.HCM
Ñòa chæ: 279 Nguyeãn Tri Phöông Q10, TP.HCM.
- Ñòa chæ e-mail: [email protected]
Moät soá khaùi nieäm laäp trình trong moâi tröôøng Windows 1
CHƯƠNG 1:
M
ột s
ố khái ni
ệm L
ập trình
Trong môi trường Windows
1.1 CHƯƠNG TRÌNH (PROGRAM):
Chương trình máy tính là t
ập h
ợp các chỉ thị điều khi
ển ho
ạt động c
ủa
máy, được b
ố trí theo m
ột trình t
ự logic nh
ằm ph
ối h
ợp th
ực hi
ện m
ột
công vi
ệc xác định. Các chỉ thị được th
ể hi
ện dưới d
ạng mã ngu
ồn
(source code) hay mã máy (machine code). Chương trình mã máy có th
ể
th
ực hi
ện được trên máy có b
ộ l
ệnh tương thích, v
ới chương trình mã
ngu
ồn thì ph
ải s
ử d
ụng m
ột ứng d
ụng chuyên d
ụng để chuy
ển sang mã
máy trước khi th
ực hi
ện.
Vi
ệc chuy
ển các chỉ thị d
ạng mã ngu
ồn sang chỉ thị mã máy để th
ực
hi
ện được ti
ến hành b
ằng m
ột trong hai c
ơ ch
ế sau:
Thông dịch: M
ỗi chỉ thị mã ngu
ồn được chuy
ển sang chỉ thị mã máy
tương
ứng và được th
ực hi
ện ngay, sau
đó ti
ếp t
ục v
ới chỉ thị k
ế ti
ếp.
Biên dịch: T
ất c
ả các chỉ thị mã ngu
ồn được chuy
ển sang các chỉ thị
mã máy tướng
ứng. T
ập h
ợp các chỉ thị mã máy này g
ọi là chương
trình mã máy. Chương trình mã máy được l
ưu l
ại trong t
ập tin chương
trình và v
ề sau ta có th
ể th
ực hi
ện chúng m
ột cách độc l
ập trên máy.
1.2
ỨNG D
ỤNG (APPLICATION):
Khi m
ột chương trình được cài đặt trên máy tính để s
ử d
ụng, ta g
ọi đó
là
ứng d
ụng, ví d
ụ nh
ư
ứng d
ụng NotePad,
ứng d
ụng Microsoft Word,....
Trong môi trường windows, m
ỗi ứng d
ụng có th
ể được thi hành nhi
ều
lần thành nhi
ều b
ản khác nhau. M
ỗi b
ản
đang th
ực hi
ện c
ủa m
ột ứng
d
ụng g
ọi là th
ể hi
ện (instance) c
ủa
ứng d
ụng
đó.
1.3 TI
ẾN TRÌNH (PROCESS):
Ti
ến trình là khái ni
ệm chỉ m
ột instance
đang ho
ạt động c
ủa
ứng
d
ụng. Khi ta double-click trên bi
ểu tượng NotePad để ch
ạy
ứng d
ụng
này, ta có m
ột ti
ến trình c
ủa
ứng d
ụng NotePad.
1.4 TI
ỂU TRÌNH (THREAD):
Ti
ểu trình là m
ột nhánh x
ử lý độc l
ập trong ti
ến trình. Khi m
ột ứng
d
ụng được th
ực hi
ện ta có thêm m
ột ti
ến trình. Do b
ản ch
ất chương trình
làm nên
ứng d
ụng
đó bao g
ồm chương trình chính (main hay WinMain)
và các chương trình con mà ti
ến trình
ứng v
ới nó có th
ể tách thành các
nhánh x
ử lý: m
ột nhánh x
ử lý chính (primary thread), các nhánh x
ử lý ph
ụ
(other threads). Các nhánh x
ử lý này g
ọi là các ti
ểu trình. Có hai lo
ại ti
ểu
trình:
2 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - [email protected]
Ti
ểu trình giao di
ện (user-interface thread): Có nhi
ệm v
ụ x
ử lý các yêu
c
ầu c
ủa người dùng trong quá trình giao tác v
ới h
ọ.
Ti
ểu trình x
ử lý n
ội (worker thread): Có nhi
ệm v
ụ th
ực hi
ện các x
ử lý
tính toán bên trong, không tr
ực ti
ếp nh
ận yêu c
ầu c
ủa người dùng.
2 Th
ực ra, có th
ể xem ti
ểu trình giao di
ện nh
ư là m
ột ti
ểu trình x
ử lý n
ội
nh
ưng có tính n
ăng giao tác v
ới người s
ử d
ụng.
1.5 THÔNG ÐI
ỆP (MESSAGE):
Thông
điệp (message) là giá trị ph
ản ánh m
ột n
ội dung giao ti
ếp hay
yêu c
ầu x
ử lý gi
ữa h
ệ th
ống (windows) và
ứng d
ụng, gi
ữa các
ứng d
ụng
v
ới nhau ho
ặc gi
ữa các thành ph
ần trong cùng m
ột ứng d
ụng.
1.5.1 Ngu
ồn g
ốc message:
C
ả windows và
ứng d
ụng đều có th
ể phát sinh message.
Windows phát sinh message khi c
ần thông tin cho
ứng d
ụng các
ho
ạt động nh
ập-xu
ất (ho
ạt động gõ phím, di chuy
ển hay click chu
ột,
. c
ủa người dùng), các thay đổi c
ủa h
ệ th
ống (font ch
ữ, ch
ế độ phân
gi
ải màn hình, màu s
ắc,...) ho
ặc nh
ững bi
ến đổi khác liên quan đến
ứng d
ụng.
Ứng d
ụng phát sinh message khi x
ử lý
điều khi
ển các thành ph
ần
bên trong
ứng d
ụng ph
ối h
ợp th
ực hi
ện ch
ức n
ăng giao ti
ếp v
ới người
dùng, ho
ặc khi
ứng d
ụng th
ực hi
ện giao ti
ếp v
ới windows hay v
ới các
ứng d
ụng khác
đang th
ực hi
ện trong cùng h
ệ th
ống.
1.5.2 Các lo
ại message:
Message được định nghĩa bởi hệ thống: Là các message do h
ệ
điều
hành windows t
ạo ra nh
ằm ph
ục v
ụ ho
ạt động
điều khi
ển toàn b
ộ h
ệ
th
ống, x
ử lý thông tin vào-ra ho
ặc các thông tin khác cho
ứng d
ụng.
Khi có nhu c
ầu,
ứng d
ụng có th
ể s
ử d
ụng nh
ững message này để
phát động m
ột ch
ức n
ăng
điều khi
ển nào
đó c
ủa windows.
Message được định nghĩa bởi người dùng: Là các message do người
vi
ết ứng d
ụng định nghĩa nh
ằm t
ạo kênh liên l
ạc đặc thù gi
ữa các
thành ph
ần trong
ứng d
ụng, gi
ữa
ứng d
ụng v
ới windows ho
ặc v
ới
các
ứng d
ụng khác
đang th
ực hi
ện trong cùng h
ệ th
ống.
Moät soá khaùi nieäm laäp trình trong moâi tröôøng Windows 3
1.5.3
S
ố hi
ệu message (Message Indentifier - MessageID):
Có r
ất nhi
ều message khác nhau được s
ử d
ụng trong môi trường
windows.
Ứng v
ới m
ỗi message xác định, windows s
ử d
ụng m
ột giá trị
nguyên không âm để đặc t
ả, giá trị này g
ọi là s
ố hi
ệu message.
Các message do windows định nghĩa có s
ố hi
ệu được khai báo s
ẵn
và duy nh
ất v
ới các h
ằng s
ố xác định và tên g
ọi g
ợi nh
ớ c
ủa chúng có
d
ạng WM_xxx. Các messges do người dùng định nghĩa c
ũng ph
ải đăng
ký s
ố hi
ệu. S
ố hi
ệu đăng ký không được trùng l
ặp và có giá trị nh
ỏ nh
ất
b
ằng WM_USER (m
ột h
ằng s
ố do windows định nghĩa).
S
ố hi
ệu message là c
ơ s
ở để phân bi
ệt các message l
ẫn nhau.
1.5.4
Ð
ặc t
ả message:
Ð
ể đối tượng nh
ận message có thêm thông tin v
ề hoàn c
ảnh phát
sinh và ý nghĩa c
ụ th
ể c
ủa message, windows cho phép message được
nh
ận thông qua m
ột c
ấu trúc ch
ứa s
ố hi
ệu message và các thông s
ố
kèm theo. C
ấu trúc này được khai báo thành ki
ểu MSG v
ới n
ội dung nh
ư
sau:
typedef struct tagMSG {
HWND hwnd; // Giá trị có kích thước 4 bytes (long)
UINT message; // S
ố hi
ệu c
ủa message
WPARAM wParam; // Giá trị không âm có kích thước 2 bytes
LPARAM lParam; // Giá trị không âm có kích thước 4 bytes
DWORD time; // Th
ời điểm sinh ra messsge
POINT pt; // T
ọa độ cursor khi message được g
ửi.
} MSG;
Trường hwnd (window handle) c
ủa c
ấu trúc ch
ứa th
ẻ (handle) qu
ản lý
c
ửa s
ổ giao di
ện liên quan đến message. wParam và lParam là hai tham
s
ố g
ửi kèm theo message làm nhi
ệm v
ụ ch
ứa thông tin b
ổ sung. Hai
tham s
ố này được dùng khi message có nhi
ều ý nghĩa th
ực t
ế khác nhau.
) Windows s
ử d
ụng giá trị có kích thước 4 bytes để qu
ản lý các đối
tượng c
ủa nó. Giá trị này g
ọi là th
ẻ qu
ản lý đối tượng (object handle).
Ứng v
ới m
ỗi lo
ại đối tượng c
ụ th
ể, windows s
ử d
ụng m
ột ki
ểu handle
riêng. HWND là ki
ểu handle dùng qu
ản lý đối tượng c
ửa s
ổ giao di
ện
trong windows.
1.6
C
ỬA S
Ổ GIAO DI
ỆN (WINDOW) C
ỦA
ỨNG D
ỤNG:
C
ửa s
ổ giao di
ện là thành ph
ần quan tr
ọng trong vi
ệc t
ạo ra môi
trường giao di
ện đồ h
ọa c
ủa các
ứng d
ụng trong windows. Cùng v
ới s
ự
phát tri
ển c
ủa h
ệ
điều hành windows, hình
ảnh c
ửa s
ổ giao di
ện c
ũng
thay đổi theo v
ới chi
ều hướng sinh động h
ơn v
ề hình th
ức và phong phú
h
ơn v
ề ch
ức n
ăng. Ði
ều
đó không chỉ góp ph
ần t
ăng tính th
ẩm m
ỹ mà
4 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - [email protected]
còn t
ạo s
ự g
ần g
ũi h
ơn gi
ữa giao di
ện c
ủa
ứng d
ụng trong windows v
ới
người dùng.
D
ạng thông thường c
ủa m
ột c
ửa s
ổ giao di
ện trong windows:
System Menu Box: Ch
ứa bi
ểu tượng c
ủa
ứng d
ụng, là nút m
ở h
ộp
menu h
ệ th
ống v
ới các m
ục di chuy
ển, thay đổi kích thước ho
ặc
đóng
c
ửa s
ổ.
Caption bar: Thanh tiêu đề c
ủa
ứng d
ụng.
Menu bar: H
ệ th
ống menu v
ới các m
ục l
ựa ch
ọn x
ử lý.
Minimize / Maximize Box : Nút
điều khi
ển thu nh
ỏ / phóng to c
ửa s
ổ.
Restore Box : Nút khôi ph
ục kích thước trước
đó c
ủa c
ửa s
ố.
Border: Ðường vi
ền bao quanh c
ửa s
ổ.
Client area: Vùng làm vi
ệc c
ủa c
ửa s
ổ, dùng để hi
ển thị thông tin.
Scroll bar: Thanh cu
ộn n
ội dung vùng làm vi
ệc c
ủa c
ửa s
ổ.
Window Procedure: Ngoài giao di
ện đồ h
ọa, c
ửa s
ổ c
ủa windows có
kh
ả n
ăng ti
ếp nh
ận và x
ử lý message. Kh
ả n
ăng này được th
ực hi
ện
thông qua hàm x
ử lý message mà ta
đã g
ắn cho c
ửa s
ổ. Hàm x
ử lý
này có khai báo nh
ư sau:
LRESULT CALLBACK WindowProc (
HWND hwnd, // Tham s
ố ch
ứa Handle c
ủa c
ửa s
ổ liên
quan
UINT uMsg, // Tham s
ố ch
ứa s
ố hi
ệu message
WPARAM wParam, // Tham s
ố b
ổ sung th
ứ nh
ất ki
ểu WORD
LPARAM lParam // Tham s
ố b
ổ sung th
ứ hai ki
ểu LONG
) ; Hàm tr
ả v
ề m
ột giá trị có kích thước là 32 bits.
Khi m
ột yêu c
ầu x
ử lý được chuy
ển đến c
ửa s
ổ dưới d
ạng message,
hàm WindowProc
g
ắn v
ới c
ửa s
ổ s
ẽ c
ăn c
ứ trên s
ố hi
ệu message
(uMsg) để ch
ọn x
ử lý phù h
ợp. Theo nguyên t
ắc, n
ếu message được
x
ử lý hoàn t
ất thì hàm tr
ả v
ề giá trị 0, ngược l
ại (message không thu
ộc
Moät soá khaùi nieäm laäp trình trong moâi tröôøng Windows 5
kh
ả n
ăng x
ử lý c
ủa c
ửa s
ổ) hàm ph
ải chuy
ển message cho windows
x
ử lý thông qua l
ời g
ọi hàm x
ử lý message m
ặc nhiên c
ủa windows.
Hàm x
ử lý này có tên g
ọi là DefWindowProc
v
ới khai báo nh
ư sau:
LRESULT DefWindowProc( // Default Window Procedure
HWND hWnd, // V
ới các tham s
ố có ý nghĩa nh
ư trên
UINT Msg,
WPARAM wParam,
LPARAM lParam
) ;
Khi
đó, k
ết qu
ả tr
ả v
ề c
ủ
a DefWindowProc được dùng làm k
ết qu
ả
c
ủa hàm WindowProc. Qui t
ắc nói trên c
ần ph
ải được đảm b
ảo, n
ếu
không,
ứng d
ụng có th
ể làm r
ối lo
ạn ho
ạt động c
ủa h
ệ
điều hành
windows.
1.7 MESSAGE QUEUE:
Message queue là danh sách th
ứ t
ự các message do windows t
ạo ra
và được dùng để ch
ứa các message
đang ch
ờ được x
ử lý. Message
queue ho
ạt động theo nguyên t
ắc FIFO (First-In, First-Out: vào trước, ra
trước). Có hai lo
ại message queue trong windows:
Message queue của hệ thống (system queue): Ðược windows dùng
riêng cho vi
ệc l
ưu tr
ữ các messge đặc t
ả thông tin nh
ập-xu
ất liên quan
đến thi
ết bị ph
ần c
ứng trong quá trình h
ệ th
ống giao tác v
ới người
dùng.
Message queue của
ứng dụng (application queue): Ðược windows t
ạo
ra và c
ấp cho các th
ể hi
ện c
ủa
ứng d
ụng. Windows t
ự động
điều ph
ối
các message t
ừ system queue sang application queue m
ột cách phù
h
ợp, nh
ờ
đó m
ỗi ứng d
ụng có th
ể ti
ếp nh
ận và th
ực hi
ện các yêu c
ầu
x
ử lý c
ủa người dùng thông qua h
ệ th
ống. C
ơ ch
ế này ng
ăn các
ứng
d
ụng trong windows quy
ền truy c
ập tr
ực ti
ếp các thi
ết bị ph
ần c
ứng
c
ủa máy tính.
2 Vi
ệc truy c
ập message queue c
ủa
ứng d
ụng được th
ực hi
ện v
ới s
ự h
ỗ
tr
ợ c
ủa các hàm liên quan do windows cung c
ấp nh
ư sau:
Ch
ờ và l
ấy m
ột message t
ừ message queue c
ủa
ứng d
ụng:
BOOL GetMessage (
LPMSG lpMsg, // Con tr
ỏ đến bi
ến MSG nh
ận thông tin
HWND hWnd, // Handle c
ủa c
ửa s
ổ liên quan
UINT wMsgFilterMin, // S
ố hi
ệu message nh
ỏ nh
ất nh
ận được
UINT wMsgFilterMax // S
ố hi
ệu message l
ớn nh
ất nh
ận đượ
c
);
Hàm t
ự động ch
ờ đến khi phát hi
ện có message c
ần x
ử lý trong
message queue. Khi
đó, message vào trước nh
ất s
ẽ được l
ấy ra kh
ỏi
hàng ch
ờ và thông tin c
ủa nó được
điền vào bi
ến ki
ểu MSG chỉ b
ởi
6 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - [email protected]
con tr
ỏ tham s
ố plMSG. Khi
đã l
ấy được m
ột message, hàm k
ết thúc
và tr
ả v
ề m
ột giá trị nguyên. N
ếu message nh
ận được là message k
ết
thúc
ứng d
ụng (s
ố hi
ệu WM_QUIT) thì hàm tr
ả v
ề giá trị 0. Ngược l
ại,
hàm tr
ả v
ề giá trị khác 0.
Ki
ểm tra và l
ấy m
ột message trong message queue c
ủa
ứng d
ụng:
BOOL PeekMessage(
LPMSG lpMsg; // . Nh
ư GetMessage
HWND hWnd;
UINT wMsgFilterMin;
UINT wMsgFilterMax;
UINT wRemoveMsg; // Có th
ực hi
ện xóa message không ?
// PM_NOREMOVE: không xóa
);
Hàm tr
ả v
ề giá trị 0 n
ếu message queue r
ỗng. Ngược l
ại, hàm tr
ả v
ề
m
ột giá trị khác không và thông tin v
ề message được
điền vào bi
ến
ki
ểu MSG được chỉ b
ởi tham s
ố ki
ểu con tr
ỏ lpMSG.
Di
ễn dịch message c
ủa bàn phím sang mã phím ASCII:
BOOL TranslateMessage(
CONST MSG *lpMsg; // con tr
ỏ đến bi
ến ch
ứa message
);
Tham s
ố lpMsg là con tr
ỏ chỉ đến bi
ến ki
ểu MSG ch
ứa n
ội dung đặc
tả message được l
ấy t
ừ message queue và c
ần di
ễn dịch.
Hàm tr
ả v
ề giá trị khác 0 n
ếu message nh
ận được tương
ứng v
ới m
ột
thao tác trên bàn phím (nh
ấn phím: WM_KEYDOWN,
WM_SYSKEYDOWN; thôi nh
ấn phím: WM_KEYUP,
WM_SYSKEYUP) ho
ặc m
ột message có ý nghĩa tương đương mà
vi
ệc di
ễn dịch sang mã phím ASCII là thành công. Khi
đó hàm t
ự động
tạo message WM_CHAR cho phím di
ễn dịch được. Trong các trường
h
ợp khác, hàm tr
ả v
ề giá trị 0.
Moät soá khaùi nieäm laäp trình trong moâi tröôøng Windows 7
Ðiều phối message đến cửa sổ giao diện chính:
Cửa sổ giao diện chính của ứng dụng có thể tiếp nhận và xử lý
message thông qua hàm WindowProc của nó (1.6). Như vậy, ta có
thể điều phối message lấy từ message queue của ứng dụng đến cho
cửa sổ chính xử lý. Việc điều phối được thực hiện thông qua hàm sau:
LRESULT DispatchMessage(
CONST MSG *lpmsg; // Con trỏ đến biến chứa message
);
Tham số lpMSG chỉ đến biến kiểu MSG chứa thông tin đặc tả
message được điều phối. Hàm điều phối sẽ chờ đến khi hàm xử lý
message WindowProc của cửa sổ chính xử lý xong messge, và lấy
giá trị kết thúc của hàm này làm giá trị trả về của chính nó.
) Quá trình tiếp nhận và điều phối xử lý message từ message queue
của ứng dụng được tiến hành liên tục cho đến khi nhận được message
kết thúc ứng dụng (WM_QUIT). Quá trình này có tên gọi là vòng lặp
nhận và điều phối message (MessageLoop). Ðoạn chương trình nhận
và điều phối message trong ứng dụng được cài đặt như sau:
MSG msg; // biến chứa nội dung đặc tả message nhận được
while( GetMessage( &msg, NULL, 0, 0 ) != 0 ) {
// Nếu message nhận được không phải là WM_QUIT
TranslateMessage(&msg); // Diễn dịch nếu là phím
DispatchMessage(&msg); // Ðiều phối cho cửa sổ chính.
}
1.8 KIẾN TRÚC XỬ LÝ CỦA ỨNG DỤNG TRONG WINDOWS:
Khi ứng dụng được thực hiện, windows tạo thêm một tiến trình cho thể
hiện mới của ứng dụng, đồng thời xây dựng một message queue dùng
riêng cho thể hiện này. Tiểu trình chính của tiến trình được tạo ra có
nhiệm vụ thực hiện MessageLoop trên message queue dành cho ứng
dụng, đồng thời khởi tạo các giao diện và tiểu trình hỗ trợ (nếu cần).
2 Các cách xử lý của tiểu trình chính khi nắm quyền điều khiển ứng
dụng:
Không thực hiện xử lý nào cả: Ứng dụng kết thúc.
Thực hiện MessageLoop nhưng không tạo cửa sổ giao diện chính:
Ứng dụng chờ nhận message nhưng người dùng không giao tác được.
Khởi tạo một cửa sổ với hàm xử lý message WindowProc và chọn cửa
sổ này làm cửa sổ giao diện chính: Hàm WindowProc của cửa sổ sẽ
tiếp nhận và xử lý message được điều phối từ MessageLoop của tiểu
trình chính. Người dùng có thể giao tác và kết thúc ứng dụng được.
Như mục thứ ba, đồng thời tạo ra các tiểu trình phục vụ: Ứng dụng có
khả năng tiếp nhận và thực hiện đồng thời nhiều yêu cầu xử lý.
8 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - [email protected]
Kiến trúc xử lý chung của ứng dụng trong môi trường windows
1.9 RESOURCE CỦA ỨNG DỤNG:
Ðối với một chương trình trong windows, ngoài phần mã lệnh của các
hàm xử lý, resource là một thành phần không kém phần quan trọng chứa
các nội dung hỗ trợ cho việc trang trí hoặc phục vụ cho một mục đích đặc
biệt của ứng dụng. Các nội dung phổ biến trong resource như sau:
Cursor: Ảnh nhỏ đặc tả vị trí làm việc của thiết bị liên quan như
mouse, pen, trackball. Khi người dùng tác động lên những thiết bị này
thì windows sử dụng cursor để phản ánh hiện tượng đó.
Bitmap: Tập ảnh điểm (pixels) của một ảnh. Các ảnh điểm này bố trí
theo các dòng và phối hợp làm nên hình ảnh của đối tượng.
Dialog: Thông tin mô tả khung giao diện với các đối tượng nhập liệu
bên trong, là cơ sở để tạo ra các hộp hội thoại trong ứng dụng.
Icon : Ảnh nhỏ được dùng để đặc tả chức năng của một đối tượng,
ứng dụng hay một nội dung dữ liệu.
HTML (Hypertext Markup Language): Ngôn ngữ dùng tạo ra những tài
liệu dạng văn bản với những ký pháp và kỹ thuật định dạng mà trình
duyệt tương ứng có thể thể hiện một cách xúc tích.
Moät soá khaùi nieäm laäp trình trong moâi tröôøng Windows 9
Menu : Một danh sách các lựa chọn xử lý mà người dùng có thể chọn
nhằm thực hiện một xử lý xác định
String Table: Bảng chứa các chuỗi được đánh dấu phân biệt bởi các
số hiệu và được sử dụng như các thông báo trong chương trình. Việc
sử dụng String Table giúp ứng dụng dễ dàng thay đổi ngôn ngữ giao
diện của nó mà không cần phải có sự chỉnh sửa trên phần mã lệnh.
ToolbarBitmap: Tập các ảnh con xác định các nút được cài đặt trên
thanh công cụ của cửa sổ hay hộp hội thoại trong ứng dụng. Mỗi nút
này là một mục chọn (có thể thay thế mục chọn của menu) giúp tạo ra
các message lệnh (WM_COMMAND) với số hiệu phân biệt để có thể
ấn định xử lý cần thiết.
Version: Phần khai báo các thông tin liên quan đến ứng dụng, tác giả.
Font: Chứa thông tin về bộ font chữ được lưu trong tập tin fnt.
Custom Resource: Bao gồm các nội dung không thuộc các loại nội
dung resource chuẩn nói trên. Người dùng có thể tùy ý cài vào
resource của ứng dụng, đồng thời phải tự cài đặt xử lý thích hợp cho
các resource này trong chương trình.
10 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - [email protected]
CHƯƠNG 2:
Th
ư vi
ện MFC c
ủa microsoft
&
ứng d
ụng c
ơ b
ản trong windows
2.1 TH
Ư VI
ỆN MFC (MICROSOFT FOUNDATION CLASS):
Th
ư vi
ện MFC c
ủa Microsoft bao g
ồm các l
ớp c
ơ b
ản, cài đặt b
ằng
ngôn ng
ữ C++, h
ỗ tr
ợ vi
ệc l
ập trình trong môi trường windows. T
ừ các l
ớp
này, MFC xác l
ập n
ền t
ảng hình thành
ứng d
ụng c
ủa windows, bao g
ồm
vi
ệc định nghĩa b
ộ khung
ứng d
ụng, các công c
ụ chu
ẩn và ph
ổ bi
ến để
b
ổ sung vào b
ộ khung nói trên nh
ằm t
ạo ra
ứng d
ụng hoàn chỉnh. V
ới
MFC, công vi
ệc c
ủa người l
ập trình chỉ còn là vi
ệc l
ựa ch
ọn các thành
ph
ần c
ần thi
ết,
điều chỉnh và ph
ối h
ợp chúng h
ợp lý để có được
ứng
d
ụng k
ết qu
ả mong mu
ốn.
L
ập trình windows v
ới MFC và MicroSoft Visual C++ 6.0 (VC) đạt
được hi
ệu qu
ả cao b
ởi không chỉ khai thác được phiên b
ản m
ới nh
ất c
ủa
MFC mà còn nh
ận được nhi
ều ti
ện nghi l
ập trình mà VC cung c
ấp. Ðây là
con đường ng
ắn và đơn gi
ản, đặc bi
ệt v
ới người t
ự h
ọc, để vi
ết ứng d
ụng
windows.
2.2 TI
ẾP C
ẬN MFC:
MFC là th
ư vi
ện kh
ổng l
ồ v
ới kho
ảng 200 l
ớp đối tượng mà vi
ệc hi
ểu
rõ và v
ận d
ụng chúng trong m
ột kho
ảng th
ời gian ng
ắn là không th
ể
được. M
ục tiêu c
ủa chúng ta là hi
ểu và v
ận d
ụng nh
ững thành ph
ần ph
ổ
bi
ến nh
ất c
ủa th
ư vi
ện để xây d
ựng
ứng d
ụng thông thường. Khi
đã có
kh
ả n
ăng nh
ất định v
ề s
ử d
ụng MFC thì v
ới tài li
ệu MSDN, s
ẽ ch
ẳng khó
kh
ăn gì trong vi
ệc m
ở r
ộng khai thác th
ư vi
ện để
ứng d
ụng tr
ở nên m
ạnh
m
ẽ và tinh t
ế h
ơn.
Trong nh
ững ph
ần trình bày sau, chúng ta s
ẽ l
ần lượt ti
ếp nh
ận h
ệ
th
ống n
ội dung h
ơi n
ặng tính lý thuy
ết để đảm b
ảo c
ấu trúc ki
ến th
ức, và
ph
ần th
ực hành ph
ối h
ợp s
ẽ giúp chúng ta ki
ểm nghi
ệm và hi
ểu rõ v
ấn
đề.
2.3
T
ẠO
ỨNG D
ỤNG WINDOWS V
ỚI MFC NH
Ư TH
Ế NÀO ?:
Theo mô hình ki
ến trúc
ứng d
ụng windows
ở m
ục (1.8), vi
ệc gi
ải quy
ết
v
ấn đề trên chính là vi
ệc th
ực hi
ện tr
ả l
ời các câu h
ỏi sau
đây:
Làm th
ế nào t
ạo đối tượng ti
ểu trình chính c
ủa
ứng d
ụng ?
Làm th
ế nào t
ạo đối tượng giao di
ện c
ủa
ứng d
ụng ?
Qu
ản lý tương tác gi
ữa đối tượng
ứng d
ụng và đối tượng giao di
ện ?
B
ằng vi
ệc xem xét các l
ớp MFC liên quan s
ẽ giúp l
ần lượt lý gi
ải các
câu h
ỏi được đặt ra. Ti
ếp theo, chúng ta tìm hi
ểu xem nh
ững l
ớp nào
c
ủa MFC giúp khai báo đối tượng ti
ểu trình trong
ứng d
ụng.
Thö vieän MFC cuûa Microsoft & öùng duïng cô baûn trong windows 11
2.4
L
ỚP QU
ẢN LÝ TI
ỂU TRÌNH CWinThread:
CWinThread là m
ột l
ớp c
ủa MFC, l
ớp đối tượng qu
ản lý ti
ểu trình được
tạo ra trong ti
ến trình c
ủa m
ột ứng d
ụng
đang được th
ực hi
ện. Ti
ểu trình
được qu
ản lý có th
ể là là ti
ểu trình giao di
ện ho
ặc ti
ểu trình x
ử lý n
ội. Các
dịch v
ụ c
ơ b
ản ph
ục v
ụ cho qu
ản lý ti
ểu trình do CWinThread cung c
ấp
thông qua các thu
ộc tính và hành vi c
ủa nó.
DWORD m_nThreadID : Thu
ộc tính l
ưu s
ố hi
ệu c
ủa ti
ểu trình.
CWnd* m_pMainWnd : L
ưu con tr
ỏ đối tượng c
ửa s
ổ giao di
ện
chính c
ủa ti
ểu trình. Khi c
ửa s
ổ giao di
ện chính ch
ấm d
ứt ho
ạt
động, ti
ểu trình liên quan s
ẽ k
ết thúc. N
ếu ti
ểu trình thu
ộc lo
ại ti
ểu
trình x
ử lý n
ội thì giá trị này k
ế th
ừa t
ừ ti
ểu trình giao di
ện c
ấp cao
h
ơn.
CWinThread( ); Hành vi t
ạo l
ập (constructor) đối tượng ti
ểu trình.
virtual BOOL InitInstance( ); Kh
ởi t
ạo thông s
ố cho đối tượng ti
ểu
trình và đảm nh
ận các x
ử lý b
ổ sung khác c
ủa
ứng d
ụng. Ð
ối v
ới
ti
ểu trình giao di
ện, hành vi này được dùng để kh
ởi t
ạo đối tượng
c
ửa s
ổ giao di
ện và gán địa chỉ c
ủa đối tượng c
ửa s
ổ cho
m_pMainWnd.
virtual int ExitInstance( ); Hành vi k
ết thúc c
ủa đối tượng ti
ểu trình.
Thông qua hành vi này, đối tượng qu
ản lý ti
ểu trình th
ực hi
ện hoàn
tr
ả các tài nguyên c
ủa h
ệ th
ống mà nó
đã đăng ký s
ử d
ụng.
virtual int Run( ); Hành vi dành riêng cho ti
ểu trình giao di
ện, nó
th
ực hi
ện vòng l
ặp nh
ận message, chuy
ển message cho hành vi
PreTranslateMessage c
ủa l
ớp. N
ếu hành vi này tr
ả v
ề giá trị 0 thì
message s
ẽ ti
ếp t
ục được chuy
ển đến các hàm di
ễn dịch phím
TranslateMessage và hàm
điều ph
ối message DispatchMessage.
virtual BOOL PreTranslateMessage(MSG *pMsg); Hành vi cho
phép can thi
ệp trước trên các message nh
ận được t
ừ message
queue c
ủa
ứng d
ụng. Thông qua
đó, ti
ểu trình giao di
ện có th
ể th
ực
hi
ện các ti
ền x
ử lý message đặc tr
ưng nh
ằm
đáp
ứng yêu c
ầu đặt
ra cho
ứng d
ụng.
) Khi CWinThread được dùng để quản lý đối tượng tiểu trình chính thì
hàm WinMain (cài sẵn bên trong lớp bởi thư viện MFC) tự động thực
hiện các hành vi InitInstance(), Run() và ExitInstance() theo thứ tự.
12 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - [email protected]
2.5
L
ỚP QU
ẢN LÝ TI
ỂU TRÌNH GIAO DI
ỆN CHÍNH CWinApp:
CWinApp, k
ế th
ừa t
ừ CWinThread, là l
ớp đối tượng chuyên dùng qu
ản
lý ti
ểu trình giao di
ện chính c
ủa
ứng d
ụng.
Ứng d
ụng windows chỉ được
phép s
ử d
ụng m
ột đối tượng thu
ộc l
ớp này. Ngoài các thu
ộc tính, hành vi
k
ế th
ừa public t
ừ CWinThread, CWinApp có các thu
ộc tính và hành vi b
ổ
sung sau:
const char* m_pszAppName: L
ưu chu
ỗi tên c
ủa
ứng d
ụng.
LPTSTR m_lpCmdLine: L
ưu n
ội dung chu
ỗi tham s
ố dòng l
ệnh.
Tham s
ố dòng l
ệnh là toàn b
ộ ph
ần n
ội dung mà người dùng gõ
vào ngay sau chu
ỗi đường d
ẫn và tên chương trình
ứng d
ụng khi
h
ọ th
ực hi
ện
ứng d
ụng. Ð
ối v
ới ứng d
ụng có nhi
ều ch
ế độ ho
ạt
động khác nhau thì vi
ệc s
ử d
ụng tham s
ố dòng l
ệnh là m
ột c
ơ ch
ế
xác l
ập các giao ước gi
ữa
ứng d
ụng và người dùng để ch
ọn ch
ế độ
s
ử d
ụng
ứng d
ụng thích h
ợp.
int m_nCmdShow: L
ưu giá trị thông s
ố
đã được dùng để kích ho
ạt
c
ửa s
ổ giao di
ện chính c
ủa
ứng d
ụng.
CWinApp( ); T
ạo l
ập đối tượng ti
ểu trình chính.
HCURSOR LoadCursor( int nID ); N
ạp cursor t
ừ resource c
ủa
ứng
d
ụng vào b
ộ nh
ớ (n
ếu cursor ch
ưa được n
ạp). nID là s
ố hi
ệu c
ủa
cursor. Hàm tr
ả v
ề giá trị handle qu
ản lý cursor. Giá trị này có ki
ểu
HCURSOR (handle of cursor) mà windows dùng để qu
ản lý cursor.
HICON LoadIcon ( int nID ); N
ạp icon t
ừ resource c
ủa
ứng d
ụng
vào b
ộ nh
ớ. nID là s
ố hi
ệu c
ủa icon. Hàm tr
ả v
ề giá trị handle qu
ản
lý icon. Giá trị này có ki
ểu HICON (handle of icon).
Hành vi hi
ển thị h
ộp thông báo và ch
ờ nh
ận ý ki
ến người dùng:
virtual int DoMessageBox (
LPCTSTR lpszPrompt, // N
ội dung thông báo
UINT nType, // D
ạng h
ộp thông báo
UINT hlpIndex = 0 // S
ố hi
ệu m
ục giúp đỡ (WinHelp)
);
Hành vi này được kích ho
ạt v
ới tham s
ố tương
ứng m
ỗi khi trong
chương trình s
ử d
ụng hàm AfxMessageBox để hi
ển thị h
ộp thông
báo.
int AfxMessageBox (
LPCTSTR lpszPrompt, UINT nType, UINT hlpIndex = 0
);
nType: Ấn định d
ạng h
ộp thông báo. Giá trị này là s
ự k
ết h
ợp gi
ữa
thông s
ố qui định bi
ểu tượng hi
ển thị và các nút ch
ọn b
ố trí trong
h
ộp.
• Các thông số qui định các nút chọn bố trí trong hộp thông báo:
Giá trị thông s
ố Nút ch
ọn b
ố trí trong h
ộp
Thö vieän MFC cuûa Microsoft & öùng duïng cô baûn trong windows 13
MB_OK OK
MB_OKCANCEL OK - Cancel
MB_YESNO Yes - No
MB_YESNOCANCEL Yes - No - Cancel
MB_ABORTRETRYIGNORE Abort - Retry - Ignore
MB_RETRYCANCEL Retry - Cancel
• Các thông số qui định biểu tượng dùng trong nút chọn:
Giá trị thông s
ố Bi
ểu tượng
MB_ICONHAND, MB_ICONSTOP,
MB_ICONERROR
MB_ICONQUESTION
MB_ICONEXCLAMATION, MB_ICONWARNING
MB_ICONASTERISK, MB_ICONINFORMATION
• Số hiệu các nút chọn được sử dụng trong hộp thông báo:
S
ố hi
ệu Nút ch
ọn
S
ố hi
ệu Nút ch
ọn
IDABORT
Abort IDOK
OK
IDCANCEL
Cancel IDRETRY
Retry
IDIGNORE Ignore IDYES
Yes
IDNO
No
• Hành vi DoMessageBox ch
ờ người s
ử d
ụng tr
ả l
ời b
ằng cách
ch
ọn m
ột nút ch
ọn xác định trong h
ộp thông báo. Hành vi k
ết
thúc v
ới giá trị tr
ả v
ề là s
ố hi
ệu c
ủa nút được ch
ọn. K
ế th
ừa hành
vi này để ch
ặn và th
ực hi
ện x
ử lý đặc tr
ưng (s
ử d
ụng d
ạng h
ộp
thông báo riêng) cho t
ất c
ả các l
ời g
ọi AfxMessageBox trong
ứng d
ụng.
• Hàm AfxMessageBox s
ử d
ụng DoMessageBox để hi
ển thị h
ộp
thông báo và l
ấy giá trị c
ủa hành vi này làm k
ết qu
ả tr
ả v
ề c
ủa
nó.
Ví d
ụ: AfxMessageBox( "Chao Ban", MB_ICONSTOP | MB_OK, 0 );
) Hàm trên th
ực hi
ện hi
ển thị h
ộp thông báo v
ới n
ội dung là
"Chao Ban" , bi
ểu tượng
đi kèm, và nút ch
ọn OK k
ết thúc.
14 Laäp trình Windows vôùi MFC - Microsoft Visual C++ 6.0 - Leâ Ngoïc Thaïnh - [email protected]
2.6 THỰC HIỆN ỨNG DỤNG ÐƠN GIẢN:
Trong phần này, chúng ta thực hiện ứng dụng với đối tượng thuộc lớp
CWinApp quản lý tiểu trình chính. Ðặt tên cho dự án của ứng dụng là
VD0.
Các bước thực hiện dự án VD0 như sau:
Khởi động windows với hệ điều hành Win95 hoặc bản mới hơn.
Tạo mới một thư mục để chứa các dự án. Ví dụ C:\VC6.
Thực hiện ứng dụng Microsoft Visual C++ 6.0 (VC).
Chọn mục File / New từ hệ thống menu của VC.
Trong hộp hội thoại New, chọn trang Projects :
- Win32 Application : Loại ứng dụng thực hiện.
- Location : Ðường dẫn thư mục của dự án.
- Project Name : Tên dự án.
Sau đó chọn OK.
Tiếp theo, trong hộp hội thoại Step 1 of 1.
- An empty project : Tạo dự án rỗng.
- Finish : Hoàn tất việc khởi tạo dự án.
Thö vieän MFC cuûa Microsoft & öùng duïng cô baûn trong windows 15
VC hiển thị hộp hội thoại New Project Information để thông báo
các thông tin liên quan đến dự án vừa tạo. Chọn OK.
) Một dự án đã được tạo ra trên đĩa. Với thông tin nhập như trên,
dự án mới tạo ra có tên là VD0, toàn bộ phần chương trình
nguồn của dự án được lưu trong thư mục VD0 thuộc thư mục
C:\VC6.
Tiếp tục thực hiện các bước sau để hoàn tất dự án theo yêu cầu.
Ðăng ký sử dụng lớp CWinApp của thư viện MFC: Lớp CWinApp
được khai báo trong afxwin.h của MFC. Bổ sung tập tin stdafx.h
vào dự án và dùng tập tin này đăng ký các thư viện cần thiết của
MFC.
Việc bổ sung tập tin stdafx.h vào dự án được tiến hành như sau:
• Chọn mục File / New từ hệ thống menu của VC.
• Trong hộp hội thoại New, chọn trang Files:
- C/C++ Header File : Loại nội dung tập tin (.h).
- Add To Project : Bổ sung tập tin vào dự án VD0.
- File Name : Tên tập tin (StdAfx.h)
Chọn OK, tiếp tục thực hiện các công việc sau.
• Soạn thảo tập tin stdafx.h, nhập các định hướng biên dịch và
các chỉ thị sử dụng thư viện MFC cần cho dự án: