LÊ NGỌC THẠNH
[email protected]
LẬP TRÌNH WINDOWS VỚI MFC
Microsoft Visual C++ 6.0
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
CHƯƠNG 3
: CÁC LỚP GIAO DIỆN ĐỒ HỌA 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
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
CHƯƠNG 5
: XỬ LÝ MESSAGES
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
CHƯƠNG 6
: ỨNG DỤNG CÔNG CỤ GDI
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 ý
CHƯƠNG 7
: MENU – PHÍM TẮT
7.1 Đònh nghóa
7.2 Menu resoure
31
31
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
CHƯƠNG 8
: CÁC LỚP ĐỐI TƯNG NHẬP LIỆ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
: HỘP HỘI THOẠI
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
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
CHƯƠNG 11
: CÁC KIẾN TRÚC DOCUMENT – VIEW
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
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
LẬP TRÌNH HƯỚNG ĐỐI TƯNG
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
LỜI MỞ ĐẦU
Y^]Z
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.
YXWZ
PHẦN MỀM CẦN CÀI ĐẶT:
- Microsoft Visual C++ 6.0 hoặc Microsoft Visual C++ .NET.
- MSDN ( Microsoft Developer Network ), bản tháng 10/2003.
MÃ NGUỒN:
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ỉ:
http://thanh.andisw.com/?id=16&id2=85
WEB SITE:
Source Code đặc sắc của nhiều tác giả trên thế giới có thể download:
- http://msdn.microsoft.com
- http://www.codeguru.com
- http://www.codeproject.com
- http://www.softechsoftware.it
- http://www.flipcode.com
- http://nps.vnet.eeLIÊN HỆ:
: 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 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - [email protected]
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ý
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ố 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ị
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 Ðặc tả message:
Ðể đố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 tagMSG {
HWND
hwnd
Ứ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 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạ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ổ.
// 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 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
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 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạ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ị 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:
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 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ó.
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 - [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, 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:
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,
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.