GV: Nguyễn Thị Mai Trang 6thống và có một phần bộ nhớ thường trú – Nhiều chương trình có thể được kích hoạt chạy cùng một lúc – Tư tưởng hướng đối tượng: các cửa sổ ứng dụng chính và các
Trang 1GV: Nguyễn Thị Mai Trang 1
Tổng quan về Lập
trình Windows và
thư viện MFC
Trang 2GV: Nguyễn Thị Mai Trang 2
Giới thiệu thư viện lập trình MFC và môi
Trang 3GV: Nguyễn Thị Mai Trang 3
Thư viện lập trình MFC
Trang 4GV: Nguyễn Thị Mai Trang 4
– Các ứng dụng Windows có giao diện thống
nhất
• Cửa sổ hình chữ nhật
• Thanh tiêu đề
• Thanh thực đơn (menu)
• Thanh công cụ (Toolbar)
• Thanh cuộn (Scrollbar)
• Hộp hội thoại (Dialog)
• V
Trang 5GV: Nguyễn Thị Mai Trang 5
Trang 6GV: Nguyễn Thị Mai Trang 6
thống và có một phần bộ nhớ thường trú
– Nhiều chương trình có thể được kích hoạt chạy cùng một lúc
– Tư tưởng hướng đối tượng: các cửa sổ ứng dụng
chính và các cửa sổ con là các đối tượng của lớp cửa
sổ được đăng ký trước.
Giao diện đồ họa độc lập thiết bị
– Cho phép tạo các đối tượng đồ họa và định dạng văn bản
– Chương trình viết cho Windows không điều khiển trực tiếp thiết bị xuất ra màn hình, máy in mà thông qua một ngôn ngữ lập trình đồ họa gọi là Giao diện thiết bị
đồ họa (Graphics device Interface – GDI)
Trang 7GV: Nguyễn Thị Mai Trang 7
– Windows và các ứng dụng Windows hoạt động theo
cơ chế truyền – nhận thông điệp.
– Các hoạt động của chương trình thay đổi tùy theo
thông điệp nhận được.
– Thông điệp được truyền qua lại giữa những ứng dụng
và cửa sổ, giữa các ứng dụng với nhau.
– Cửa sổ ứng dụng được tự động vẽ lại mỗi khi có sự thay đổi về kích thước Điều này được thực hiện nhờ
hệ điều hành gởi thông điệp cho chương trình.
Trang 8GV: Nguyễn Thị Mai Trang 8
– Biểu tượng (icons).
– Con trỏ (cursors).
– Hình ảnh (Bitmaps).
– Bảng các chuỗi hằng (string tables).
– Bảng phím tắt (Accelerator).
– Hộp hội thoại (Dialog)
– Thanh thực đơn (menu)
– Thanh công cụ (toolbar)
– Siêu văn bản (HTML).
Trang 9GV: Nguyễn Thị Mai Trang 9
– Tài nguyên được Windows cung cấp sẵn (tài nguyên chuẩn).
– Tài nguyên do người sử dụng tạo thông qua một tập tin tài nguyên có phần mở rộng là rc
(Resource Script)
– Môi trường lập trình Windows cung cấp công
cụ để người sử dụng dễ dàng tạo, soạn thảo nội dung các tài nguyên.
Trang 10GV: Nguyễn Thị Mai Trang 10
Trang 11GV: Nguyễn Thị Mai Trang 11
Programming Interface):
– Là những hàm mà hệ điều hành Windows cung cấp
để cho các ứng dụng có thể sử dụng truy cập các tài nguyên trong hệ thống.
– Những hàm trên được chứa trong các thư viện liên
kết động (Dinamic Link Library – DLL) của hệ thống
và mọi ứng dụng đều có thể truy cập đến các hàm đó.
– Các chương trình ứng dụng sử dụng các hàm API thông qua các lời gọi hàm.
– Trong API có một số hàm có chức năng duy trì sự
độc lập thiết bị đồ họa, các hàm này gọi là giao diện
thiết bị đồ họa GDI (Graphics Device Interface)
Trang 12GV: Nguyễn Thị Mai Trang 12
– Mọi sự kiện xảy ra trên một chương trình
Windows đều thông qua những thông điệp
(messages)
– Thông điệp phát sinh khi: nhấn một nút trên bàn phím, di chuyển hoặc nhấn chuột, thay
đổi kích thước cửa sổV
– Với mỗi thông điệp nhận được, chương trình ứng dụng sẽ có hành động thích hợp đáp
ứng với thông điệp.
Trang 13GV: Nguyễn Thị Mai Trang 13
Trang 14GV: Nguyễn Thị Mai Trang 14
– Thông điệp được gởi vô hàng đợi thông điệp để chờ
xử lý (queue message): bao gồm các thông điệp
được phát sinh từ bàn phím, chuột
(WM_MOUSEMOVE, WM_LBUTTONDOWN,
WM_KEYDOWN, WM_CHAR,V)
• Windows dùng một hàng đợi để chứa thông điệp nhận được, mỗi một chương trình đều có một hàng đợi chứa thông điệp riêng
• Windows sẽ chuyển thông điệp từ hàng đợi chứa thông điệp của hệ thống đến hàng đợi chứa thông điệp của chương trình.
• Hàng đợi chứa thông điệp của chương trình chịu trách nhiệm giữ tất cả các thông điệp của tất cả các cửa sổ thuộc chương trình.
Trang 15GV: Nguyễn Thị Mai Trang 15
điệp thời gian, thông điệp vẽ, và thông điệp thoát như
WM_TIMER, WM_PAINT, WM_QUIT
– Với những ứng dụng đa tiểu trình thì mỗi một tiểu trình có tạo cửa sổ thì sẽ có một vòng lặp thông điệp để xử lý thông điệp của những cửa sổ trong tiểu trình đó.
Trang 16GV: Nguyễn Thị Mai Trang 16
– WM_CHAR: Một ký tự nhập từ bàn phím
– WM_CREATE: Một cửa sổ được tạo.
– WM_DESTROY: Một cửa sổ được hủy.
– WM_LBUTTONDOWN: Nhấn phím trái chuột
– WM_LBUTTONUP: Nhả phím chuột
– WM_PAINT: Một cửa sổ được vẽ lại
– WM_QUIT: Kết thúc ứng dụng
– WM_SIZE: Thay đổi kích thước cửa sổ
– WM_TIMER: sự kiện về thời gian
– V
Trang 17GV: Nguyễn Thị Mai Trang 17
Trang 18GV: Nguyễn Thị Mai Trang 18
Trang 19GV: Nguyễn Thị Mai Trang 19
Trang 20GV: Nguyễn Thị Mai Trang 20
Trang 21GV: Nguyễn Thị Mai Trang 21
Trang 22GV: Nguyễn Thị Mai Trang 22
int
int WINAPI WINAPI WINAPI WinMain WinMain WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpszCmdLine,
int nCmdShow)
Handle đến chương
trình hiện hành
Tham số dòng lệnh
Cách hiển thị cửa sổ (SW_SHOWNORMAL hoặc
SW_SHOWMINNOACTIVE)
Handle đến chương trình trước đó
Trang 23GV: Nguyễn Thị Mai Trang 23
– Định nghĩa lớp cửa sổ ứng dụng.
– Đăng ký lớp cửa sổ vừa định nghĩa.
– Tạo ra thể hiện cửa sổ của lớp đã cho.
– Hiển thị cửa sổ.
Trang 24GV: Nguyễn Thị Mai Trang 24
LRESULT CALLBACK WndProc ( HWND,
UINT, WPARAM, LPARAM );
Định danh cửa sổ
Định danh thông điệp
Thông tin bổ sung kèm
theo thông điệp
Trang 25GV: Nguyễn Thị Mai Trang 25
– Xử lý tất cả các thông điệp có liên quan đến cửa sổ
– Một chương trình Windows có thể chứa nhiều hơn
một hàm xử lý cửa sổ
– Một hàm xử lý cửa sổ luôn kết hợp với một lớp cửa
sổ đặc thù
– Hàm xử lý cửa sổ thường được đặt tên là WndProc.
– Hàm WndProc có chức năng giao tiếp với bên ngoài, tức là với Windows, toàn bộ các thông điệp gởi đến cửa sổ đều được xử lý qua hàm này.
Trang 26GV: Nguyễn Thị Mai Trang 26
UINT cbSize; //kích thước của cấu trúc
UINT style; //kiểu lớp
WNDPROC lpfnWndProc; //con trỏ đến thủ tục cửa sổ
int cbClsExtra; //các byte phụ trội để thêm
vào cấu trúc WNDCLASS khi đăng ký
int cbWndExtra; ;//các byte phụ trội để thêm
vào các đối tượng cửa sổ được tạo bởi lớp này
HANDLE hInstance; //istance làm chủ class này
HICON hIcon; //biểu tương khi cửa sổ hiển thị
HCURSOR hCursor; //con trỏ chuột
HBRUSH hbrBackground; //màu nền
LPCTSTR lpszMenuName; //tên menu
LPCTSTR lpszClassName; //tên lớp nhận biết
WNDCLASS này cho hệ thống
} WNDCLASSEZ;
Trang 27GV: Nguyễn Thị Mai Trang 27
– Sau khi định nghĩa một lớp cửa sổ, phải đăng
ký lớp cửa sổ đó bằng hàm RegisterClass
– ATOM RegisterClass( CONST WNDCLASS * lpWndClass );
Trang 28GV: Nguyễn Thị Mai Trang 28
HWND hwnd = CreateWindow (
ClassName, // Tên lớp cửa sổ đã đăng ký
WindowName, // tiêu đề cửa sổ
Style, // kiểu cửa sổ
x, // Vị trí ngang ban đầu
y, // Vị trí dọc ban đầu
Width, // Độ rộng ban đầu
Height, // Độ cao ban đầu
Parent, // Định danh của cửa sổ cha
Menu, // Định danh của menu
Instance, // Định danh thể hiện ứng dụng
Param); // Các tham số ban đầu
Trang 29GV: Nguyễn Thị Mai Trang 29
while ( GetMessage(&msg, NULL, 0 ,0) )
Trang 30GV: Nguyễn Thị Mai Trang 30
typedef struct tagMSG
thông tin phụ thuộc vào từng thông điệp
cụ thể
Thời gian đặt thông điệp trong
hàng đợi Tọa độ của chuột
Trang 31GV: Nguyễn Thị Mai Trang 31
– hwnd: Định danh của cửa sổ mà thông điệp phát sinh.
– message : Định danh của thông điệp, ví dụ như thông điệp phát sinh khi bấm nút chuột trái là
WM_LBUTTONDOWN có giá trị 0x0201.
– wParam : Tham số 32-bit chứa các thông tin phụ
thuộc vào từng thông điệp cụ thể.
– lParam : Tham số 32-bit phụ thuộc vào thông điệp.
– time : Thời gian đặt thông điệp trong hàng đợi.
– pt : Tọa độ của chuột khi đặt thông điệp vào hàng đợi
Trang 32GV: Nguyễn Thị Mai Trang 32
ngữ để mô tả kiểu dữ liệu, theo sau là tên biến
Trang 33GV: Nguyễn Thị Mai Trang 33
Class library) là một công cụ quan trọng để xây
dựng nhanh những chương trình ứng dụng trên nền Windows bằng ngôn ngữ C++
MFC được viết ra với mục đích làm cho việc lập trình Windows dễ dàng hơn bằng cách cung cấp những lớp đối tượng với những hành vi và thuộc tính (property) dưới dạng những biến handle giải quyết mọi công việc thông dụng trong chương trình Windows
Trang 34GV: Nguyễn Thị Mai Trang 34
ứng dụng (application framework) cho việc lập trình trên Windows.
cần thiết cho việc quản lý cửa sổ, các trình đơn, hộp hội thoại, thực hiện các thao tác xuất nhập cơ bản, lưu trữ tập hợp các đối tượng dữ liệu
Trang 35GV: Nguyễn Thị Mai Trang 35
– Cung cấp những đối tượng dễ dàng sử dụng
– MFC chứa đựng hầu hết các cấu trúc dữ liệu quan trọng và các lời gọi hàm API (Application Program Interface)
– Bao gồm các lớp đối tượng với sự gói gọn về
mã lệnh và dữ liệu trong một lớp và sự kế
thừa lớp.
– Cung cấp các hàm thư viện, các điều khiển, các thông điệp, đồ họa GDI, trình đơn và các hộp hội thoạiV
Trang 36GV: Nguyễn Thị Mai Trang 36
– Các lớp ứng dụng chính trong MFC bao gồm việc khởi tạo, chạy và chấm dứt ứng dụng
– Thư viện lập trình MFC có hơn 200 lớp, chia làm nhiều nhóm thực hiện các công việc đặc trưng như: quản lý ứng dụng, kiểu dữ liệu,
các ô điều khiển, khung đối thoại, đồ họaV
Trang 37GV: Nguyễn Thị Mai Trang 37
Trang 38GV: Nguyễn Thị Mai Trang 38
Trang 39GV: Nguyễn Thị Mai Trang 39
Trang 40GV: Nguyễn Thị Mai Trang 40
Trang 41GV: Nguyễn Thị Mai Trang 41
Trang 42GV: Nguyễn Thị Mai Trang 42
Trang 43GV: Nguyễn Thị Mai Trang 43
Trang 44GV: Nguyễn Thị Mai Trang 44
Trang 45GV: Nguyễn Thị Mai Trang 45
menu File, chọn NewV
Trang 46GV: Nguyễn Thị Mai Trang 46
kế tiếp chọn tùy theo yêu cầu của ứng
dụng hoặc có thể để mặc định
Trang 47GV: Nguyễn Thị Mai Trang 47
Workspace
Toolbox
Trang 48GV: Nguyễn Thị Mai Trang 48
Hình ảnh tổng thể
của project dưới
Những tài nguyên có trong project
Trang 49GV: Nguyễn Thị Mai Trang 49
ứng dụng như sau:
Trang 50GV: Nguyễn Thị Mai Trang 50
Trang 51GV: Nguyễn Thị Mai Trang 51
Trang 52GV: Nguyễn Thị Mai Trang 52
Trang 53GV: Nguyễn Thị Mai Trang 53
Trang 54GV: Nguyễn Thị Mai Trang 54
Trang 55GV: Nguyễn Thị Mai Trang 55
Trang 56GV: Nguyễn Thị Mai Trang 56
Các giá trị của m_nCmdShow: SW_SHOWNORMAL,
SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED
Trang 57GV: Nguyễn Thị Mai Trang 57
Trang 58GV: Nguyễn Thị Mai Trang 1
Thiết bị ngữ cảnh
và các phương
pháp vẽ
Trang 59GV: Nguyễn Thị Mai Trang 2
Giới thiệu giao diện thiết bị đồ họa GDI,
một công cụ rất quan trọng để vẽ các đối tượng hình học, hình ảnh và văn bản.
Giới thiệu một số hàm trong thư viện đồ
họa GDI để vận dụng vào việc lập trình
Qua chương này, sinh viên có thể xây
dựng được các ứng dụng xuất văn bản, hình ảnh và vẽ được một số đối tượng
theo yêu cầu.
Trang 60GV: Nguyễn Thị Mai Trang 3
Trang 61GV: Nguyễn Thị Mai Trang 4
Giới thiệu giao diện thiết bị đồ họa (GDI)
Hệ thống tọa độ
Các đối tượng thiết bị ngữ cảnh
Trang 62GV: Nguyễn Thị Mai Trang 5
GDI là ththư viện cung cấp các hàm và
các cấu trúc dữ liệu cần thiết để ứng dụng tạo ra những kết xuất dưới dạng đồ họa (hiển thị lên màn hình, in ra máy in,U)
đường cong, các hình đa giác, xuất ký tự, hiển thị ảnh bitmap, in ấn,U
GDI không tương tác trực tiếp với thiết bị phần cứng, mà thông qua các trình điều khiển thiết bị.
Trang 63GV: Nguyễn Thị Mai Trang 6
Các thiết bị đồ họa (Graphics device): Là những thiết bị cho phép thể hiện các kết xuất dạng đồ họa trên đóU
– Thiết bị vật lý (physical device): là những thiết
bị thật như màn hình, cửa sổ, máy in,U
– Thiết bị “ảo” (logical device): là các thiết bị
được giả lập trong bộ nhớ, còn gọi là
“memory device”, có tác dụng mô phỏng thiết
bị vật lý
Trang 64GV: Nguyễn Thị Mai Trang 7
Trang 65GV: Nguyễn Thị Mai Trang 8
Muốn sử dụng một hệ thống tọa độ khác, gọi hàm CDC::SetMapMode
Ví dụ:
Trang 66GV: Nguyễn Thị Mai Trang 9
Bút vẽ (pen) : để vẽ các đường thẳng và hình dáng
Chổi vẽ (brush): để tô các vùng của hình
vẽ trên màn hình
Kiểu chữ (font) : hiển thị văn bản
Màu (colors).
Trang 67GV: Nguyễn Thị Mai Trang 10
Trang 68GV: Nguyễn Thị Mai Trang 11
Trang 69GV: Nguyễn Thị Mai Trang 12
CPaintDC: Vẽ trong vùng client của cửa
sổ, đáp ứng với sự kiện WM_PAINT, dùng trong hàm OnPaint()
CClientDC: tạo ra một ngữ cảnh thiết bị vẽ trong vùng client của cửa số, có thể sử
Trang 70GV: Nguyễn Thị Mai Trang 13
Quy trình vẽ
Tạo và sử dụng các đối tượng thiết bị ngữ cảnh
Các thao tác vẽ cơ bản
Trang 71GV: Nguyễn Thị Mai Trang 14
Trang 72GV: Nguyễn Thị Mai Trang 15
Trang 73GV: Nguyễn Thị Mai Trang 16
Ngoài ra, có thể sử dụng đối tượng thuộc các lớp thiết bị ngữ cảnh theo hai cách:
– Khai báo đối tượng, sử dụng phương thức
thiết lập của lớp (không cần hủy đối tượng)
– Tạo một đối tượng của lớp thiết bị ngữ cảnh (phải hủy sau khi sử dụng)
Trang 74GV: Nguyễn Thị Mai Trang 17
Các lớp đối tượng thiết bị ngữ cảnh dùng để vẽ bao gồm:
– CPen: công cụ vẽ điểm hoặc đường thẳng
– CBrush: công cụ tô màu
– CFont: công cụ tạo phông chữ
Trang 75GV: Nguyễn Thị Mai Trang 18
Tạo bút vẽ
Trang 76GV: Nguyễn Thị Mai Trang 19
Một số nét vẽ
Trang 77GV: Nguyễn Thị Mai Trang 20
Trang 78GV: Nguyễn Thị Mai Trang 21
Trang 79GV: Nguyễn Thị Mai Trang 22
Trang 80GV: Nguyễn Thị Mai Trang 23
Trang 81GV: Nguyễn Thị Mai Trang 24
Trang 82GV: Nguyễn Thị Mai Trang 25
Chọn đối tượng thiết bị ngữ cảnh
– Sử dụng hàm SelectObject để chọn một đối tượng thiết bị ngữ cảnh
– Các đối tượng có thể được chọn với
Trang 83GV: Nguyễn Thị Mai Trang 26
Chọn đối tượng thiết bị ngữ cảnh (tt)
– Sử dụng hàm SelectStockObject để chọn một đối tượng thiết bị ngữ cảnh chuẩn
–
Trang 84GV: Nguyễn Thị Mai Trang 27
Trang 85GV: Nguyễn Thị Mai Trang 28
– SetPixel: vẽ một điểm
– MoveTo: Đặt vị trí hiện hành trước khi vẽ.
– LineTo : vẽ đoạn thẳng từ vị trí hiện tại đến điểm cuối đoạn thẳng
– PolyBezier: Vẽ một hoặc nhiều đường cong bất kỳ.
– PolyBezierTo: Vẽ đường cong và đặt vị trí hiện hành tại cuối đường cong vừa vẽ
Trang 86GV: Nguyễn Thị Mai Trang 29
PolyBezier
Trang 87GV: Nguyễn Thị Mai Trang 30
Trang 88GV: Nguyễn Thị Mai Trang 31
– Mặc định, một cung được vẽ ngược chiều kim đồng hồ.
– Để thay đổi chiều vẽ cung, sử dụng hàm:
int SetArcDirection(int nArcDirection);
Trang 89GV: Nguyễn Thị Mai Trang 32
Một số ví dụ
Trang 90GV: Nguyễn Thị Mai Trang 33
Một số ví dụ
Trang 91GV: Nguyễn Thị Mai Trang 34
Trang 92GV: Nguyễn Thị Mai Trang 35
Ellipse và Circle
Trang 93GV: Nguyễn Thị Mai Trang 36
Trang 94GV: Nguyễn Thị Mai Trang 37
Trang 95GV: Nguyễn Thị Mai Trang 38
Trang 96GV: Nguyễn Thị Mai Trang 39
Một số ví dụ
Trang 97GV: Nguyễn Thị Mai Trang 40
Một số ví dụ
Trang 98GV: Nguyễn Thị Mai Trang 41
Một số ví dụ
Trang 99GV: Nguyễn Thị Mai Trang 42
Một số ví dụ
Trang 100GV: Nguyễn Thị Mai Trang 43
Trang 101GV: Nguyễn Thị Mai Trang 44
Giới thiệu một số hàm vẽ văn bản
Font chữ:
– Các hàm tạo font chữ
– Sử dụng font
Một số ví dụ
Trang 102GV: Nguyễn Thị Mai Trang 45
Trang 103GV: Nguyễn Thị Mai Trang 46
– CreateFont
– CreateFontIndirect
– CreatePointFont
– CreatePointFontIndirect
Trang 104GV: Nguyễn Thị Mai Trang 47
Chiều cao, rộng
Góc giữa hai ký tự Phương và chiều
Kiểu in đậm, nghiêng, gạch dưới, gạch ngang thân chữ
Tên font chữ
Trang 105GV: Nguyễn Thị Mai Trang 48
Ví dụ
Trang 106GV: Nguyễn Thị Mai Trang 49
Ví dụ
Trang 107GV: Nguyễn Thị Mai Trang 50
Trang 108GV: Nguyễn Thị Mai Trang 51
Tạo font chữ với cấu trúc LOGFONT
Trang 109GV: Nguyễn Thị Mai Trang 52
Ví dụ
Trang 110GV: Nguyễn Thị Mai Trang 53
Trang 111GV: Nguyễn Thị Mai Trang 54
Ví dụ
Trang 112GV: Nguyễn Thị Mai Trang 55
Trang 113GV: Nguyễn Thị Mai Trang 56
– Kết quả hiển thị
Trang 114GV: Nguyễn Thị Mai Trang 57
Trang 115GV: Nguyễn Thị Mai Trang 58
– Kết quả hiển thị
Trang 116GV: Nguyễn Thị Mai Trang 59
Khái niệm về Memory Device Context (MDC)
Tạo và sử dụng MDC
Trang 117GV: Nguyễn Thị Mai Trang 60
Nếu thực hiện nhiều thao tác vẽ trực tiếp trên thiết bị ngữ cảnh của màn hình →
màn hình bị giật → Khắc phục: sử dụng
MDC (còn gọi là thiết bị ngữ cảnh ảo).
Memory device context (MDC) là một thiết
bị ảo không gắn với một thiết bị xuất cụ
thể nào MDC được sử dụng như một thiết
bị ngữ cảnh trung gian để vẽ trước khi
xuất ra màn hình.
Trang 118GV: Nguyễn Thị Mai Trang 61
– Tạo ra một thiết bị ngữ cảnh ảo (MDC) trong
bộ nhớ tương thích với thiết bị ngữ cảnh thật,
sử dụng hàm CreateCompatibleDC
– Bề mặt hiển thị ban đầu của MDC rất nhỏ, chỉ
là một pixel Do đó, cần chọn một đối tượng bitmap GDI vào MDC.
– Thực hiện các thao tác vẽ trên MDC này
– Chép nội dung của MDC vào DC thật
– Hủy MDC
Trang 119GV: Nguyễn Thị Mai Trang 62