Sách hay
Trang 1lntmail@yahoo.com
Trang 21.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
: 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
Trang 37.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
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
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
: 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
Trang 412.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.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
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
Trang 5Ngô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 quí 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
Waite Group Press 1996
Microsoft Corporation Software
xw(vy :
: 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
: Source Code đặc sắc của nhiều tác giả trên thế giới có thể download:
emp@ueh.edu.vn
Trang 6Một số khái niệm lập trình trong môi trường Windows 1
:
M
Vi c chuy n các ch th d ng mã ngu n sang ch th mã máy ụ th c
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
là ng d ng, ví d nh ng d ng NotePad, ng d ng Microsoft Word,
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 ụĩ
Ti n trình là khái ni m ch m t instance ụang ho t ụ ng c a ng
2 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
̇ Ti u trình giao di n (user-interface thread): Cĩ nhi m v x lý các yêu
̇ Ti u trình x lý n i (worker thread): Cĩ nhi m v th c hi n các x lý
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
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,
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
dùng, ho c khi ng d ng th c hi n giao ti p v i windows hay v i các
̇ 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
Trang 7Một số khái niệm lập trình trong môi trường Windows 3
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
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ĩ
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
nh n thơng qua m t c u trúc ch a s hi u message và các thơng s
sau:
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
trong windows
C a s giao di n là thành ph n quan tr ng trong vi c t o ra mơi
phát tri n c a h ụi u hành windows, hình nh c a s giao di n c ng
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 - lntmail@yahoo.com
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
̇ System Menu Box: Ch a bi u t ng c a ng d ng, là nút m h p
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ĩ
Trang 8Mộ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:
Message queue là danh sách th t các message do windows t o ra
̇ 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
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
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:
);
Hàm t ụ ng ch ụ n khi phát hi n cĩ message c n x lý trong
6 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
);
Tham s lpMsg là con tr ch ụ n bi n ki u MSG ch a n i dung ụ c
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,
vi c di n d ch sang mã phím ASCII là thành cơng Khi ụĩ hàm t ụ ng
h p khác, hàm tr v giá tr 0
Trang 9Mộ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ý
th ụi u ph i message l y t message queue c a ng d ng ụ n cho
);
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 Quá trình ti p nh n và ụi u ph i x lý message t message queue
k t thúc ng d ng (WM_QUIT) Quá trình này cĩ tên g i là vịng l p
while( GetMessage( &msg, NULL, 0, 0 ) != 0 ) {
TranslateMessage(&msg); // Di n d ch n u là phím
}
hi n m i c a ng d ng, ụ ng th i xây d ng m t message queue dùng
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:
̇ 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
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:
bên trong, là c s ụ t o ra các h p h i tho i trong ng d ng
Trang 10Một số khái niệm lập trình trong môi trường Windows 9
nh m th c hi n m t x lý xác ụ nh
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
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
resource c a ng d ng, ụ ng th i ph i t cài ụ t x lý thích h p cho
Trang 1110 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
:
Th vi n MFC c a Microsoft bao g m các l p c b n, cài ụ t b ng
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
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
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:
Thư viện MFC của Microsoft & ứng dụng cơ bản trong windows 11
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ì
TranslateMessage và hàm ụi u ph i message DispatchMessage
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
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
Trang 1212 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
k th a public t CWinThread, CWinApp cĩ các thu c tính và hành vi b
sung sau:
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
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)
nType: n ụ nh d ng h p thơng báo Giá tr này là s k t h p gi a
h p
Thư viện MFC của Microsoft & ứng dụng cơ bản trong windows 13
MB_ICONHAND, MB_ICONSTOP, MB_ICONERROR
MB_ICONQUESTION MB_ICONEXCLAMATION, MB_ICONWARNING MB_ICONASTERISK, MB_ICONINFORMATION
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ĩ
Trang 1314 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
CWinApp qu n lý ti u trình chính Ð t tên cho d án c a ng d ng là
Thư viện MFC của Microsoft & ứng dụng cơ bản trong windows 15
H M t d án ụã ụ c t o ra trên ụ a V i thơng tin nh p nh trên,
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
Trang 1416 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
#if !defined( _DU_AN_0_ )
• Ð 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
Trang 1518 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
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
#include "stdafx.h" // T p tin ch a ụ ng ký th vi n c a MFC
(phiên b n biên d ch debug) ho c RELEASE (phiên b n biên d ch release)
: ng d ng VD0 khơng th c hi n m t giao tác hay cơng vi c
l p CWinApp c a MFC mà khơng cĩ m t x lý b sung nào
Trang 1620 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
Trong ph n này ta thi t k m t ng d ng mà khi th c hi n s hi n th
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
thích h p cho vi c k th a và th c hi n các b sung này
Thư viện MFC của Microsoft & ứng dụng cơ bản trong windows 21
MFC khơng h tr l p CWinApp trong ClassWizard c a nĩ
(.cpp) c a l p CEmpApp ( nên trùng v i tên c a d án : ):
Cĩ th m và ch nh s a n i dung các t p tin c a l p b ng cách
Trang 17
22 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
Thư viện MFC của Microsoft & ứng dụng cơ bản trong windows 23
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,
Trang 1824 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
• Ch n m c
{
Thư viện MFC của Microsoft & ứng dụng cơ bản trong windows 25
Trang 1926 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
thêm
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:
dùng cho icon chính c a ng d ng
t o trong th m c d án ụ ch a các t p tin resource
̇ Ðĩng màn hình thi t k icon resource
trong th m c debug c a d án Lúc này, ng d ng VD01 ụã cĩ icon riêng
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
l i
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
Trang 2028 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
̇ TCHAR operator ( int nIndex ) const; Tr v ký t v trí nIndex
̇ CString::operator + ; Phép tốn c ng chu i
H nCount là chi u dài (s ký t ) c a chu i con ụ c trích ra
dung
h ng chu i trong string table resource nID là s hi u c a h ng chu i
:
chu i tham s dịng l nh th c thi nĩ
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
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
Trang 21Các lớp giao diện đồ họa của MFC 29
:
Ð 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:
̇ Brush : Cơng c tơ màu
̇ 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
qua m t c u trúc ch a thơng tin qu n lý thi t b hi n th : Device Context
ụ 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
nĩ ụang dù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
ụ cĩ g c (0,0) là gĩc trái-trên (top-left corner) c a giao di n ụ h a,
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
trúc sau:
30 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
̇ C u trúc qu n lý 1 ụi m:
typedef struct _POINT {
̇ C u trúc qu n lý 1 vùng hình ch nh t:
typedef struct _RECT {
VD: Gi s kh i t o m t rect khơng h p l nh sau:
rect tr nên h p l v i: rect ( 0, 0, 100, 50 );
Trang 22Cá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
);
nPenStyle cĩ th nh n m t trong các giá tr sau:
crColor cĩ th nh n giá tr t macro ph i màu RGB( ) nh sau:
)
ánh ụ sáng c a nĩ B ph i màu theo qui t c ph i màu t
nhiên
̇ operator HPEN() const; Tốn t chuy n ki u, tr v handle c a
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:
cĩ màu tơ crColor, và nét tơ nIndex
ụ 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
sau:
typedef struct tagLOGFONT {
H Win9x ch dùng lfEscapement
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
lpLogFont
DC cĩ th d dàng t o n i dung trang trí trên giao di n ụ h a t n i
lý nh c b n trên n i dung ụĩ CBitmap cung c p các hành vi ụ c tr ng sau:
Trang 23Các lớp giao diện đồ họa của MFC 33
trình
ki u BITMAP ch b i tham s ki u con tr BITMAP* : pBitmap
typedef struct tagBITMAP { /* bm */
di n ụ h a b ng cách thay ụ i các b màu m t cách phù h p
bi n ki u c u trúc LOGPALETTE ch a thơng tin b màu dùng kh i
t o
} LOGPALETTE ;
34 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
H M i ph n t c a palPalEntry cĩ ki u PALETTEENTRY ph n ánh
trí th t c a nĩ C u trúc PALETTEENTRY cĩ n i dung nh sau: typedef struct tagPALETTEENTRY {
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ĩ
);
m 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
Trang 24Cá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
H Cĩ th s d ng hành vi này cho các cơng c trang trí khác c a
ụang ụ c s d ng b i DC
n n cho DC crColor là giá tr màu ụ t
th các n i dung v n b n trên DC
bi u di n n i dung v n b n nbkMode ch a thơng s n ụ nh:
); Hi n th n i dung chu i v n b n lên giao di n ụ h a c a DC
36 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
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à:
ụ n ụi m cĩ t a ụ (x, y)
trong bi n ki u RECT do tham s lpRect ch ụ n
);
); 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
Trang 25Các lớp giao diện đồ họa của MFC 37
); V bitmap ho c icon lên DC
chép
); Ch p n i dung ph n nh b t ụ u t v trí (xSrc,ySrc) trong DC
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
maskBitmap s d ng nh tr ng ụen (monochrome bmp) mà m i
chép
38 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
nh ngu n
nh
m i
[ COLORREF crMask ] // màu m t n c a nh m i
); Thêm m t nh (bitmap) vào imagelist
chuy n nh th nImage trong imagelist v i v trí b t ụ u ptHotSpot
c a s pWndLock, n i mà imagelist ụang th c hi n chuy n nh
pt
b c m c a c a s pWndLock
nh trong quá trình chuy n hình
Trang 26Các lớp giao diện đồ họa của MFC 39
COLORREF rgbBack , // Màu vùng b l c = CLR_DEFAULT
COLORREF rgbFore // Màu ph i h p cho fStyle cĩ thơng s
// ILD_BLEND25 ho c ILD_BLEND50 ( = CLR_DEFAULT)
Trang 2740 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
:
C
C a s giao di n là thành ph n quan tr ng c a ng d ng Nĩ khơng
ch ụĩng vai trị trung gian trong trao ụ i thơng tin gi a ng d ng v i
thu c tính và hành vi c a l p CWnd, MFC cung c p các d ch v c n thi t
cho phép t o l p và khai thác các tính n ng c a c a s windows m t
Tham s dwStyle qui ụ nh ụ c ụi m và ki u dáng c a s Giá tr
dùng cho tham s này cĩ th k t h p m t s trong các giá tr sau:
s WS_MINIMIZEBOX : Cĩ h p thu nh trên caption c a c a s
s
Ví d : WS_POPUP | WS_CAPTION : C a s chính cĩ tiêu ụ lpszClassName là m t tên ụã ụ ng ký cho l p c a s Ngồi các tên mà windows ụã ụ ng ký nh STATIC, BUTTON, EDIT,
cách tùy ý Vi c ụ ng ký tên l p c a s cĩ th th c hi n b ng m t trong hai cách sau:
• Ð ng ký tr c ti p:
nh t
Tham s nClassStyle cĩ th k t h p t các giá tr sau:
Hàm tr v giá tr TRUE n u tác v ụ ng ký thành cơng Th c
c a s hai ng d ng khác nhau khi hai ng d ng này tình c
ụ ng ký các tên l p c a s gi ng nhau v thơng s
Trang 2842 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
d ng
); Kh i t o c a s v i vi c s d ng các thơng s m r ng v d ng
Tham s dwExStyle qui ụ nh d ng m r ng c a c a s cĩ th k t
h p t các giá tr sau:
WS_EX_TOOLWINDOW : C a s khơng hi n th trên taskbar
WS_EX_TRANSPARENT : C a s cĩ n n trong su t
ụ c th c hi n tr c khi windows kh i t o thơng s cho c a s
typedef struct tagCREATESTRUCT {
LPVOID lpCreateParams; // Con tr vùng ch a thơng s c a
s
s
c m ho t ụ ng c a c a s
c a c a s trên màn hình Giá tr cho tham s nCmdShow cĩ th là:
UINT nFlags // Thơng s tr ng thái
); n ụ nh v trí c a s trên màn hình
(z-order) Giá tr này cĩ th nh sau:
Trang 2944 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
Chuy n t a ụ ụi m hay vùng hình ch nh t trong client c a c a
s sang h tr c t a ụ c a màn hình
Chuy n t a ụ ụi m hay vùng hình ch nh t trên màn hình sang
h tr c t a ụ c a vùng client trong c a s
s ụang s d ng Giá tr tham s bBigIcon cĩ ý ngh a nh sau:
FALSE : Handle c a icon hi n th trên caption (small Icon)
); Ð t icon m i cho c a s
trên thanh cu n nBar ch a s hi u thanh cu n quan tâm nBar cĩ
M i khi h t m t chu k c a timer, h th ng g i WM_TIMER kèm theo s hi u c a timer ụĩ ụ n cho c a s
c a c a s Tham s nIDEvent ch a s hi u c a timer liên quan
vùng client c a c a s N u bErase = FALSE, windows khơng th c
hi n xĩa thơng tin trong vùng c n v l i
Kích ho t c ch v l i m t vùng trong client c a c a s Thơng tin
Trang 3046 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
lý xong
); Ð t message và các tham s kèm theo vào message queue c a
WM_SIZE, message do windows g i ụ n c a s khi m t tác v
c a s
Hành vi x lý WM_CREATE, message do windows g i ụ n c a s
windows g i ụ n c a s khi tác v ụĩng c a s ụang x y ra
message do windows g i ụ n c a s khi tác v h y b c a s
ụang x y ra
UINT nFlags // Tr ng thái các phím kèm theo
); Hành vi x lý WM_KEYDOWN, message do windows g i ụ n
); Hành vi x lý WM_CHAR, message do windows g i ụ n c a s
); Hành vi x lý WM_LBUTTONDBLCLK, message do windows g i
ụ n c a s khi ng i dùng double-click vào nút chu t trái
Tham s nFlag cĩ th là k t h p c a các giá tr sau:
vi x lý WM_LBUTTONDOWN, message do windows g i ụ n c a
x lý WM_LBUTTONUP, message do windows g i ụ n c a s khi
̇ M t cách t ng t cho các hành vi x lý message c a nút chu t
ph i
vi x lý WM_MOUSEMOVE, message do windows g i ụ n c a s
trên
windows g i ụ n c a s khi h th ng ho c ng d ng cĩ nhu c u trang trí l i m t ph n hay tồn b giao di n c a c a s
trì trên b m t giao di n c a c a s Ð th c hi n vi c này,
ụ h a c n thi t nh m hồn thành yêu c u nĩi trên
CDC* pDC = BeginPaint(&ps); // L y DC c a giao di n c a s
); Hành vi x lý WM_HSCROLL, message do windows g i ụ n c a
(horizontal scrollbar ho c horizontal sliderCtrl) trong c a s b tác
Trang 3148 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
SB_THUMBPOSITION : Chuy n nút b ng chu t
SB_THUMBTRACK : Ðang chuy n nút b ng chu t
xác ụ nh s hi u c a m c phát sinh message WM_HSCROLL
Ðây là c s giúp phân bi t m c này v i các m c khác trong
cùng c a s giao di n nh m l a ch n x lý thích h p cho
WM_HSCROLL
); Hành vi x lý WM_VSCROLL, message do windows g i ụ n c a
(vertical scrollbar ho c vertical sliderCtrl) trong c a s b tác ụ ng
); Hành vi x lý WM_SETCURSOR, message do windows g i ụ n
c a s khi windows c n n ụ nh l i hình d ng cursor cho phù h p
v i v trí hi n th i c a nĩ trên c a s
nHitTest ch a thơng tin v trí hi n th i c a cursor:
HTBORDER : Cursor hi n n m trên biên c a s
HTCAPTION : Cursor hi n n m trên tiêu ụ c a c a s
Hành vi x lý các message g i ụ n c a s M c nhiên, hành vi này
• Ð t ụi m ch (hotpot) c a cursor: Trong màn hình thi t k cursor:
- Click t i v trí hotpot c a cursor trên màn hình thi t k
CEmpApp qu n lý ti u trình chính K th a hành vi này t CWinApp cho l p CEmpApp (xem 2.7) N i dung cài ụ t c a hành
vi nh sau:
CBrush myBrush;
// N p cursor và icon t resource vào b nh myIcon = LoadIcon ( IDR_MAINFRAME );
myCursor = LoadCursor ( IDR_MAINFRAME );
myBrush CreateSolidBrush (RGB(190, 190, 0) );
main->CreateEx( WS_EX_TOPMOST, AfxRegisterWndClass(
CS_HREDRAW|CS_VREDRAW,
"Emp.Example 2", WS_SYSMENU | WS_VISIBLE | WS_MINIMIZEBOX,
100, 100, 300, 200, NULL, NULL );
// Dùng main làm c a s giao di n chính m_pMainWnd = main;
thúc
trên m i c a s khác ngay c khi nĩ khơng ph i là c a s kích ho t V i ExStyle là WS_EX_TOOLWINDOW, c a s s khơng hi n th trên taskbar
ụánh d u và ki m tra Trong ch ng trình c a ng d ng, ta qui c ụ ng
Trang 3250 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
ụ i t ng c a s
Trang 33Xử lý Message 51
:
X lý message
Windows là môi trường mà phần lớn giao tác giữa các bộ phận dựa trên cơ
chế gửi-nhận message Việc tạo ra đối tượng có khả năng xử lý và điều phối
messages là rất cần thiết không chỉ đối với hệ thống mà với cả ứng dụng
Trên quan điểm đó, MFC cung cấp lớp đối tượng CCmdTarget phục vụ xử lý
và điều phối messages trong phạm vi ứng dụng, giữa ứng dụng với hệ thống
và với các ứng dụng khác Các hành vi đặc trưng của lớp như sau:
cung cấp cho phép bổ sung mục xử lý message cho các lớp đối tượng
kế thừa lớp CCmdTarget Các macro giúp cài đặt cơ chế này như sau:
cho lớp đối tượng xử lý message thông qua các cài đặt bổ sung sau:
AFX_MSGMAP_ENTRY Mỗi phần tử của mảng được dùng lưu
trữ một mục xử lý message mà lớp kế thừa khai báo bổ sung
chỉ đến bảng các mục xử lý message nói trên
DECLARE_MESSAGE_MAP được đặt cuối phần khai báo lớp:
DECLARE_MESSAGE_MAP()
};
tập tin cài đặt (.CPP) của lớp, nên đặt đầu tập tin để tiện theo dõi
52 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
trên đối tượng được điều phối Bố cục xử lý điều phối như sau:
duy nhất cho một message Các loại message khác nhau có kiểu mục xử lý message khác nhau Các kiểu mục xử lý message phổ biến như sau:
bằng WM_ *, mục xử lý message tương ứng có dạng ON_WM_* ()
Ví dụ: WM_PAINT å ON_WM_PAINT()
đoạn WM_USER ÷ WM_USER+0×7FFF Mục xử lý message cho các message của người dùng có dạng như sau:
ON_MESSAGE( userMessageID , UserFuncName ) Trong đó:
afx_msg LRESULT UserFuncName (
);
Trang 34Xử lý Message 53
nghĩa và sử dụng theo qui ước trong một ứng dụng, windows cho phép
ứng dụng đăng ký message để message đó có thể sử dụng trên nhiều
ứng dụng khác nhau Việc đăng ký được thực hiện thông qua hàm sau:
Hàm trả về số hiệu đăng ký được của message Giá trị này nằm trong
đoạn 0×C000÷0×FFFF Các ứng dụng đang chạy trên một hệ thống có
thể chia xẻ message dùng riêng với điều kiện chúng phải thực hiện
thao tác đăng ký cùng một chuỗi tên message để lấy số hiệu message
Mục xử lý message cho các message có đăng ký của người có dạng:
ON_REGISTERED_MESSAGE(UserRegMessageID, UserFuncName)
: // Đăng ký message với tên là “MY_MESS”
const UINT myMess = RegisterWindowMessage(“MY_MESS”);
// Khai báo mục xử lý cho message được đăng ký BEGIN_MESSAGE_MAP ( CMyWnd, CMyBasedWndClass )
(CommandID) của đối tượng phát sinh message Mục xử lý message
H Có thể cài đặt xử lý điều khiển đối với đối tượng làm phát sinh
WM_COMMAND thông qua mục xử lý điều khiển message như sau:
PreFunctionName là hành vi thực hiện xử lý điều khiển trên đối tượng
phát sinh WM_COMMAND, tham số nhận được là giá trị con trỏ đến
tượng này được dùng để cấm hoặc cho phép hoạt động đối với đối
tượng phát sinh WM_COMMAND Xử lý của hành vi này có thể là:
54 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
void [ClassName::]PreFunctionName (CCmdUI* pCmdUI ) {
pCmdUI->Enabled (FALSE ); // Cấm đối tượng hoạt động }
chứa số hiệu control, giá trị WORD cao của tham số chứa thông tin về trạng thái control ở thời điểm gửi message đến cửa sổ
xử lý message cho message gửi từ control có dạng như sau:
ON_CONTROL (Trạng_thái_control, Số_hiệu_Control, Hàm_xử_lý )
Ví dụ: Ta có ví dụ minh họa định hướng xử lý message như sau:
* Khai báo lớp (têp tin H):
class CMyClass: public CBasedWnd { public: CMyClass();
* Phần cài đặt của lớp (têp tin CPP):
#define MY_MESSAGE WM_USER + 1 static UINT NEAR MY_MESS = RegisterWindowMessage(“MY_MESS”); BEGIN_MESSAGE_MAP(CMyClass, CDerivedWnd)
Trang 35Xử lý Message 55
Các lớp đối tượng của MFC kế thừa từ CCmdTarget có chức năng xử lý
message là CWnd, CWinApp, CDocument Ứng dụng có thể dựa trên những
lớp này để xây dựng các lớp kế thừa đảm nhận chức năng xử lý message phù
hợp với yêu cầu của ứng dụng
Trong phần này, ta thực hiện ứng dụng với cửa sổ giao diện chính có tiêu
đề chứa nội dung chữ chạy theo kiểu bảng chữ điện tử
Lớp CWnd của MFC không cung cấp tiện ích này Chúng ta cần xây dựng
lớp cửa sổ mới với những khả năng phù hợp; có các chức năng như CWnd để
làm giao diện, đồng thời có khả năng tự thay đổi nội dung tiêu đề (caption)
theo thời gian (timer) Lớp cửa sổ này kế thừa từ lớp CWnd, tự cài đặt timer
(SetTimer) khi bắt đầu (OnCreate) hoạt động, xử lý thay đổi nội dung tiêu đề
ở mỗi chu kỳ Timer (OnTimer) và hủy bỏ Timer (KillTimer) khi chấm dứt
hoạt động (OnDestroy) Sau đây là các bước thực hiện dự án:
hiện như bổ sung lớp CEmpApp trong mục (2.7) Lưu ý trong hộp hội
sở kế thừa từ lớp CWnd của MFC:
trước khi đi vào hoạt động Bổ sung và cài đặt hành vi như sau:
56 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
CEmpWnd, đồng thời mục xử lý ON_WM_CREATE() được đặt
chu kỳ của timer Việc bổ sung hành vi này được thực hiện tương tự OnCreate Nội dung cài đặt của hành vi như sau:
void CEmpWnd::OnTimer( UINT nIDEvent )
{
Trang 36for (UINT i=0; i<strlen(s)-1; i++)
CWnd::OnDestroy(); // Gọi hành vi lớp cơ sở
}
• Thực hiện chỉ thị sau ở đầu tập tin chương trình:
#include "EmpWnd.h" // Tập tin khai báo của lớp CEmpWnd
Lưu ý: Dự án VD04 sử dụng 100 làm số hiệu timer Việc sử dụng giá trị hằng
như thế không gợi nhớ và kém linh hoạt trong sử dụng Ta nên khai báo một
tên riêng cho hằng để tránh các hạn chế trên Cách thực hiện như sau:
58 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
Ta nhận được hộp hội thoại Resource Symbols chứa danh sách các giá trị đã khai báo Có thể thực hiện thêm, xóa các giá trị khai báo này
H Thông tin khai báo lưu trong tập tin resource.h của dự án Khi đó, trong chương trình, thay vì viết giá trị hằng cụ thể cho số hiệu của Timer (chẳng hạn 100), ta sử dụng tên khai báo của nó (theo ví dụ là ID_TIMER)
Để duy trì thông tin hiển thị trên bề mặt cửa sổ, hệ thống thường xuyên gởi WM_PAINT đến cho cửa sổ mỗi khi có hiện tượng xâm phạm đến nội dung hiển thị của nó Ứng dụng cũng có thể kích hoạt hệ thống phát sinh message này thông qua một trong các hành vi sau:
Trang 37Xử lý Message 59
vùng client của cửa sổ Nếu tham số bErase = FALSE thì hệ thống sẽ không tự động xóa hộ phần nội dung cũ trong cửa sổ
); Yêu cầu cập nhật một vùng giới hạn trong client của cửa sổ
vi này trong các lớp kế thừa CWnd nhằm thực hiện các trang trí riêng theo bố cục ở mục OnPaint trong (4.2) Toàn bộ thao tác xử lý này được MFC thực hiện thông qua lớp CPaintDC như sau:
:
1 Tương tự VD04 Khi người dùng kết thúc ứng dụng, chương trình hiển thị hộp thông báo "Are you sure to exit this program ?" với hai mục YES-NO Nếu người dùng chọn YES thì kết thúc:
HD: Cài đặt hành vi OnClose xử lý message WM_CLOSE cho CEmpWnd Dùng hành vi MessageBox của CWnd để hiển thị câu thông báo Nếu người dùng đồng ý thì thực hiện hành vi OnClose của CWnd để kết thúc, ngược lại không thực hiện xử lý gì cả (xem VD05)
2 Tương tự VD04 với phần demo là ảnh viên bi chạy trong client của cửa sổ HD: Dùng timer để liên tục phát WM_PAINT bằng hành vi Invalidate theo mỗi chu kỳ Hành vi OnPaint thực hiện vẽ vào vùng client của cửa sổ chính một dòng chữ có nội dung chạy kiểu bảng chữ điện tử (xem VD06)
3 Thực hiện ứng dụng cho phép hiển thị một vật thể có hình dạng bất kỳ trong vùng client Các phím ← , ↑ , → , ↓ cho phép dịch chuyển vật thể này HD: Như bài tập 2 nhưng không sử dụng timer Dùng hành vi OnKeyDown xử lý message WM_KEYDOWN Hành vi này kiểm tra giá trị phím nhận được với các giá trị hằng phím VK_LEFT (phím ←), VK_UP (phím ↑), VK_RIGHT (phím →), VK_DOWN (phím ↓) để thay đổi tọa độ vật thể cho phù hợp Sau cùng phát sinh message WM_PAINT để vẽ lại vật thể
Trang 3860 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
:
Vấn đề trang trí thiết bị đồ họa được tiến hành thông qua đối tượng DC
quản lý thiết bị, trên cơ sở khai thác chức năng các công cụ GDI liên quan
Kết quả trang trí trên DC được quản lý bởi đối tượng Bitmap mà DC đang sử
dụng Bitmap là công cụ làm nền không thể thiếu cho các DC
Việc khởi tạo nội dung cho đối tượng bitmap trong ứng dụng có thể được
thực hiện bằng cách lấy ảnh bitmap từ resource (LoadBitmap) hay tạo mới
nội dung cho bitmap dựa trên một DC xác định (CreateCompatibleBitmap)
Thông thường, ứng dụng đồ họa phải chuẩn bị sẵn các ảnh cần thiết trong
resource của ứng dụng Ở phần xử lý, các resource này được tải vào bộ nhớ
làm nội dung cho các đối tượng bitmap Từ các đối tượng bitmap này, ảnh sẽ
được vẽ lên các thiết bị hiển thị đồ họa thông qua đối tượng DC tương ứng
Trong phần này ta thực hiện ứng dụng có chức năng hiển thị một ảnh xác
định trong vùng client của cửa sổ chính Các bước tiến hành dự án như sau:
dung ảnh này có thể được tạo mới hoàn toàn hoặc lấy từ nội dung của
một tập tin bitmap (.bmp) đã có Chọn một trong hai cách sau:
qua hộp hội thoại File-Folder
- Ấn định các thông số của bitmap (số hiệu là IDB_MYPICT)
- Right-click trên tiêu đề của lớp CEmpWnd:
Trang 3962 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
int CEmpWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
thông qua hành vi DrawState của đối tượng CPaintDC
Lưu ý: Để xử lý trang trí đồ họa trong vùng client của cửa sổ giao diện không
gây ra hiện tượng "chớp", ta có thể sử dụng một số giải pháp sau:
cho tham số này trong hành vi khởi tạo thông số của đối tượng cửa sổ
nội dung trang trí cần thiết lên DC này Sau khi hoàn tất các tác vụ trang
trí cần thiết thì chuyển nội dung DC công cụ lên DC của màn hình
Đối tượng DC cho phép sao chép lại nội dung trang trí đồ họa trên thiết bị hiển thị đồ họa được quản lý bởi một đối tượng DC khác lên thiết bị hiển thị đồ họa được quản lý bởi chính nó thông qua một số hành vi sau:
Trong phần này ta xây dựng ứng dụng có các đặc điểm sau:
kích thước một cách phù hợp khi kích thước cửa sổ thay đổi
Việc thực hiện cần lưu ý các bước sau:
ảnh bitmap từ DC này lên DC hiển thị
Các bước thực hiện như sau:
bitmap, từ đó vẽ lên vùng client của cửa sổ Xử lý cài đặt như sau:
memDC.CreateCompatibleDC(&dc);
oldBmp = memDC.SelectObject(&m_myPict);
dc.StretchBlt( 0, 0, rt.right-rt.left, rt.bottom-rt.top, &memDC,
Trang 4064 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com
Nếu việc trang trí gồm nhiều thao tác phức tạp thì nên thực hiện chúng
trên DC ảo, sau đó chuyển kết quả ra DC hiển thị Chỉ một lần duy nhất cho
mỗi nội dung trang trí, như thế sẽ cải thiện đáng kể chất lượng đồ họa
Ứng với mỗi DC ảo tạo ra trong bộ nhớ, ngoài đối tượng CDC quản lý, ta
cần sự phối hợp của đối tượng bitmap làm nền thay thế đối tượng bitmap
tượng trưng không sử dụng được mà hệ thống gán cho DC khi tạo lập Bố cục
xử lý của hành vi OnPaint có sử dụng đối tượng DC ảo như sau:
// Chuyển nội dung DC ảo sang dc:
dc.StretchBlt ( 0, 0, CX,CY, &memDrawDC, CX,CY, SRCCOPY );
// Hủy bỏ các đối tượng GDI:
memDrawDC.SelectObject(&memDrawOldBmp);
memDrawBmp.DeleteObject();
memDrawDC.DeleteDC();
Q Phần tiếp theo ta thực hiện ứng dụng tương tự VD08, đồng thời tạo dòng
chữ chạy theo kiểu bảng chữ điện tử trong vùng client của cửa sổ chính
memDrawDC.SetTextColor( RGB(255,0,0) ); // text color
memDrawDC.SetBkMode( TRANSPARENT ); // transparent
memDrawDC.TextOut( 30, 100, Chuỗi, I );
Với các đối tượng GDI được sử dụng thường xuyên thì việc lặp đi lặp lại các thao tác tạo và hủy bỏ chúng trong các hành vi trang trí của CEmpWnd sẽ làm lãng phí tài nguyên của hệ thống Nên chuyển tất cả các thao tác đó về hai hành vi OnCreate và OnDestroy của CEmpWnd một cách phù hợp Bạn hãy thử áp dụng điều lưu ý này cho VD09
Được thực hiện một cách đơn giản bằng kỹ thuật hoạt hình Ta chuẩn bị một số ảnh cơ bản của chuỗi hoạt động đó, sau đó thực hiện hiển thị và tráo ảnh theo trình tự với khoảng thời gian chờ hợp lý
Các ảnh trong nội dung hoạt hình được quản lý bởi công cụ GDI thích hợp:
Ảnh vẽ bằng hành vi DrawState của đối tượng DC quản lý thiết bị hiển thị Kích thước ảnh hiển thị không thay đổi
kỳ phần ảnh cần vẽ nào sang DC hiển thị Có thể thay đổi kích thước
thước Khả năng thao tác trên danh sách ảnh của CImageList là rất tốt
Q Trong phần này ta xây dựng ứng dụng với hình ảnh chú bướm bay trong vùng client của cửa sổ Tập tin butterfly.bmp trong thư mục BMP chứa các ảnh chuyển động của bướm Ta dùng cách thứ 2, lồng các ảnh vào DC và vẽ lên DC hiển thị Các bước thực hiện dự án như sau:
được lấy từ tập tin chứa các ảnh hoạt hình Ghi nhớ số ảnh trong bitmap đó Chẳng hạn, chọn tập tin butterfly.bmp trong thư mục BMP Tập tin này có 4 ảnh, kích thước 32x28
hiển thị trong các ảnh hoạt hình nói trên
int CEmpWnd::OnCreate( LPCREATESTRUCT lpCreateStruct )