Tải bản đầy đủ (.pdf) (133 trang)

Tài liệu Lập trình Window với MFC ppt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.23 MB, 133 trang )


































:

1.1 Chương trình ( Program )
1.2 Ứng dụng ( Application )
1.3 Tiến trình ( Process )
1.4 Tiểu trình (Thread )
1.5 Thông điệp ( Message )
1.5.1 Nguồn gốc của message
1.5.2 Các loại message
1.5.3 Số hiệu message (Message Indentifier – MessageID)
1.5.4 Đặc tả message
1.6 Cửa sổ giao diện (window) của ứng dụng
1.7 Message queue
1.8 Kiến trúc xử lý của ứng dụng trong Windows
1.9 Resource của ứng dụng

:

2.1 Thư viện MFC (Microsoft Foundation Class)
2.2 Tiếp an MFC
2.3 Tạo ứng dụng windows với MFC như thế nào ?
2.4 Lớp quản lý tiểu trình CwinThread
2.5 Lớp quản lý tiểu trình giao diện chính CwinApp
2.6 Thực hiện ứng dụng đơn giản
2.7 Thực hiện ứng dụng giao tác đơn giản
2.8 Tạo mới Icon Resource cho ứng dụng
2.9 Lưu trữ chương trình nguồn
2.10 Lớp Cstring của MFC


:
3.1 Các công cụ giao diện đồ họa
3.2 Device Context
3.3 Tọa độ trên giao diện đồ họa
3.4 Các lớp MFC hỗ trợ GDI
3.4.1 Các lớp đối tượng điểm, hình chữ nhậ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

:
4.1 Cửa sổ giao diện
4.2 Lớp CWnd
4.3 Sử dụng đối tượng CWnd
4.3.1 Sử dụng CWnd làm giao diện chính của ứng dụng
4.3.2 Ứng dụng chỉ chạy một bản (instance) tại mỗi thời điểm

:
5.1 Lớp xử lý message CCmdTarget:

5.2 Khai báo mục xử lý message trong MessageMap
5.3 Các lớp kế thừa CCmdTarget
5.4 MessageMap của lớp kế thừa CWnd trong ứng dụng
5.4.1 Cửa sổ của ứng dụng có chức năng hoạt động
5.4.2 WM_PAINT và hành vi OnPaint của CWnd

:
6.1 DC và BITMAP
6.2 Ứng dụng với cửa sổ chính hiển thò ảnh
6.3 Sao chép ảnh từø DC đến DC, phóng to & thu nhỏ ảnh
6.4 DC trong bộ nhớ ( DC ảo) – vùng vẽ đệm lý tưởng
6.5 Ảnh chuyển động trong vùng client
6.6 CImageList – công cụ quản lý bộ ảnh cùng cỡ
6.7 CRgn – Cửa sổ có hình dạng tùy ý

:
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ử dụng menu resource
7.4 Mục xử lý command message từ mục chọn của menu
7.5 Phím tắt (hot key ) cho mục chọn trên menu
7.6 Lớp quản lý menu – CMenu
7.7 Xử lý điều khiển mục chọn của menu


:

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

:
9.1 Hộp hội thoại (Dialog)
9.2 Lớp CDialog
9.3 Tạo và sử dụng dialog trong chương trình
9.3.1 Tạo dialog resource
9.3.2 Khai báo lớp kế thừa CDialog sử dụng dialog resource
9.3.3 Sử dụng dialog trong chương trình
9.4 Liên kết giữa dialog và các thành phần khác
9.5 Sử dụng dialog làm giao diện chính của ứng dụng
9.5.1 Thực hiện ứng dụng với giao diện chính là dialog
9.5.2 Dùng MFC wizard tạo ứng dụng với giao diện dialog
9.6 Khai báo biến cho control trên dialog
9.7 Khai thác các tiện ích hỗ trợ

:
10.1 Khung cửa sổ giao diện (Frame Window)
10.2 Thanh trạng thái (statusbar) & lớp CStatusbar
10.3 Thanh công cụ (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 Thiết kế ToolBar resource
10.3.2 Dùng toolbar resource cho CToolBar của FrameWnd
10.4 Lớp CFrameWnd
10.5 Sử dụng frame window làm giao diện chính
10.5.1 Thực hiện ứng dụng với giao diện frame window
10.5.2 String Table và CFrameWnd
10.5.3 Dùng MFC wizard tạo ứng dụng giao diện framewindow

:
11.1 CDocument
11.2 CView
11.3 CFrameWnd
11.4 CDoctemplate
11.5 Hỗ trợ từ phía đối tượng quản lý ứng dụng
11.6 Trình tự tạo lập các đối tượng tham gia bộ DVF
11.7 Text Document Appication
11.8 Rich Text Format (rtf) Document Appication
11.9 HTML Document View Appication
11.10 Một số lớp view đặc biệt
11.10.1 CListView
11.10.2 CTreeView
11.10.3 CSplitterWnd
11.10.4 Sử dụng splitterwnd trong frame window
11.10.5 Các ví dụ thực hành


:
12.1 Tập tin INI
12.2 System Registry
12.3 Vùng Status Area trên Taskbar
12.4 Ứng dụng ScreenSaver
12.4.1 Đặc điểm
12.4.2 Tham số dòng lệnh
12.4.3 Đặc điểm giao tác với người dùng
12.4.4 Thực hiện ứng dụng ScreenSaver đơn giản
12.5 Ứng dụng sử dụng nhiều tiểu trình
12.5.1 Tiểu trình xử lý nộ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 Tiểu trình giao diện
12.5.3 Các hàm hỗ trợ
12.6 Lập trình Multimedia với MCI
12.7 Ấn đònh một số tính năng của Windows
12.8 Bẫy (hook) message (Windows Hook)
12.8.1 Các kiểu hook (Hook Type)
12.8.2 Danh sách hook (Hook Chain)
12.8.3 Thủ tục hook (Hook Procedure)
12.8.4 Các dòch vụ liên quan hook
12.8.5 Ứng dụng hook messages của keyboard
12.9 Cài đặt chế độ thực hiện ứng dụng tự động


:
13.1 Giao thức truyền thông TCP/IP
13.1.1 Giới thiệu
13.1.2 Kiến trúc của giao thức TCP/IP trên mô 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 Lập trình TCP/IP với Winsock
13.2.1 Port
13.2.2 Socket
13.2.3 Một số cấu trúc dữ liệu của Winsock API
13.2.4 Một số dòch vụ của Winsock API
13.3 MFC với lập trình Winsock
13.3.1 Khởi động Winsock
13.3.2 Lớp CAsyncSocket
13.4 Lập trình Winsock cho giao thức UDP
13.5 Lậ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 dụng gửi mail và nhận mail
13.6.2 Thiết kế ứng dụng gửi mail
13.7 TCP với Pop3 (Post Office Protocol – Version 3)
13.7.1 Qui ước giữa ứng dụng mail client và 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 Thiết kế ứng dụng nhận mail
13.8 TCP với HTTP và 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 hiện ứng dụng FTP client đơn giản
13.8.8 Thực hiện ứng dụng HTTP client đơn giản

:

A.1 Lập trình hướng đối tượng (OOP)
A.2 Các khái niệm
A.2.1 Lớp (Class)
A.2.2 Đối tượng (Object)
A.2.3 Thuộc tính (Attribute)
A.2.4 Hành vi (Method)
A.2.5 Chương trình (Program)
A.3 Đặc điểm lập trình hướng đối tượng
A.4 Phân loại thuộc tính và hành vi
A.5 Các hành vi đặc biệt
A.6 Khai báo lớp, đối tượng trong C++
A.6.1 Khai báo lớp
A.6.2 Khai báo đối tượng
A.6.3 Sử dụng đối tượng trong chương trình
A.7 Kế thừa trong C++
A.7.1 Kế thừa hành vi tạo lập
A.7.2 Kế thừa hành vi hủy bỏ

A.7.3 Thực hiện hành vi lớp cơ sở
A.8 Khai báo hành vi toán tử số học
A.9 Con trỏ this
A.10 Hành vi virtual
A.11 Thuộc tính và hà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


x}(|y

Ngôn ngữ lập trình C++ được biết đến như là một trong những ngôn ngữ
lập trình mạnh nhất nhờ khả năng của nó trong việc triển khai phần mềm
ở các mức độ khác nhau. Từ mức hệ thống đến mức ứng dụng, từ lập trình
cấu trúc đến lập trình hướng đối tượng, từ lập trình dựa trên thuật giải đến
lập trình trí tuệ nhân tạo, và từ lập trình cơ sở dữ liệu đến lập trình cơ sở
tri thức…, bất cứ đâu, khi mà người lập trình muốn thể hiện ý tưởng khoa
học và nghệ thuật của mình trên máy tính thì C++ là một điều nghó đến
trước tiên.

Nhưng dù ý tưởng có bay bổng thế nào đi nữa thì cũng không thể bỏ qua
vấn đề cài đặt mà môi trường cho ứng dụng là điều phải quan tâm. Với xu
hướng sử dụng hệ điều hành Microsoft Windows như hiện nay, chúng ta
buộc phải nghó đến việc cài đặt ứng dụng của mình trong môi trường này
và khai thác nó sao cho ứng dụng hoạt động hiệu quả nhất.


Microsoft Visual C++, sản phẩm của Microsoft, với khả năng biên dòch ưu
việt và lối khai thác hệ thống rộng mở nhờ tập hợp lớp thư viện MFC cho
C++ có đầy đủ các tiện ích giúp chúng ta vét được mọi ngõ ngách của
Windows hầu phục vụ cho ứng dụng của mình.

Từ những nhận đònh nói trên, cuốn sách này được thực hiện để cùng các
bạn bắt đầu làm quen lập trình trong Windows áp dụng kỹ thuật lập trình
hướng đối tượng với C++, nhằm khai thác hiệu quả thư viện MFC và từng
bước du nhập vào thế giới tuyệt vời này thông qua các ứng dụng được sắp
xếp theo các cấp độ tiến triển phù hợp.


Trong lần xuất bản đầu tiên, cuốn sách này chắc không tránh khỏi thiếu
sót. Chúng tôi rất mong tiếp thu ý kiến đóng góp và trao đổi cùng bạn đọc.
Cuối cùng, chúng tôi xin chân thành cảm ơn bạn bè, đồng nghiệp đã cung
cấp những nhận xét và kiến thức q báu để thực hiện cuốn sách này. Xin
cảm ơn các bạn học viên-sinh viên, những người đã cùng làm việc với
chúng tôi qua nội dung này và đã có những ý kiến khách quan giúp chỉnh
sửa cuốn sách kòp thời.
Thành phố Hồ Chí Minh, ngày 19.11.2002
Tác giả


[1]
,
Windows 95 - Win32 Programming API-BIBLE
,
Waite Group Press 1996.
[2]
,

Programming Windows 95 with MFC
, Microsoft Press.
[3]
,
Professional Visual C++ ISAPI Programming
, Wrox Press.
[4]
,
Microsoft Developer Network - MSDN
,
Microsoft Corporation Software.
[5]
,
Visual C++ Windows Shell Programming
, Wrox Press.

xw(vy

:
- Microsoft Visual C++ 6.0 hoặc Microsoft Visual C++ .NET.
- MSDN ( Microsoft Developer Network ), bản tháng 10/2003.

:
Source Code của các ví dụ minh họa trong cuốn sách này và của một số
chương trình trò chơi mà chúng tôi mong muốn chia xẻ cùng bạn đọc
được lưu trong đóa mềm đính kèm, và có thể download từ đòa chỉ:





:
Source Code đặc sắc của nhiều tác giả trên thế giới có thể download:
-

-

-

-
-

-


:
- Tác giả: Lê Ngọc Thạnh
- Cơ quan: Khoa Tin Học Quản Lý, Trường ĐHKT TP.HCM
Đòa chỉ
: 279 Nguyễn Tri Phương Q10, TP.HCM.
- Đòa chỉ e-mail:


Một số khái niệm lập trình trong môi trường Windows 1
:

M
   

1.1
:

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 chun 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 
 :
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 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 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 (
hay )
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 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -
̇ Tiu trình giao din (user-interface thread): Có nhim v x lý các u
cu ca ngi dùng trong q 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 tốn bên trong, khơng trc tip nhn u cu ca ngi dùng.
Q 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) là giá tr phn ánh mt ni dung giao tip hay
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
 
:
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
 :
̇
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 tồ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.
Một số khái niệm lập trình trong môi trường Windows 3
1.5.3 S  :
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

ngun 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 Ð
  :
Ð ụi tng nhn message có thêm thơng tin v hồ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
{
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.
} ;

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

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.
H 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
      :
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 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -
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
: Ngồ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
(
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 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 ngun tc, nu message ục
x lý hồn tt thì hàm tr v giá tr 0, ngc li (message khơng thuc
Một số khái niệm lập trình trong mô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
( // 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 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 ngun 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 q 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 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.

Q 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

(
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 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -
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 ngun. 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
(

LPMSG
lpMsg
; // . Nh
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
(
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.
Một số khái niệm lập trình trong mô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
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
(
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ó.

H Q 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). Q 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
; // 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
     :
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).
Q 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 u cu x lý.

8 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -
    




1.9
  
Ði vi mt chng trình trong windows, ngồ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:
̇
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 ụó.
̇
: 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.
̇
: 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.
̇
: 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.
̇
(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.
Một số khái niệm lập trình trong môi trường Windows 9
̇ : 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
̇
: 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.
̇
: 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.
̇
: Phn khai báo các thơng tin liên quan ụn ng dng, tác gi.
̇
: Cha thơng tin v b font ch ục lu trong tp tin .
̇
: 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 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -
:

  
   

2.1
 
:
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 hồ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
  :
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
      :
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ư viện MFC của Microsoft & ứng dụng cơ bản trong windows 11

2.4 L
   :
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

: Thuc tính lu s hiu ca tiu trình.
̇ CWnd*
: 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.
̇
( ); Hành vi to lp (constructor) ụi tng tiu trình.
̇ virtual BOOL
( ); 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
.
̇ virtual int
( ); 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 hồn
tr các tài ngun ca h thng mà nó ụã ụng ký s dng.
̇ virtual int
( ); 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

(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 u cu ụt
ra cho ng dng.

H
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 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -
2.5 L    :
CWinApp, k tha t CWinThread, là lp ụi tng chun 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. Ngồ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*
: Lu chui tên ca ng dng.
̇ LPTSTR

: Lu ni dung chui tham s dòng lnh.
Tham s dòng lnh là tồ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
: 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.
̇
( ); To lp ụi tng tiu trình chính.
̇ HCURSOR
( 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
( 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
(
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
(
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.

   
:
Giá tr thơng s Nút chn b trí trong hp

Thư viện MFC của Microsoft & ứng dụng cơ bả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


  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     
:

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 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 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -
2.6      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
.

̇ Thc hin ng dng Microsoft Visual C++ 6.0 (VC).
̇ Chn mc
/ t h thng menu ca VC.
̇ Trong hp hi thoi
, chn trang
Projects
:



-
: Loi ng dng thc hin.
-
: Ðng dn th mc ca d án.
-
: Tên d án.
Sau ụó chn
.

̇ Tip theo, trong hp hi thoi
.
-
: To d án rng.
-
: Hồn tt vic khi to d án.
Thư viện MFC của Microsoft & ứng dụng cơ bản trong windows 15
̇ VC hin th hp hi thoi ụ thơng báo
các thơng tin liên quan ụn d án va to. Chn
.
H

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, tồ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 ụ hồn tt d án theo 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
ca MFC. B sung tp tin
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
/ t h thng menu ca VC.
• Trong hp hi thoi
, chn trang :



-
: Loi ni dung tp tin (.h).
-
: B sung tp tin vào d án VD0.
-
: Tên tp tin ( )
Chn , tip tc thc hin các cơng vic sau.


• Son tho tp tin
, 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:
16 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -

#if !defined( _DU_AN_0_ )
#define _DU_AN_0_

// _DU_AN_0_ giúp trình dch khơng thc hin lp ch th
#include


#include <afxwin.h> // th vin chun ca MFC
#endif
Sau khi nhp xong ni dung tp tin , chn mc /
(hoc click biu tung
trên thanh cơng c) ụ lu tp tin.
̇ To tp tin
ca d án: Tp tin này cha khai báo
ca các resource ục s dng trong ng dng. Khi biên dch, các
resource này s ục nhúng vào tp tin chng trình (.EXE). Các
bc to tp tin
trong d án nh sau:
• Chn mc
/ . Trong hp hi thoi , chn trang
.

-
: Loi ni dung tp tin (.rc).

-
: B sung tp tin vào d án.
- : Tên tp tin, trùng vi tên ca d án.
Sau ụó chn .
• Ðng ký các h tr ca MFC cho thao tác trên resource: Vic
ụng ký này là c s to quan h gia các ni dung ca
Thư viện MFC của Microsoft & ứng dụng cơ bản trong windows 17
resource và ụi tng lp trình tng ng ca MFC trong d án.
Thc hin nh sau:
- Right-click trên mc tên resource (
):



- Chn mc
:


Chn các mc nh trên, gõ phím
ụ kt thúc.
• Son tho resource: D án
cha cn s dng resource, tp
tin resource script s tm thi b trng. Chn mc
/ ,
và ụóng màn hình son tho resource ụ kt thúc bc này.
̇ Chn phiên bn biên dch: Có hai phiên bn biên dch chng
trình.

: Biên dch chng trình vi thơng tin
debug.


: Phiên bn ụem giao, khơng cha thơng
tin debug.
Chn mc
/ :

Chn phiên bn biên dch ( chng hn
). Chn .
18 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -
̇ n ụnh biên dch vi th vin MFC: Chn mc /



Trong hp hi thoi
,
-
: : Chn phiên bn n ụnh (ví d: Win32 Debug ),
-
: Các n ụnh chung cho d án.
: Cách liên kt th vin MFC vào
ng dng. Có th tùy chn mt trong hai cách sau:
Ÿ Use MFC in Shared DLL
: Chng trình s dng th vin
MFC theo c ch liên kt ụng. Tp tin chng trình có kích
thc nh nhng khi thc hin cn có các tp tin th vin
(DLL) ca MFC trong th mc h thng ca windows.
Ÿ Use MFC in Static Library
: Th vin MFC ục nhúng vào
chng trình trong lúc biên dch. Tp tin chng trình có kích
thc ln hn nhng ng dng có th hot ụng ục lp.

Sau khi n ụnh xong, chn
.
̇ Khai báo ụi tng thuc lp CWinApp: Dùng bt k tp tin CPP
nào ca d án ụ thc hin cơng vic này. Vì d án VD0 ụang thc
hin  ụây cha có tp tin CPP, chúng ta to mi tp tin CPP cho
d án. Gi s tp tin CPP này có tên là MAIN.CPP. Cách thc hin
nh sau:
• Chn mc
/ . Trong hp hi thoi , chn trang
:
Thư viện MFC của Microsoft & ứng dụng cơ bản trong windows 19

-
: Loi ni dung tp tin (.cpp).
-
: B sung tp tin vào d án.
-
: Tên tp tin (MAIN). Sau ụó chn .
• Trong màn hình son tho ca
, nhp ni dung tp tin:
#include "stdafx.h" // Tp tin cha ụng ký th vin ca MFC
CWinApp ; // Ði tng qun lý tiu trình chính
Sau khi nhp xong, chn mc / ụ lu tp tin.
̇ Biên dch chng trình: Chn mc
/
hoc chn mc trên thanh cơng c.
Ta ụã thc hin xong mt ng dng ụn gin trong mơi trng
windows. Tp tin chng trình ục lu trong th mc DEBUG
(phiên bn biên dch debug) hoc RELEASE (phiên bn biên dch
release).

̇ Chy chng trình: Có th chy chng trình trc tip trong VC
bng cách nhn phím F5 hoc click chn
trên thanh cơng c.

 : ng dng VD0 khơng thc hin mt giao tác hay cơng vic
gì c bi nó ch là mt ng dng khung - ục xây dng hồn tồn t
lp CWinApp ca MFC mà khơng có mt x lý b sung nào.
2.7
     N
:
20 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -
Trong phn này ta thit k mt ng dng mà khi thc hin s hin th
hp thơng báo "
Do You want to Stop
" vi biu tng và các nút chn
YES- NO. ng dng kt thúc khi ngi dùng chn mc YES.
Nhn xét
: ng dng ch hồn thành cơng vic xác ụnh khi ụi tng
qun lý tiu trình chính ca ng dng tin hành x lý thích hp. Ði tng
này thuc lp k tha t lp CWinApp vi x lý b sung nhm thc hin
cơng vic mong mun. Hành vi
ca CWinApp là hành vi
thích hp cho vic k tha và thc hin các b sung này.
Gi s d án ca ng dng có tên là
. Các bc thc hin nh
sau:
̇ To d án VD01 theo các bc nh d án VD0 nhng dng li 
bc "
 
" (khơng thc hin

bc này). Tip tc thc hin các bc sau ụây.
̇ To mi lp
k tha t CWinApp: M màn hình
ca d án (nu cha m) bng cách chn mc menu
/ hoc click chn biu tng trên thanh cơng c.
• Chn trang
:


• Right-click trên mc
, chn .
• Khai báo lp CEmpApp thơng qua hp hi thoi
.
Thư viện MFC của Microsoft & ứng dụng cơ bản trong windows 21

Ÿ
=
Generic Class
: Chn loi lp thơng thng vì
MFC khơng h tr lp CWinApp trong ClassWizard ca nó.
Ÿ
=
CEmpApp
: Tên ca lp mi.
Ÿ
: n ụnh tên tp tin cha khai báo (.h) và cài ụt
(.cpp) ca lp CEmpApp ( nên trùng vi tên ca d án :
):



Sau ụó chn
.
Ÿ
=
CWinApp
: Chn CWinApp làm lp c s.
Ÿ
=
public
: K tha public. Chn ụ kt thúc.
• Lp CEmpApp ụã ục b sung vào d án VD01 cùng vi hai
tp tin là VD01.H và VD01.CPP:
Ÿ
: Cha ni dung khai báo (header) ca lp.
Ÿ
: Cha ni dung cài ụt (implement) ca lp.
Có th m và chnh sa ni dung các tp tin ca lp bng cách
thao tác trc tip trên cu trúc
ca màn hình
.
22 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -

• Ðiu chnh lp
ụ nhn ục h tr ca ClassWizard:
Ÿ M tp tin
cha khai báo ca lp, b sung các ni
dung:

class CEmpApp : public CWinApp {
public: ();

virtual ~ ();

//{{AFX_VIRTUAL(CEmpApp)
//}}AFX_VIRTUAL //
H tr k tha hành vi o


//{{AFX_MSG(CEmpApp)
//}}AFX_MSG //
H tr n ụnh x lý
message

DECLARE_MESSAGE_MAP() //
Ðng ký MessageMap
}

Lu ý
: và là ký pháp s dng ca ClassWizard.

Ÿ M tp tin
cha cài ụt ca lp, b sung ni
dung:

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

BEGIN_MESSAGE_MAP(CEmpApp, CWinApp)
//{{AFX_MSG_MAP(CEmpApp) //
Bng message map,


//}}AFX_MSG_MAP //
s ụ cp ụn  các

END_MESSAGE_MAP() //
phn sau


Phn b sung
B sung
Thư viện MFC của Microsoft & ứng dụng cơ bản trong windows 23
̇ Khi to thơng tin : Thao tác này là c s ụ khai thác
tin ích ca ClassWizard trong vic ụnh ngha lp, khai báo thơng
tin k tha, n ụnh x lý message, ụnh ngha bin,.
• Chn menu
/ :



• Chn
:



Chn
, sau ụó chn .
• Trong hp hi thoi
, Chn ụ kt thúc.
Thơng tin
ục lu trong tp tin có cùng tên vi tên
ca d án và phn m rng là .

.
̇ K tha hành vi
ca lp CWinApp cho lp .
Dùng hành vi này cài ụt x lý b sung nh u cu ca ng dng:
24 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -
• Trong màn hình ca d án, chn , right-
click trên tiêu ụ ca lp
:



• Chn mc




• Chn hành vi
, sau ụó chn mc .
• Trong phn son tho ni dung ca hành vi
thuc
lp
, ta cài ụt ụon chng trình x lý sau:

BOOL CEmpApp::
()
{
Thư viện MFC của Microsoft & ứng dụng cơ bản trong windows 25
UINT stop; //
Bin kim tra ụng ý dng?



do {
stop = AfxMessageBox( "Do You want to stop",
MB_YESNO | MB_ICONQUESTION, 0 );
} while (stop == IDNO ); //
Tip tc lp nu chn NO

return TRUE; // X
 lý tin hành bình thng

}

̇ Dùng lp CEmpApp khai báo ụi tng qun lý tiu trình chính ca
ng dng: M tp tin ca lp CEmpApp, b sung ni
dung:

#include "stdafx.h"
#include "Emp.h"
CEmpApp ; // Ði tng kiu CEmpApp, dùng qun lý
// tiu trình chính ca ng dng.
// Khơng chnh sa các ni dung khác!

̇ Biên dch và chy chng trình.

2.8 T
    :
Ði vi ng dng trong windows, icon khơng ch là hình nh trang trí
ụn thun mà còn là yu t gi nh v ng dng tt nht. Windows s
dng icon ca ng dng ụ ụi din cho ng dng  tt c nhng ni nào
mà ngi dùng có th nhìn thy và khai thác ng dng.


       

̇ M d án trong VC.
̇ M màn hình Workspace ca d án, chn trang ResourceView.
right-click trên tiêu ụ resource ca d án.



26 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -
̇ Chn mc ...



̇ Chn mc
, sau ụó chn :
Ta nhn ục màn hình thit k icon. V icon có ni dung tùy ý.


̇ n ụnh các thơng s
thuc tính ca icon (s
hiu icon, tên th mc
và tên tp tin cha
icon) trong d án: Chn
trong
ca d án,
rigth-click trên icon mi
thêm.
Chn mc
.

Thư viện MFC của Microsoft & ứng dụng cơ bản trong windows 27
̇ Thc hin n ụnh thơng s ca icon thơng qua hp hi thoi sau:



-
ID
: S hiu icon. là s hiu qui c
dùng cho icon chính ca ng dng.
- : Tên tp tin cha icon. là th mc con s ục
to trong th mc d án ụ cha các tp tin
resource.
Sau khi n ụnh xong, gõ phím
ụ kt thúc.
̇ Ðóng màn hình thit k icon resource.
̇ Biên dch d án. Dùng
xem tp tin VD01.exe
trong th mc debug ca d án. Lúc này, ng dng VD01 ụã có
icon riêng.

2.9 L
  N:
Sau khi hồn tt d án, mt vic rt thng xun là lu gi li
chng trình ngun ca d án. Cơng vic này ụòi hi phi loi b khi
th mc d án các tp tin khơng cn thit. Ðó là các tp tin sau:
̇ Th mc d án : Các tp tin .NCB, .PLG, .OPT, .APS.
̇ Th mc Debug : Tt c các tp tin, tr tp tin .exe cn gia li.
̇ Th mc Release : Tt c
 các tp tin, tr tp tin .exe cn gia
li.


2.10 L
  :
CString là lp ụi tng ca MFC cho phép qun lý mt ni dung
chui trong b nh vi nhng ục tính u vit sau:
- Ni dung chui lu tr có ụ dài ln vi c ch s dng b nh ti
u.
- Xây dng da trên kiu TCHAR nên thích nghi vi b mã
UNICODE.
- Các hành vi x lý sn sàng cho các tác v chui thơng thng.
Mt s hành vi ục s
dng ph bin ca CString nh sau:
̇
( ); Hành vi to lp ụi tng chui.
̇ int ( ) const; Tr v s ụo chiu dài chui.
28 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -
̇ void ( ); Xóa rng ni dung ụi tng chui.
̇ BOOL
( ) const; Tr v TRUE nu ni dung chui là rng.
̇ TCHAR operator
( int
nIndex
) const; Tr v ký t  v trí
nIndex
.
̇ void
( int
nIndex
, TCHAR
ch

); Ðt ký t
ch
vào v trí
nIndex
.
̇ operator
( ) const; Chuyn v kiu chui ca C.
̇ CString::operator =
; Phép tốn gán chui cho ụi tng.
̇ CString::operator +
; Phép tốn cng chui.
̇ CString::operator
; Phép tốn ni chui mi vào ụi tng.
̇ CString Comparison
; Trong ụó là phép tốn
quan h thơng thng nh: == , < , <= , > , >= , !=.
̇ CString
( int
nFirst
[, int
nCount
] ) const; Trích chui con gia.
̇ CString
( int
nCount
) const; Trích chui con bên trái.
̇ CString
( int
nCount
) const; Trích chui con bên phi.

H
nCount
là chiu dài (s ký t) ca chui con ục trích ra.
̇ void
( ) / void ( ); Vit hoa / thng ni
dung.
̇ void
( LPCTSTR
lpszFormat
, ... ); To ni dung cho chui.
̇ void
( ) / void ( ); Hy khong trng trái / phi.
̇ BOOL
( UINT
nID
); Gán ni dung cho chui bi mt
hng chui trong string table resource.
nID
là s hiu ca hng
chui.

 :
1
. Vit ng dng cho phép hin th ụng dn ụn tp tin chng trình và
chui tham s dòng lnh thc thi nó.
2. Vit ng dng có cài ụt DoMessageBox sao cho hàm
AfxMessageBox s dng trong ng dng hin th hp thơng báo vi icon
riêng ca ng dng.
HD
: S dng hàm: int ( LPMSGBOXPARAMS

pMsg

);
typedef struct {
UINT cbSize; // Kích thc, = sizeof( MSGBOXPARAMS )
HWND hwndOwner; // Handle ca ca s cha, có th = NULL
HINSTANCE hInstance; // Handle ng dng =
AfxGetInstanceHandle()
LPCTSTR lpszText; // Ni dung chui thơng báo
LPCTSTR lpszCaption; // Ni dung chui tiêu ụ
DWORD dwStyle; // Dng hp, cha thơng s MB_USERICON
LPCTSTR lpszIcon; // Chui tên icon ục hin tr trong hp
DWORD_PTR dwContextHelpId; // S hiu giúp ụ
MSGBOXCALLBACK lpfnMsgBoxCallback; // Hàm x lý
DWORD dwLanguageId; // S hiu ngơn ng s dng
} , * ;
Các lớp giao diện đồ họa của MFC 29
:

   

3.1
   A:
Ð h tr ng dng trong vic trang trí giao din ụ ha (Graphic
Device Interface - GDI) nh màn hình, máy in., windows cung cp mt
h thng các cơng c ụ ha c bn nh sau:
̇
Pen
: Cơng c v ụim hoc ụng thng.
̇

Brush
: Cơng c tơ màu.
̇
Font
: Cơng c qui ụnh kiu ký t cho ni dung vn bn.
̇
Bitmap
: Cơng c qun lý vùng nh ụim.
̇
Palette
: Cơng c qun lý b màu hin th.
̇
Region
: Cơng c qun lý vùng hin th có dng bt k.
Thơng qua các cơng c nói trên, ng dng trong windows có th thc
hin các tác v ụ ha c bn mt cách d dàng mà khơng phi bn tâm
ụn cu trúc vt lý ca thit b hin th. Các cơng c này gi là cơng c
GDI.

3.2
:
Vic khai thác kh nng ca các cơng c GDI ục thc hin thơng
qua mt cu trúc cha thơng tin qun lý thit b hin th: Device Context
(DC). Ti mi thi ụim, mi DC ục phép gn vi mt thit b hin th
ụ ha và s dng mt b các cơng c GDI duy nht. Mun s dng mt
cơng c GDI mi thì DC phi chm dt s d
ng cơng c tng ng mà
nó ụang dùng.
Mi khi mt DC ục to mi, h thng t ụng chun b mt b cơng
c GDI (tr bitmap) mc nhiên cho nó. ng dng có th tùy nghi thay ụi

các cơng c này cho phù hp vi nhu cu ca ng dng.

3.3. T
    A:
Vic ụnh v trên giao din ụ ha ục thc hin da trên h trc ta
ụ có gc (0,0) là góc trái-trên (top-left corner) ca giao din ụ ha,
chiu dng ca trc hồnh (trc x) hng t trái sang phi, chiu dng
ca trc tung (trc y) hng t trên xung di. Trên mt phng giao
din ụ ha ụó:
̇ Ðim: Biu din bng cp ta ụ (x,y).
̇ Hình ch nht: Biu din bng cp ụnh góc trái trên và góc phi
di.
Thơng tin v ụim, vùng hình ch nht và kích thc ca các ụi
tng trong mt phng giao din ụ ha ục ục t thơng qua các cu
trúc sau:
30 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -
̇ Cu trúc qun lý 1 ụim:
typedef struct _POINT {
int
x
,
y
// Ta ụ ( hồnh ụ, tung ụ ) ca ụim
}
;
̇ Cu trúc qun lý 1 vùng hình ch nht
:
typedef struct _RECT {
int
top

,
left
; // Ta ụ góc trái trên hình ch nht.
int
right
,
bottom
; // Ta ụ góc phi di hình ch nht.
}
;
̇ Cu trúc qun lý chiu rng và chiu cao vùng hình ch nht
:
typedef struct _SIZE {
int
cx
,
cy
; // Chiu rng, chiu cao vùng hình ch
nht.
}
;

3.4
   :
MCF cung cp mt h thng phong phú các lp vi ụy ụ chc nng
nhm h tr ngi dùng ti ụa trong lp trình GDI. Vi vic vn dng k
thut OOP trên các lp GDI ca MFC, ngi dùng d dàng to ra ng
dng mong mun mà khơng phi vit q nhiu mã lnh trong chng
trình.


3.4.1
 ụi  t:
̇
: Lp ụi tng ụim, tng ng vi cu trúc POINT.
̇
: Lp ụi tng vùng hình ch nht trên giao din ụ ha,
tng ng vi cu trúc RECT. CRect có các hành vi ục trng sau:

( ); To lp ụi tng vùng hình ch nht rng.

(int
left
, int
top
, int
right
, int
bottom
); To lp ụi tng
vùng hình ch nht có thơng s xác ụnh.
• int
( ) const; Tr v ụ rng vùng hình ch nht.
• int
( ) const; Tr v ụ cao vùng hình ch nht.
• void
( ); Hp lý hóa các thành phn ta ụ ca
rect mà khơng làm thay ụi v trí và kích thc ca nó.
VD
: Gi s khi to mt rect khơng hp l nh sau:
CRect rect( 100

, 0, 0, 50 ); // rect.left = 100 > rect.right = 0
rect. NormalizeRect();
rect tr nên hp l vi: rect ( 0
, 0, 100, 50 );

̇
: Lp ụi tng kích thc, tng ng vi cu trúc SIZE.

3.4.2 L
 :
CPen là lp ụi tng qun lý
pen
, mt cơng c GDI quan trng ca
DC. Thơng qua ụi tng này, DC có th thay ụi màu sc, nét v ca
Các lớp giao diện đồ họa của MFC 31
ụim hay ụng thng mà DC s trc hin. CPen có các hành vi ục
trng sau:
̇
( ); To lp ụi tng pen rng. Chúng ta phi khi to tham
s cho ụi tng này trc khi s dng.
̇
( // To lp ụi tng pen vi tham s
int
nPenStyle
, // Kiu nét v
int
nWidth
, // Ð rng nét v (=1: mc nhiên)
COLORREF
crColor

// Màu sc ca nét v
);
nPenStyle
có th nhn mt trong các giá tr sau:
PS_SOLID : PS_DASH :
PS_DOT : PS_DASHDOT :
crColor c
ó th nhn giá tr t macro phi màu RGB( ) nh sau:
RGB (int
màu_ụ
, int
màu_xanh_lá_cây
, int
màu_xanh_dng

)
Mi màu ục ục trng bng mt giá tr trong ụon 0255 phn
ánh ụ sáng ca nó. B phi màu theo qui tc phi màu t
nhiên.
̇ BOOL
( int
nPenStyle
, int
nWidth
, COLORREF
crColor

); Khi to thơng s cho ụi tng pen. Ý ngha tham s nh trên.
̇ operator HPEN() const; Tốn t chuyn kiu, tr v handle ca
pen (HPEN) qun lý bi ụi tng.


3.4.3 L
 :
CBrush là lp ụi tng qun lý brush, cơng c GDI ca DC. Thơng
qua ụi tng này, DC có th thay ụi màu sc, dng ca nét tơ trong
mt vùng hình ch nht mà DC s trc hin. CBrush có các hành vi ục
trng sau:
̇
( ); To lp ụi tng brush rng.
̇
( COLORREF
crColor
); To lp ụi tng brush có màu tơ
tng ng vi màu qui ụnh bi tham s
crColor
.
̇
( int
nIndex
, COLORREF
crColor
); To lp ụi tng brush
có màu tơ
crColor
, và nét tơ
nIndex
.
Giá tr nét tơ có th là: HS_VERTICAL (ụng k sc ụng),
HS_HORIZAONTAL (ụng k sc ngang).
̇ BOOL

( COLORREF
crColor
); To ục tính tơ
ục vi màu
crColor
cho ụi tng brush cha có thơng s.
̇ operator HBRUSH() const; Tốn t chuyn kiu, tr v handle ca
brush (HBRUSH) qun lý bi ụi tng.

3.4.4 L
p :
CFont là lp ụi tng qun lý font, cơng c GDI ca DC. Thơng qua
ụi tng này, DC thc hin n ụnh font, kiu dáng, kích thc ca b ký
32 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -
t ục s dng cho vic hin th các ni dung vn bn. Các hành vi ục
trng:
̇
( ); To lp ụi tng font rng.
̇
(const LOGFONT*
lpLogFont
); To lp ụi tng font vi
thơng s ụy ụ. Giá tr thơng s ục n ụnh bi tham s kiu
cu trúc LOGFONT cha thơng tin. LOGFONT ục khai báo nh
sau:
typedef struct tagLOGFONT {
LONG
lfHeight
; // chiu cao ca ký t
LONG

lfWidth
; // chiu rng trung bình các ký t
LONG
lfEscapement
; // góc (1/10) gia hng in và trc X
LONG
lfOrientation
; // góc (1/10) gia ký t và trc X (No 9x)
LONG
lfWeight
; // mc ụ ụm ca font ch (0 - 1000)
BYTE
lfItalic
; // = TRUE : Ch nghiêng
BYTE
lfUnderline
; // = TRUE : Ch gch di
BYTE
lfStrikeOut
; // = TRUE : Ch gch ngang thân
BYTE
lfCharSet
; // b ký t (=DEFAULT_CHARSET )
BYTE
lfOutPrecision
; // = OUT_DEFAULT_PRECIS
BYTE
lfClipPrecision
; // = CLIP_DEFAULT_PRECIS
BYTE

lfQuality
; // = DEFAULT_QUALITY
BYTE
lfPitchAndFamily
; // =DEFAULT_PITCH|FF_DONTCARE
TCHAR
lfFaceName
[LF_FACESIZE]; // Chui tên ca font
} ;
H Win9x ch dùng
lfEscapement
.
̇ int
( LOGFONT *
pLogFont
); Ly thơng tin ca font
qun lý bi ụi tng font ch. Kt qu ục ụin vào bin kiu
LOGFONT ch bi tham s kiu con tr LOGFONT* :
pLogFont
.
̇ operator HFONT( ); Tốn t chuyn kiu, tr v handle ca font
ục qun lý bi ụi tng.
̇ BOOL
( LOGFONT *
lpLogFont
); Khi to thơng
s cho ụi tng font t thơng tin lu trong cu trúc ch bi
lpLogFont
.


3.4.5 L
p :
CBitmap là lp ụi tng qun lý bitmap, mt cơng c GDI quan trng
giúp qun lý vùng nh ụim (pixels) ca DC. Thơng qua ụi tng này,
DC có th d dàng to ni dung trang trí trên giao din ụ ha t ni
dung nh có sn ục lu trong tp tin, ụng thi thc hin các tác v x
lý nh c bn trên ni dung ụó. CBitmap cung cp các hành vi ục trng
sau:
̇
( ); To lp ụi tng bitmap rng.
Các lớp giao diện đồ họa của MFC 33
̇ BOOL ( UINT
nIDResource
); To ni dung cho ụi
tng bitmap vi thơng tin ục ly t mt nh trong resource.
nIDResource
: s hiu ca nh bitmap trong resource ca chng
trình.
̇ BOOL
(
CDC*
pDC
, // Con tr ụi tng DC tng ng
int
nWidth
, // Chiu rng,
int
nHeight
// chiu cao tính bng pixel ca bitmap ục to.
); To ni dung cho ụi tng bitmap vi thơng tin v màu sc, ụ

phân gii tng ng vi DC ch bi con tr tham s
pDC
.
̇ int
( BITMAP*
pBitMap
); Ly thơng tin v bitmap ục
qun lý bi ụi tng. Kt qu nhn ục s ục ụin vào bin có
kiu BITMAP ch bi tham s kiu con tr BITMAP* :
pBitmap
.
Cu trúc
bao gm các trng có ý ngha nh sau:

typedef struct tagBITMAP { /* bm */
int
bmType
; // Kiu bitmap,
int
bmWidth
; // Chiu rng bitmap tính bng pixel
int
bmHeight
; // Chiu cao bitmap tính bng pixel
int
bmWidthBytes
; // Kích thc 1 dòng pixel trong bitmap
BYTE
bmPlanes
; // S màu.

BYTE
bmBitsPixel
; // S bit màu ca 1 pixel
LPVOID
bmBits
; // Ða ch vùng nh cha pixel ca
bitmap
} ;
̇ operator () const; Tốn t chuyn kiu, tr v handle ca
bitmap ục qun lý bi ụi tng.

3.4.6 L
p :
CPalette là lp ụi tng qun lý palette, mt cơng c GDI ca DC.
Thơng qua ụi tng này, DC có th to ra các hiu ng màu trên giao
din ụ ha bng cách thay ụi các b màu mt cách phù hp.
̇ ( ); To lp ụi tng palette rng.
̇
( LPLOGPALETTE
lpLogPalette
); Khi to thơng s
cho ụi tng palette rng. Con tr tham s
lpLogPalette
ch ụn
bin kiu cu trúc LOGPALETTE cha thơng tin b màu dùng khi
to.
typedef struct tag
{
WORD
palVersion

; // S hiu palette h thng
WORD
palNumEntries
; // S màu s dng
PALETTEENTRY
palPalEntry
[1]; // Cha các giá tr màu,
// có s phn t mng bng palNumEntries
} LOGPALETTE ;
34 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -

H Mi phn t ca palPalEntry có kiu PALETTEENTRY phn ánh
giá tr màu dùng hin th màu ch mc (color index) tng ng vi v
trí th t ca nó. Cu trúc PALETTEENTRY có ni dung nh sau:

typedef struct tagPALETTEENTRY {
BYTE peRed ; // Giá tr thành phn màu ụ
BYTE peGreen ; // Giá tr thành phn màu xanh lá cây
BYTE peBlue ; // Giá tr thành phn màu xanh dng
BYTE peFlags ; // Vai trò màu trong h thng.
} ;

̇ operator
( ) const; Tốn t chuyn kiu, tr v handle
ca palette qun lý bi ụi tng.

3.4.7 L
 :
CRgn là lp ụi tng qun lý region, mt cơng c GDI quan trng
giúp DC n ụnh vùng nh x lý có hình dng tùy ý trên giao din ụ ha

ca nó.
̇
( ); To lp ụi tng vùng nh rng.
̇ BOOL
( int
x1
, int
y1
, int
x2
, int
y2
); Khi to thơng
s cho ụi tng vùng nh bng 1 hình ch nht vi ta ụ góc trái
trên và góc phi di ln lt là (x1, y1) và (x2, y2).
̇ BOOL
( int
x1
, int
y1
, int
x2
, int
y2
); Khi to
thơng s cho ụi tng vùng nh bi hình ellipse ni tip hình ch
nht có góc trái trên (x1, y1) và góc phi di (x2, y2).
̇ BOOL
(
LPPOINT

lpPoints
, // Mng cha ta ụ các ụim ziczac
int
nCount
, // S phn t POINT trong mng trên
int
nMode
// = WINDING
);
Khi to thơng s cho ụi tng vùng nh bi mt ụng ziczac
khép kín qua các ụim có ta ụ xác ụnh và ục lu trong mt
mng.
int
(
CRgn*
pRgn1
, // Con tr ụi tng qun lý vùng nh th nht
CRgn*
pRgn2
, // Con tr ụi tng qun lý vùng nh th hai
int
nCombineMode
// Cách kt hp hai vùng nh
); To thơng s cho ụi tng vùng nh trên c s kt hp hai vùng
nh ụã có. Tham s
nCombineMode
có th là:
RGN_AND : Vùng nh kt qu là vùng giao nhau gia hai vùng
nh.
RGN_OR : Vùng nh kt qu là vùng hp gia hai vùng nh.

RGN_DIFF : Vùng nh kt qu là vùng bù gia hai vùng nh.
Các lớp giao diện đồ họa của MFC 35
̇ operator HRGN() const; Tốn t chuyn kiu, tr v handle ca
vùng nh qun lý bi ụi tng.

 :
CDC là lp ụi tng qun lý DC. Thơng qua ụi tng DC, kh nng
ca các cơng c ụ ha ục khai thác cho vic trang trí giao din ụ
ha qun lý bi DC. CDC có các hành vi ục trng nh sau:
̇
( ); To lp ụi tng DC rng.
̇ virtual BOOL
( CDC*
pDC
); Khi to thơng
s cho ụi tng DC mt cách tng thích vi mt DC có sn ục
ch bi con tr tham s
pDC
.
̇ virtual BOOL
( ); Hy b ụi tng DC.
̇ CPen*
( CPen*
pPen
); Chn cơng c v mi cho DC.
pPen
: con tr ụn ụi tng pen s ục dùng cho DC.
Hàm tr v con tr ch ụn ụi tng pen mà DC ụang s dng.
H Có th s dng hành vi này cho các cơng c trang trí khác ca
DC. Kt qu tr v là con tr ụn ụi tng ụang dùng tng ng.

̇ CPent* ( ); Tr v giá tr con tr ca ụi tng pen
ụang ục s dng bi DC.
H M
t cách tng t cho các cơng c trang trí khác.
̇ virtual COLORREF
( COLORREF
crColor
); Ðt màu
nn cho DC.
crColor
là giá tr màu ụt.
̇ COLORREF
( ); Tr v giá tr màu nn ca DC.
̇ virtual COLORREF
( COLORREF
crColor
); n ụnh
màu ục s dng ụ hin th các ni dung vn bn trên DC.
̇ COLORREF ( ); Tr v giá tr màu hin dùng ụ hin
th các ni dung vn bn trên DC.
̇ int
( int
nBkMode
); n ụnh ch ụ hin th nn ký t
biu din ni dung vn bn.
nbkMode
cha thơng s n ụnh:
TRANSPARENT : Nn ch hin th trong sut.
OPAQUE : Ch hin th có màu nn.
̇ int Get

BkMode( ); Ly ch ụ hin th ch ca DC.
̇ virtual BOOL
(
int
x
,
y
, // Ta ụ bt ụu hin th
LPCTSTR
lpszString
, // Ni dung chui hin th.
int
nCount
// Chiu dài chui.
); Hin th ni dung chui vn bn lên giao din ụ ha ca DC.
̇ virtual int
(
LPCTSTR
lpszString
, // Ni dung chui hin th
int
nCount
, // Chiu dài chui
LPRECT
lpRect
, // Con tr ụn bin kiu RECT
36 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -
UINT
nFormat
// Cha thơng tin canh chnh chui hin

th.
); In ni dung chui lên giao din ụ ha ca DC vi các canh
chnh.
lpRect
: Ch ụn bin kiu RECT cha thơng tin gii hn vùng hin
th.
nFormat
: Cho phép kt hp mt cách hp lý các canh chnh trong
vùng hình ch nht gii hn. Các thơng s canh chnh có th là:
DT_CENTER : Chnh gia theo chiu ngang
DT_VCENTER : Chnh gia theo chiu dc
DT_RIGHT : Chnh phi.
̇ CPoint
( int
x
, int
y
); n ụnh ụim v hin hành.
̇ BOOL
( int
x
, int
y
); V ụng thng t ụim v hin hành
ụn ụim có ta ụ (x, y).
̇ void
(
LPCRECT
lpRect
, // Con tr ch ụn bin kiu RECT.

CBrush*
pBrush
// Con tr ụn ụi tng brush dùng tơ màu.
); Tơ màu vùng hình ch nht ục xác ụnh bi các giá tr cha
trong bin kiu RECT do tham s
lpRect
ch ụn.
̇ void
// V hình ch nht 3 chiu
LPCRECT
lpRect
, // Con tr ụn bin RECT
COLORREF
clrTopLeft
, // Màu v cnh trái và cnh trên.
COLORREF
clrBottomRight
// Màu v cnh phi và cnh di
)
;
̇ BOOL
(
LPRECT
lpRect
, // Con tr ụn bin kiu RECT.
UINT
nEdge
, // Cách v trên các g (trong, ngồi) cnh.
UINT
nFlags

// Các cnh ục v.
); V khung ch nht vi hiu ng 3 chiu.
nEdge
có th kt hp các giá tr sau:
BDR_RAISEDINNER : V ni g trong
BDR_SUNKENINNER : V chìm g trong
BDR_RAISEDOUTER : V ni g ngồi
BDR_SUNKENOUTER : V chìm g ngồi
nFlags
có th kt hp các giá tr sau:
BF_RECT : V tt c các cnh
BF_TOPLEFT : V cnh trái và cnh trên
BF_BOTTOMRIGHT : V cnh phi và cnh di
̇ BOOL
(
CPoint
pt
, // Ðim ụt góc trái trên ca nh trên DC
CSize
size
, // Kích thc vùng hin th nh
CBitmap*
pBitmap
, // Con tr ụi tng bitmap ục v
Các lớp giao diện đồ họa của MFC 37
UINT
nFlags
, // = DST_BITMAP (v bitmap)
CBrush*
pBrush

// Con tr ụi tng Brush, s dng khi v
// Bitmap n: nFlags |= DSS_DISABLED
); V bitmap hoc icon lên DC.
̇ BOOL
(
int
x
, int
y
, // Ta ụ góc trái trên và
int
nWidth
, int
nHeight
, // kích thc vùng nhn nh.
CDC*
pSrcDC
, // Con tr ụi tng qun lý DC ngun.
int
xSrc
, int
ySrc
, // Góc trái trên phn nh ngun ục
chép.
DWORD
dwRop
// Cách chp pixel t nh ngun.
); Chp ni dung phn nh bt ụu t v trí (
xSrc
,

ySrc
) trong DC
ngun sang vùng nhn nh bt ụu t v trí (
x
,
y
), vi kích thc
(nWidth, nHeight)
trong DC qun lý bi ụi tng.
Giá tr pixel ục chuyn vào vùng nhn nh tùy thuc vào giá tr
tham s
dwRop
. Mt s giá tr dùng cho tham s này có th nh
sau:
• SRCCOPY : Giá tr pixel ly trc tip t pixel ca nh ngun.
• SRCPAINT : Là kt qu OR ca pixel nh ngun và nh nhn.
• SRCAND : Là kt qu AND ca pixel nh ngun và nh
nhn.
̇ BOOL
(
int
x
, int
y
, // Ta ụ góc trái trên và
int
nWidth
, int
nHeight
, // Kích thc vùng nhn nh

CDC*
pSrcDC
, // Con tr ụi tng qun lý DC ngun
int
xSrc
, int
ySrc
, // Góc trái trên phn nh ục chép
CBitmap&
maskBitmap
, // Con tr ụi tng bitmap mt n
int
xMask
, int
yMask
, // Góc trái trên vùng nh làm mt n
DWORD
dwRop
// Cách chp pixel t nh ngun.
); Tng t BitBlt nhng s dng mt n lc pixel. Ði tng
maskBitmap
s dng nh trng ụen (monochrome bmp) mà mi
pixel "ụen" s ngn vic chuyn pixel  v trí tng ng t DC
ngun sang DC qun lý bi ụi tng, các v trí khác ục chuyn
bình thng.
̇ BOOL
(
int
x,
int

y,
// Ta ụ góc trái trên và
int
nWidth,
int
nHeight,
// Kích thc vùng nhn nh.
CDC*
pSrcDC,
// Con tr ụi tng DC ngun.

int
xSrc,
int
ySrc,
// Ta ụ góc trái trên và
int
nSrcWidth,
int
nSrcHeight,
// Kích thc phn nh ục
chép.
38 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh -
DWORD
dwRop
// Cách chp pixel t nh ngun.
); Tng t BitBlt nhng nh ụích và nh ngun có th có kích
thc khác nhau nên to hiu ng co dãn nh chép ục so vi
nh ngun.
̇ BOOL

(
int
x
, int
y
, // Ta ụ góc trái trên ni ụt icon trên DC
HICON
hIcon
// Handle ca icon
); V icon
hIcon
lên v trí (
x, y
) ca DC qun lý bi ụi tng.

3.6 L
 :
CImageList là lp ụi tng
imagelist
. Mi
imagelist
cho phép qun lý
danh sách nh có cùng kích thc và h tr nhiu tin ích trên chúng.
̇
( ); To lp ụi tng
imagelist
rng.
̇ BOOL
(
UINT

nBitmapID
, // S hiu ca resource bitmap cha các
nh
int
cx
, // Ð rng mi nh trong bitmap nói trên
int
nGrow
, // S nh trong bitmap
COLORREF
crMask
// Màu mt n (khơng hin th)
); Khi to ni dung cho ụi tng t mt bitmap trong resource.
̇ int GetImageCount( ); S nh ca imagelist qun lý bi ụi tng.
̇ int
(
CBitmap*
pbmImage
, // Con tr ụi tng bitmap ca nh
mi.
CBitmap*
pbmMask
| // Ði tng bitmap mt n hoc
[ COLORREF
crMask
] // màu mt n ca nh mi.
); Thêm mt nh (bitmap) vào imagelist.
̇ BOOL
( int
nImage

, CPoint
ptHotSpot
); Chun b
chuyn nh th
nImage
trong imagelist vi v trí bt ụu
ptHotSpot
.
̇ static BOOL
( CWnd*
pWndLock
, CPoint
point
); Cm
ca s
pWndLock
, ni mà imagelist ụang thc hin chuyn nh.
̇ static BOOL
(CPoint
pt
); Chuyn nh
nImag
ụn v trí
pt
.
̇ static BOOL
( CWnd*
pWndLock
); Chm dt tình trng
b cm ca ca s

pWndLock
.
̇ static void
( ); Chm dt tác v chuyn nh.
̇ static BOOL
( BOOL
bShow
); Hin th hoc che
nh trong q trình chuyn hình.
̇ BOOL
(
CDC*
pdc
, // Ði tng DC dùng v hình
int
nImage
, // S th t hình ục v trong imagelist
POINT
pt
, // Ta ụ góc trái trên ni v hình

×