1. Trang chủ
  2. » Công Nghệ Thông Tin

Visual c Nâng cao

133 275 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Visual C Nâng Cao
Trường học Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành Công Nghệ Thông Tin
Thể loại tiểu luận
Định dạng
Số trang 133
Dung lượng 2,23 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Sách hay

Trang 1

lntmail@yahoo.com

Trang 2

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

: 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 3

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

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 4

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.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 5

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 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 6

Mộ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 7

Mộ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 8

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:

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 9

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ý

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 10

Mộ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 11

10 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 12

12 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

Trang 13

14 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 14

16 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 15

18 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 16

20 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 18

24 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 19

26 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 20

28 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 21

Cá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 22

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

);

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 23

Cá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 24

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

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 25

Cá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 26

Cá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 27

40 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 28

42 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 29

44 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 30

46 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 31

48 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 32

50 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 33

Xử 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 34

Xử 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 35

Xử 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 36

for (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 37

Xử 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 38

60 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 39

62 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 40

64 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 )

Ngày đăng: 18/10/2013, 21:22

Xem thêm

HÌNH ẢNH LIÊN QUAN

Bảng chuyển đổi IP-DomainName do DNS server, một host chuyên dụng - Visual c Nâng cao
Bảng chuy ển đổi IP-DomainName do DNS server, một host chuyên dụng (Trang 107)
Bảng thông tin này thông qua các dịch vụ cung cấp bởi windows socket. - Visual c Nâng cao
Bảng th ông tin này thông qua các dịch vụ cung cấp bởi windows socket (Trang 107)
Bảng định tuyến được xác lập trên tất cả các host (node, router) và - Visual c Nâng cao
ng định tuyến được xác lập trên tất cả các host (node, router) và (Trang 108)