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

lập trình windows

84 138 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 đề Lập Trình Windows
Tác giả Phạm Ngọc Hưng
Trường học Trường Đại Học Bách Khoa Hà Nội
Chuyên ngành Công Nghệ Thông Tin
Thể loại Học phần
Năm xuất bản 2025
Thành phố Hà Nội
Định dạng
Số trang 84
Dung lượng 5,15 MB

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

Nội dung

Lập trình Windows với C/C++

Trang 1

TRƯỜNG ĐẠI HỌC B\CH KHOA H[ NỘI

VIỆN CÔNG NGHỆ THÔNG TIN V[ TRUYỀN THÔNG

– Bài tập: 15 tiết

• Học phần tiên quyết:

– Ngôn ngữ lập trình C, C++

2 Lập trình Windows

• Chương 3 Một số chủ đề nâng cao

– Tạo thư viện liên kết động (DLL) (3LT + 2BT)

Tài liệu tham khảo

• 1 Ivor Horton’s, Beginning Visual C++ 2010

• 3 Sams teach yourself VC++ 6 in 21 days

• 4 MSDN

• 5 http://www.functionx.com/visualc/

Trang 2

Chương 1 Tổng quan lập trình Windows

• 1.1 Cơ bản về lập trình Windows (1T)

• 1.2 Cấu trúc của chương trình Windows (2T)

• 1.3 Microsoft Foundation Classes (MFC)

• 1.4 Lập trình Windows với VC++ 2008

(1LT + 1BT)

5 Lập trình Windows

– Windows, title bar, toolbar, menu bar, status bar

– Thanh thực đơn: File, Edit, Tool, Help…

– Hộp thoại: thường chứa các điều khiển chung: Edit

Control, Button Control, Checkbox….

6 Lập trình Windows

Các thành phần của một cửa sổ

7 Lập trình Windows

Cơ chế lập trình Event-driven

8 Lập trình Windows

Trang 3

Thông điệp (Windows Messages)

• Hệ thống (Windows) ghi lại mỗi sự kiện xảy ra

(event) trong một thông điệp (message) và đặt

trong hàng đợi thông điệp (messages queue)

• Thông điệp phát sinh:

Windows Message (cont.)

• HĐH Windows đảm nhiệm việc truyền tất cả các thông điệp của ứng dụng vào các cửa sổ khác nhaucủa ứng dụng đó

• Một chương trình Windows phải chứa một hàmđặc biệt để xử lý các thông điệp gọi là hàm xử lý

cửa sổ WinProc (hoặc WindowProc):

– Được gọi khi có bất kỳ thông điệp được truyềnđến cửa sổ (thông qua con trỏ hàm)

– Xử lý các thông điệp đó và trả điều khiển về cho

hệ thống

• Nhiều thông điệp trả lại cho Windows xử lý, gọihàm DefWindowProc( )

10 Lập trình Windows

• Application Programming Interface: Giao

diện lập trình ứng dụng

• Cung cấp các hàm truy cập tài nguyên trong

hệ thống (Windows) chứa trong các thư viện liên kết động DLL.

• Các ứng dụng có thể truy cập đến các hàm API

• Các hàm GDI (Graphics Device Interface) cho phép ứng dụng làm việc với nhiều kiểu thiết

bị đồ họa.

Trang 4

Windows Data Types (1)

• Định nghĩa nhờ từ khóa typedef trong các tập tin (windef.h;

winbase.h, winuser.h được include trong windows.h).

• Ví dụ:

– typedef int INT;

– typedef unsigned int UINT;

– char * PSTR

• WPARAM (UINT) và LPARAM (LONG) đều 32 bit

• LRESULT: kiểu LONG

• HANDLE: Một gi| trị 32bits không dấu (unsigned) do HĐH

tạo ra để l{m định danh cho 1 đối tượng (file, cửa sổ, vùng

nhớ, menu, toolbar…) Ví dụ : HWND, HINSTANCE,

hPrevInstance

13 Lập trình Windows

Windows Data Types (2)

HANDLE Số nguyên 32-bit, định danh.

HWND Số nguyên 32-bit, định danh.

BYTE Giá trị 8-bit không dấu.

WORD Số nguyên 16-bit không dấu.

DWORD Số nguyên 32-bit không dấu.

UINT Số nguyên không dấu 32-bit.

LONG long 32-bit.

BOOL Kiểu logic True/False

LPSTR Con trỏ chuỗi (char *)

LPCSTR Hằng con trỏ chuỗi.

WPARAM 32-bit.

LPARAM 32-bit.

BSTR Giá trị 32-bit trỏ đến kí tự.

LPVOID Con trỏ 32-bit đến một kiểu không xác định.

LPTSTR Giống như DBCS. LPSTRnhưng có thể chuyển sang dạng Unicode và LPCTSTR Giống như DBCS. LPCTSTRnhưng có thể chuyển sang dạng Unicode và

14 Lập trình Windows

Microsoft style (1)

• Tất cả c|c kiểu dữ liệu mở rộng của windows , tên class, tên

struct, tên hằng số định sẵn đều được viết in hoa

Ví dụ :

Tên kiểu dữ liệu : UINT , ATOM , HANDLE, HWND, BYTE,….

Tên cấu trúc : MSG, PAINSTRUCT, WNDCLASS ,

Tên hằng số định sẵn : NULL, IDI_APPLICATION,

CS_VREDRAW,…

• Tất cả c|c method (c|c h{m, c|c phương thức) đều được viết

hoa (pascal notation)

Microsoft Style (2)

• Qui ước: bắt đầu (tiền tố) chữ thường thể hiện kiểu dữ liệu biến.

• Ví dụ: szCmdLine là một biến lưu chuỗi nhập

từ dòng lệnh, sz là thể hiện cho biến kiểu

chuỗi kết thúc ký tự 0,

• hInstance và hPrevInstance, trong đó h viết

tắt cho kiểu handle.

16 Lập trình Windows

Trang 5

Microsoft Style (3) – Tiền tố tên biến

Tiền tố Kiểu dữ liệu

Microsoft style (4) - Calling convention

• Định nghĩa kiểu h{m gọi bởi Windows OS

#define CALLBACK stdcall

#define WINAPI stdcall

#define APIENTRY WINAPI

#define APIPRIVATE stdcall

#define PASCAL stdcall

• Thêm vào trước tên hàm để chỉ ra cho compiler rằng hàm này có cách tổ chức phục

vụ cho việc gọi đến như thế nào.

18 Lập trình Windows

• Chương trình Windows đơn giản (dùng hàm API)

gồm 2 hàm WinMain() và hàm xử lý cửa sổ WinProc().

• WinMain() thực hiện các chức năng:

– Tell Windows what kind of window the program requires – Create the program window

– Initialize the program window – Retrieve Windows messages intended for the program

• WinProc(): xử lý các thông điệp liên quan đến cửa

sổ của nó

Trang 6

1.2.1 Hàm WinMain()

• Hàm chính của ứng dụng trên Windows

• Program entry point

• hInstance, is a handle to the instance of the program you

are writing.

• hPrevInstance, is used if your program had any previous

instance If not, this argument can be ignored.

• szCmdLine, is a string that represents all items used on the

command line to compile the application.

• nCmdShow, controls how the window you are building will

Hàm WinMain (cont.)

• Tìm hiểu hàm WinMain mẫu:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

wndclass.style = SC_HREDRAW | CS_VREDRAW;

wndclass.lpfnWndProc = WndProc; // Hàm thủ tục cửa sổ

wndclass.cbClsExtra = 0

wndclass.cbWndExtra = 0

wndclass.hInstance = hInstance; // Ðịnh danh ứng dụng

wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wndclass.hCursor = LoadCusor (NULL, IDC_ARROW);

wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

wndclass.lpszMenuName = NULL; // Không có menu

22

Tìm hiểu hàm WinMain mẫu (cont.)

wndclass.lpszClassName = szAppName; // tên ứng dụng

/* Ðăng ký lớp cửa sổ */

if (!RegisterClass(&wndclass)) return 0

/* Tạo thể hiện lớp cửa sổ đã định nghĩa */

hwnd = CreateWindow(szAppName, // Tên cửa sổ

"Hello Program" , // Tiêu đề

WS_OVERLAPPEDWINDOW, // Kiểu cửa sổ

CW_USEDEFAULT, // Toạ độ x

CW_USEDEFAULT, // Toạ độ y

CW_USEDEFAULT, // Chiều rộng

CW_USEDEFAULT, // Chiều dài

NULL, // Cửa sổ cha

NULL, // Không có menu

/* Chu trình xử lý các thông điệp*/

while (GetMessage (&msg, NULL, 0 , 0 )) {

Định nghĩa lớp cửa sổ WNDCLASS

• Windows cung cấp một cấu trúc WNDCLASS (file

winuser.h) gọi là lớp cửa sổ

• Lớp này chứa các thuộc tính tạo thành một cửa sổ

typedef struct _WNDCLASS

{ UINT style;

Trang 7

Định nghĩa lớp cửa sổ WNDCLASS

• Ý nghĩa thuộc tính lớp cửa sổ WNDCLASS:

Thuộc tính Ý nghĩa Ghi chú

style Kiểu lớp Kết hợp nhiều kiểu giá trị khác nhau bằng

toán tử OR.

lpfnWndProc Con trỏ đến thủ tục xử lý cửa sổ

cbClsExtra Số byte được cấp phát thêm sau

cấu trúc window-class Mặc định

cbWndExtra Số byte được cấp phát thêm sau

một instance của window Mặc định

hInstance Định danh chứa thủ tục cửa sổ

của lớp window

hIcon Định danh của biểu tượng Dùng hàm LoadIcon

hCursor Định danh của con trỏ chuột Dùng hàm LoadCursor

hbrBackground Định danh của chổi tô nền Dùng hàm GetStockObject

lpszMenuName Tên thực đơn

Tên thực đơn gắn với cửa sổ, thực đơn này được khai báo trong tập tin tài nguyên.

Tạo cửa sổ

• Lớp cửa sổ thể hiện đặc tính chung cửa sổ Cho

phép tạo nhiều thể hiện cửa sổ của lớp

• Dùng hàm CreateWindow, chỉ định các đặc tính

riêng của cửa sổ, và phân biệt nó với các cửa sổ

khác tạo ra cùng một lớp

HWND CreateWindow(LPCSTR lpClassName, // Tên lớp cửa sổ đã đăng ký

LPCSTR lpwindowName, // Tên của cửa sổ

DWORD dwStyle, // Kiểu của cửa sổ

int x, // Vị trí ngang ban đầu

int y, // Vị trí dọc ban đầu

int nWidth, // Ðộ rộng ban đầu

int nHeight, // Ðộ cao ban đầu

HWND hWndParent, // Ðịnh danh của cửa sổ cha

MENU hMenu, // Ðịnh dang của thực đơn

INSTANCE hInstance, // Ðịnh danh thể hiện ứng dụng

PVOID lpParam// Các tham số ban đầu

)

Hiển thị cửa sổ

• Sau khi tạo cửa sổ định danh cửa sổ HWND

• Để xuất hiện cửa sổ gọi hàm ShowWindow

BOOL ShowWindow(HWND hWnd, // Ðịnh danh của cửa sổ cần thể hiện

int iCmdShow // Trạng thái hiển thị

)

• Một số trạng thái hiển thị (iCmdShow):

SW_HIDE: Ẩn cửa sổ.

SW_MAXIMIZE: Phóng cửa sổ ra toàn bộ màn hình.

SW_MINIMIZE: Thu nhỏ thành biểu tượng trên màn hình.

SW_RESTORE: Hiển thị dưới dạng chuẩn.

Trang 8

1.2.2 Hàm xử lý thông điệp WinProc

• Có thể có nhiều hơn một hàm xử lý thông điệp

• Luôn đi kèm cửa sổ của nó

• Giao tiếp với hệ thống (Windows), toàn bộ các

thông điệp gửi tới được xử lý qua hàm này

• Thường khai báo như sau:

• Trong đó tham số đầu tiên là định danh của cửa sổ,

tham số thứ 2 là định danh thông điệp, và cuối cùng

là 2 tham số WPARAM và LPARAM bổ sung thông

tin kèm theo thông điệp

LRESULT CALLBACK WinProc (HWND, UINT, WPARAM, LPARAM);

29 Lập trình Windows

• Ứng dụng nhận thông điệp từ hàng đợi bằng đoạnmã:

MSG msg; // Windows message structure

TranslateMessage (&msg);

DispatchMessage (&msg);

}

30 Lập trình Windows

Message Loop

• Trong đó msg là một biến cấu trúc kiểu MSG được

định nghĩa trong winuser.h

typedef struct tagMSG {

• POINT là kiểu tọa độ điểm, định nghĩa trong windef.h

typedef struct tagPOINT {

Trang 9

33 Lập trình Windows

Hàm xử lý thông điệp WinProc - Ví dụ

• Tìm hiểu một hàm xử lý cửa sổ:

LRESULT CALLBACK WinProc (HWND hwnd, UINT msg, WPARAM

wParam, LPARAM lParam) {

• Thông thường chỉ chặn để xử lý các thông điệp cần thiết, còn

DefWindowProc

DrawText(hdc, "Hello" , - 1 , &rect,

DT_SINGLELINE| DT_CENTER| DT_VCENTER);

Trang 10

1.2.3 Chương trình Windows đơn giản

- Chương trình: HelloWorld (Sử dụng trực tiếp

Windows API)

- 2 hàm chính

- Hàm WinMain: thực hiện c|c chức năng

- Khai b|o lớp cửa sổ

- Đăng ký lớp cửa sổ vừa khai b|o

- Tạo v{ hiển thị lớp cửa sổ

- Vòng lặp nhận thông điệp v{ gửi tới thủ tục xử lý

- Hàm WinProc: H{m xử lý thông điệp gửi đến C|c

thông điệp được Windows xử lý mặc định bằng h{m

DefWindowProc()

37 Lập trình Windows

Win32 Application in Visual C++ Developer Studio

38 Lập trình Windows

HelloWorld (1)

/* HELLOWORLD.C */

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR

szCmdLine, int iCmdShow)

wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);

wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);

hwnd = CreateWindow(szAppName, // Tên lớp cửa sổ

TEXT ( " The Hello World Program" ), //

Trang 11

DrawText(hdc, TEXT( "Hello World" ), - 1 , &rect,

DT_SINGLELINE | DT_CENTER | DT_VCENTER);

HelloWorld (run)

42 Lập trình Windows

Ý nghĩa các hàm trong HelloWorld

Tên hàm Ý nghĩa

LoadIcon Nạp một biểu tượng để sử dụng trong chương trình.

LoadCursor Nạp một con trỏ chuột cho chương trình.

MessageBox Hiển thị một thông điệp.

CreateWindow Tạo một cửa sổ dựa trên một lớp cửa sổ.

ShowWindow Hiển thị cửa sổ lên màn hình.

UpdateWindow Yêu cầu cửa sổ vẽ lại chính bản thân nó.

GetMesssage Nhận một thông điệp từ hàng đợi thông điệp.

TranslateMessage Dịch thông điệp bàn phím.

DispatchMessage Gởi thông điệp đến hàm xứ lý cửa sổ.

BeginPaint Khởi tạo chức năng vẽ của cửa sổ.

GetClientRect Lấy hình chữ nhật lưu vùng làm việc.

DrawText Hiển thị một chuỗi văn bản.

EndPaint Kết thúc việc vẽ cửa sổ.

PostQuitMessage Đưa thông điệp thoát vào hàng đợi thông điệp.

1.3 Microsoft Foundation Classes (MFC)

• MFC = Microsoft Foundation Classes

• Thư viện c|c lớp đóng gói c|c h{m Win32 API

• Tập hợp các lớp C++ (methods, members) và hàm toàn cục

• Phát triển ứng dụng Windows dễ dàng, rút ngắn thời gian (so với lập trình Windows API).

• Program user interface

Trang 12

MFC và Win32 API

• Win32 API: tập hợp các hàm, cấu trúc, thông

điệp, macros và interfaces

– Cho phép phát triển ứng dụng Win32 platforms

– Program low-level, tiêu tốn thời gian

– Hàm: BOOL ShowWindow(HWND hWnd, int nCmdShow);

– Được đóng gói trong MFC:

BOOL CWnd::ShowWindow(int nCmdShow);

46 Lập trình Windows

MFC Application Framework

• Ngoài việc đóng gói của Win32 API, MFC còn định

nghĩa một nhóm các lớp để biểu biễn các object ứng

dụng chung và thiết lập mối quan hệ trong nhóm

này để thực thi các hành vi của ứng dụng

• Application Framework: một nền tảng để xây dựng

các ứng dụng

• Dùng MFC Wizard để tạo ra tập hợp các lớp dẫn

xuất từ các lớp của framework

• Hoặc xây dựng các lớp mới theo yêu cầu sử dụng

47

Trang 13

Cấu trúc ứng dụng MFC

• Ứng dụng MFC cung cấp:

– Một lớp biểu diễn ứng dụng (Application Class)

– Một lớp biểu diễn cửa sổ chính của ứng dụng

(Main Window)

– Triển khai h{m WinMain() (được ẩn đi)

(WinMain() Function)

49 Lập trình Windows

1.4 Lập trình Windows với VC++ 2008

• 3 c|ch tạo ứng dụng Windows với VC++:

– Ứng dụng sử dụng trực tiếp Windows API(Win32 Project)

– Ứng dụng sử dụng MFC(MFC Application)– Ứng dụng Windows Form(CLR/Windows Form Application)

50 Lập trình Windows

Môi trường phát triển tích hợp VC++ (2008)

• Rearranging on the IDE

VC++ 2008 Developer Studio Environment

-Solution Explorer -Class View -Resource View

Properties

Editor Area

Output

ToolBox

Trang 14

The Solution

• Solution Explorer: allows you to view and

navigate all the files that make up your

application.

• Class View allows you to navigate and

manipulate your source code on a C++ class

level.

• Resource View: allows you to find and edit

each of the various resources in your

application, including dialog window

designs, icons, and menus.

53 Lập trình Windows

Output Pane & Editor Area

• Output Pane:

– Cung cấp thông tin cho người lập trình – Compiler progress statements – Warnings, error messages – Thông tin debugger:

– Current values of variables when step through code (Cửa

sổ Watch)

• Editor Area:

– Soạn thảo m~ lệnh – Thiết kế giao diện (Design mode) – Icon Editor

54 Lập trình Windows

Menu Bar + Rearranging IDE

• Menu bar + Tool bars

• Kéo thả, bố trí c|c cửa sổ l{m việc

• Floating, Dock, Auto hiden, ….

55 Lập trình Windows

C|c th{nh phần ứng dụng ph|t triển với VC++

56

Trang 15

Character Sets, và _T macro (1)

• Old Windows: Tập ký tự ANSI 8 bit

• Windows NT: Tập ký tự Unicode 16 bit (bao

trùm ANSI)

• Biên dịch ứng dụng VC++ trên Windows NT

có thể chọn sử dụng Unicode hoặc không.

• Nếu một chuỗi “Hello” thì trình biên dịch sẽ

thể hiện dạng ANSI (8bit/1 ký tự).

• Nếu chuỗi L”Hello” thì trình biên dịch sẽ thể

hiện dạng chuỗi Unicode.

57 Lập trình Windows

Character Sets, và _T macro (2)

• Dùng macro _T (của MFC) cho chuỗi dạng

_T(“Hello”) thì kết quả sẽ được thể hiện dạng

Unicode nếu ký hiệu tiền xử lý _UNICODE được định nghĩa (chọn kiểu chuỗi ký tự Unicode cho ứng dụng), nếu không mặc định l{ ký tự ANSI.

58

Character Sets và _T macro (3)

• Kiểu TCHAR (dùng thay cho kiểu char):

– L{ wchar_t (Unicode 16 bit) nếu _UNICODE được định

nghĩa

– L{ char (ANSI 8 bit) nếu _UNICODE không được định

nghĩa

• Tương tự, nên dùng TCHAR* hoặc LPTSTR (con

trỏ chuỗi) thay cho wchar_t*, hoặc char*

• LPCTSTR: con trỏ tới chuỗi hằng

• Sử dụng sizeof(TCHAR) để x|c định độ rộng ký tự

(8 hay 16 bit)

• Sử dụng c|c macro trong thư viện tchar.h thay cho

c|c h{m xử lý ký tự/chuỗi của thư viện C-runtime

Exercises Chapter 1.

• Ex1-1 HelloWorld– Tạo project Win32 Project như ví dụ lý thuyết– Triển khai h{m WinMain, WinProc, cơ chế thông điệp

• Ex1-2 HelloMFC– Tìm hiểu sử dụng IDE Visual studio– Tạo project MFC appllication, sử dụng Wizard– Code view, design view

– Compile, debug, run

Trang 16

Create a project

Tên ứng dụng

61 Lập trình Windows

Sử dụng Wizard

62 Lập trình Windows

Chọn kiểu ứng dụng

Sử dụng thư viện Unicode

Thiết kế giao diện ứng dụng (Dialog)

63 Lập trình Windows

Add code to greeting (1)

• Button “Hello”: Right Mouse/Add Event Handler

Chọn sự kiện, tên hàm xử lý

64 Lập trình Windows

Trang 17

Add code to greeting (2)

65 Lập trình Windows

Compile, Build, Debug, Run

Compile (Ctrl+F7), Build (F6),

Debug (F5), Run without Debug (Ctrl+F5) Set Breakpoint (F9) and Run Debug

• 2.7 Sử dụng các điều khiển (controls)

2.1 Message Map trong MFC (1)

• Lập trình MFC cho phép viết c|c h{m để xử lý c|c thông điệp (messages) mong muốn (Ngo{i c|c xử

lý mặc định được MFC cung cấp)

• Gọi l{ c|c message handlers (hoặc handlers)

(cũng l{ h{m th{nh viên của lớp v{ được ph}n biệt bằng tiền tố afx_msg)

• Cơ chế liên kết giữa thông điệp v{ h{m xử lý được

x|c định bởi Message Map (\nh xạ thông điệp)

Trang 18

2.1 Message Map trong MFC (2)

• Mỗi lớp có xử lý thông điệp sẽ triển khai một

Message Map Sử dụng c|c macro:

– DECLARE_MESSAGE_MAP() trong file h

2.1 Message Map trong MFC (3)

• Xét một ví dụ ứng dụng MFC đơn giản:

70 Lập trình Windows

Message Map trong MFC (2)

71 Lập trình Windows

Qu| trình xử lý thông điệp trong MFC

72 Lập trình Windows

Trang 19

Ph}n loại thông điệp trong MFC

Thông điệp chuẩn của Windows, bắt đầu với WM_

(Ngoại trừ c|c thông điệp WM_COMMAND)

Ví dụ: WM_PAINT, WM_LBUTTONUP, …

Control

Notification

Messages

Các thông điệp WM_COMMAND được gửi từ c|c điều

khiển (Controls) như Button, CheckBox, … đến cửa sổ

chứa chúng, hoặc từ cửa sổ con đến cửa sổ cha.

Tham số đi kèm (IDs) cho biết gửi từ controls n{o

Command

Messages

Cũng l{ c|c thông điệp WM_COMMAND nhưng được

từ c|c th{nh phần giao diện người dùng như menu

items, toolbar buttons (Được MFC định nghĩa c|c IDs

chuẩn, người dùng có thể tạo thêm)

73 Lập trình Windows

Add Message Handlers

• Có thể l{m thủ công (Manual) (Viết trong Message Map)

• Hoặc chọn Properties/Message

74 Lập trình Windows

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx) ON_WM_CREATE()

ON_COMMAND(ID_WINDOW_MANAGER,

&CMainFrame::OnWindowManager) ON_COMMAND(ID_VIEW_CUSTOMIZE,

&CMainFrame::OnViewCustomize) ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR,

• Có thể lựa chọn Document Interfaces:

– SDI (Single Document Interface): Hiển thị một t{i liệu (Document) mỗi lần trên một cửa sổ (view)– MDI (Multiple Document Interface): Cho phép

mở nhiều t{i liệu một lúc

• Đều được hợp th{nh bởi c|c th{nh phần CDocument và Cview

• Có thể tạo ứng dụng MFC kiểu kiến trúc SDI/MDI

Trang 20

Khung ứng dụng dạng SDI

• Chỉ mở một t{i liệu

77 Lập trình Windows

Khung ứng dụng dạng MDI

• Cho phép mở nhiều t{i liệu

78 Lập trình Windows

Ứng dụng MFC based Document/View

• Trong qu| trình tạo ứng dụng dạng SDI v{

MDI, c|c class được tạo ra hầu hết được kế

thừa (dẫn xuất) từ c|c class như:

– Với dạng SDI: CWinApp, CFrameWnd,

CDocument, CView

– Với dạng MDI: CWinApp, CMDIFrameWnd,

CMDIChildWnd, CDocument, CView

79 Lập trình Windows

Ứng dụng MFC based Document/View

• Kiểu SDI

80

Trang 21

Mô tả vai trò các class

81 Lập trình Windows

Cấu trúc Document/View dạng SDI

82 Lập trình Windows

• Với cả 2 dạng SDI v{ MDI, sự liên kết thể hiện thông qua 1 biến pointer kiểu đối tượng lớp CDocument (biến n{y thường có tên l{ pDoc) Thông qua biến n{y, có thể điều khiển thao t|c chuyển thông tin (từ lớp CView sang CDocument) hay lấy thông tin về (từ lớp CDocument sang lớp CView)

• Thông thường, với cả ứng dụng dạng SDI hay MDI

thì trong lớp CView luôn có h{m GetDocument

nhằm hỗ trợ việc lấy biến con trỏ n{y

Trang 22

Lớp CDocument

Một số phương thức quan trọng:

• virtual BOOL OnNewDocument();

• virtual BOOL OnOpenDocument(LPCTSTR

lpszPathName);

• void SetModifiedFlag(BOOL bModified =

TRUE); (Đ|nh dấu: clean/dirty)

• BOOL IsModified();

• virtual void OnCloseDocument();

• virtual BOOL OnSaveDocument(LPCTSTR

lpszPathName);

CDocument::DeleteContents

86 Lập trình Windows

Lớp CView

• CDocument giữ nội dung t{i liệu Để hiển thị, lớp

CView tạo ra con trỏ đến lớp CDocument

– CDocument* GetDocument() const;

• OnDraw: Vẽ cửa sổ View

• OnInitialUpdate: Được gọi trước khi một view khởi

C|c lớp View cung cấp sẵn

• MFC x}y dựng sẵn c|c lớp View hỗ trợ c|c dạng giao diện hiển thị dữ liệu (chọn dẫn xuất từ lớp base tương ứng)

88 Lập trình Windows

Trang 23

Ex2-1 Ứng dụng TextEditor

• X}y dựng ứng dụng MFC kiến trúc SDI

• Có c|c tính năng soạn thảo đơn giản (Tương tự

Notepad)

89 Lập trình Windows

App Wizard

• X}y dựng ứng dụng kiến trúc SDI

90 Lập trình Windows

App Wizard

Chọn lớp CView sẽ kế thừa (base class)

– Keep the Use Unicode libraries option.

– Specify the file extension as ske to get a filter for *.ske documents defined

– Change the Generated Classes set of options at their default settings so that the base class for the CSketcherView class is CView.

Trang 24

App Wizard

93 Lập trình Windows

2.3 Menu và Toolbar

• 2.3.1 Menu– Một v{i kh|i niệm– Tạo lập Menu– Xử lý

– B{i tập

94 Lập trình Windows

Menu – Một vài khái niệm

• Menu bar: bao gồm nhiều drop-down menu và

menu items

• Drop-down menu: chứa menu item hoặc

drop-down menu khác (File, Edit, …)

• Menu items: tương ứng với một lệnh của chương

trình Xác định bằng ID riêng biệt, item ID hay

command ID (Open, Save, …)

• Pop-up menu: giống drop-down menu nhưng có

thể xuất hiện ở vị trí bất kỳ (thường chuột phải)

• System menu: chứa các lệnh hệ thống điều khiển

cửa sổ (Minimize, maximize, Close)

95 Lập trình Windows

Trang 25

Sử dụng Menu Editor

97 Lập trình Windows

Xử lý lệnh của menu items

• Add Handler for menu messages

98 Lập trình Windows

Xử lý lệnh của Menu item

• Dựa trên message WM_COMMAND

• Định nghĩa message map

• Thao tác trên Menu:

– DeleteMenu: Xo| một đối tượng trên menu – TrackPopupMenu: hiển thị menu popup

Trang 26

Sử dụng lớp CMenu

• Thao tác trên Menu item:

– AppendMenu: thêm v{o cuối menu một menuitem.

– InsertMenu: thêm một đối tượng menu tại một vị trí x|c

định

– ModifyMenu: chỉnh sửa một đối tượng menu x|c định.

– CheckMenuItem: thêm/bỏ dấu check phía trước một

menuitem

– EnableMenuItem: thiết lập menuitem c|c trạng th|i

enable (MF_ENABLED), disable (MF_DISABLED),

gray(MF_GRAYED).

101 Lập trình Windows

Popup (Context) Menu

• 2 cách:

– Thiết kế một menu đặc biệt dùng làm context menu (bỏ qua top level)

– Sử dụng một thành phần drop-down menu (submenu) từ menu chính

102 Lập trình Windows

Tạo pop-up menu

• Hàm xử lý CWnd::OnContextMenu

• Hiển thị một menu pop-up nổi

– BOOL CMenu::TrackPopupMenu(UINT nFlags, int x, int y, CWnd*

pWnd, LPCRECT lpRect=0);

• nFlags: cờ vị trí trên màn hình (TPM_CENTERALIGN ,

TPM_LEFTALIGN , TPM_RIGHTALIGN), cờ chỉ phím nhấn của chuột

(TPM_LEFTBUTTON, TPM_RIGHTBUTTON)

• Viết hàm xử lý:

103

Tạo lập menu cho dialog

• Tạo một tài nguyên menu cho ứng dụng

• Chọn menu cần gắn vào dialog trong hộp thoại Dialog Properties.

• Hoặc sử dụng h{m CMenu::LoadMenu()

104 Lập trình Windows

Trang 27

2.3 Menu và Toolbar (cont.)

• 2.3.2 Toolbar– Một số dạng Toolbar– Thiết kế Toolbar resource– Thêm Toolbar v{o ứng dụng– Xử lý thông điệp c|c nút lệnh trên Toolbar– Xử lý một số dạng toolbar đặc biệt

106 Lập trình Windows

• Với ứng dụng kiến trúc SDI/MDI: tạo sẵn toolbar mặc định

• Có thể sử dụng Toolbar Editor (Mở Resource/Toolbar) để sửa đổi toolbar đ~ có hoặc tạo toolbar mới.

• Có thể sử dụng ảnh bitmap (thêm v{o Resource) để thiết kế toolbar (Sử dụng h{m LoadBitmap( ) của lớp CToolbar để nạp)

Trang 28

Sử dụng toolbar editor

• Resource/Toolbar

109 Lập trình Wndows

Thêm Toolbar vào ứng dụng

• Sử dụng lớp CToolBar:

(Hoặc CMFCToolBar)– Khai b|o đối tượng lớp – Gọi h{m tạo lập cửa sổ Toolbar – Nạp Toolbar resource đ~ thiết kế – Thiết lập thuộc tính cho toolbar – Gắn toolbar v{o cửa sổ chính

110 Lập trình Windows

Khai báo đối tượng lớp CToolBar

111 Lập trình Windows

Xử lý trong hàm OnCreate – Minh họa 1

112 Lập trình Windows

Trang 29

Xử lý trong h{m OnCreate – Minh họa 2

113 Lập trình Windows

Toolbar Style

114 Lập trình Windows

Trang 30

H{m xử lý cho c|c nút lệnh trên toolbar

• Nếu toolbar là chức năng từ menu item: Chọn ID cho button

trùng ID của menu item tương ứng (tham chiếu đến h{m xử

lý của menu items)

• Nếu không có menu item tương ứng, thêm viết hàm xử lý

thông điệp (vào MESSAGE_MAP) Ví dụ ID_BUTTON_BOLD

Nhóm button dạng checkbox và radio

• Dạng checkbox: Cho chọn nhiều button trong 1 nhóm

• Dạng radio: Chỉ chọn 1 button trong 1 nhóm

• Giải ph|p: Đặt c|c biến cờ trạng th|i, phối hợp xử lý sự kiện

UPDATE_COMMAND_UI của c|c button tương tự như với menu

items

119 Lập trình Windows

Ví dụ xử lý button kiểu check box (1)

120 Lập trình Windows

Trang 31

Ví dụ xử lý button kiểu check box (2)

121 Lập trình Windows

Ví dụ xử lý button kiểu radio (1)

122 Lập trình Windows

Trang 32

Combo box trên toolbar

• Nguyên lý tạo cửa sổ con (Combox box) gắn

v{o cửa sổ cha (Toolbar)

125 Lập trình Windows

Khai báo đối tượng combo box

126 Lập trình Windows

Gắn combo box vào toolbar

127 Lập trình Windows

Trang 33

2.4 Xử lý vẽ (Drawing)

• 2.4.1 Cơ bản về vẽ trên Windows

• 2.4.2 Truy xuất ngữ cảnh thiết bị

• 2.4.3 Một số thao t|c vẽ cơ bản

• 2.4.4 Sử dụng c|c đối tượng vẽ

129 Lập trình Windows

2.4.1 Cơ bản về vẽ trên Windows

• Hệ tọa độ cung cấp cho xử lý vẽ trên cửa sổ ?

• Vùng ứng dụng của cửa sổ (client area) ?

130 Lập trình Windows

GDI ?

• Windows cung cấp GDI (Graphics Device Interface)

– giao diện thiết bị đồ họa, giúp thực hiện thao tác

vẽ dễ dàng hơn, không phụ thuộc vào phần cứng đồ

họa của hệ thống

• Một chương trình ứng dụng (WindowsApp) không

vẽ trực tiếp ra màn hình, máy in … mà chỉ vẽ trên

“bề mặt luận lý” thể hiện bởi ngữ cảnh thiết bị

(Device Context – DC)

• Ngữ cảnh thiết bị chứa các thông tin về hệ thống,

ứng dụng và cửa sổ của WindowsApp cũng như các

đối tượng đồ họa đang được vẽ trong WindowApp

đó

Cơ chế vẽ trong MFC

• Ứng dụng MFC (kiến trúc Document/View) chứa lớp dẫn xuất từ lớp CView (quản lý việc hiển thị dữ liệu lên vùng l{m việc (client area) của cửa sổ ứng dụng).

• C|c xử lý vẽ trên vùng hiển thị n{y được thực hiện trong

hàm OnDraw( ) (h{m override đ|p ứng thông điệp

WM_PAINT được gọi bất cứ khi n{o vùng cửa sổ cần được vẽ lại) Minh họa:

Trang 34

2.4.2 Truy xuất ngữ cảnh thiết bị (1)

• Lớp CDC:

– Chứa 1 ngữ cảnh thiết bị (device context – dc) và

c|c phương thức cần thiết để xử lý vẽ trong ứng

Truy xuất ngữ cảnh thiết bị (2)

• Ngo{i ra MFC cung cấp một số lớp ngữ cảnh thiết bị chuyên biệt (kế thừa từ lớp CDC):

– CPaintDC: Sử dụng cho việc vẽ trong vùng ứng dụng của

cửa sổ (chỉ thao t|c với sự kiện OnPaint)

– CClientDC: Sử dụng cho việc vẽ trong vùng ứng dụng cửa

sổ (vẽ bất kỳ nơi n{o nhưng chỉ thao t|c với sự kiện OnPaint)

– CWindowDC: (Sử dụng cho việc vẽ trong cửa sổ, bao

gồm cả vùng không l{ vùng ứng dụng cửa sổ)

– CMetaFileDC: (Sử dụng cho việc vẽ một GDI metafile)

134 Lập trình Windows

Truy xuất ngữ cảnh thiết bị (3)

• Để lấy ngữ cảnh thiết bị, khai b|o biến đối tượng

Truy xuất ngữ cảnh thiết bị (4)

• Tọa độ vẽ hiện thời (current position):

– Tọa độ điểm trên vùng vẽ– Quan hệ tương đối, có thể thay đổi khi thực hiện

vẽ c|c thực thể (line, circle, rectangle, text…)– Có thể thiết lập bằng phương thức của lớp CDC:

136 Lập trình Windows

CPoint MoveTo(int x, int y);

// Move to position x,yCPoint MoveTo(POINT aPoint);

// Move to position defined by aPoint

Trang 35

BOOL LineTo(int x, int y);

// Draw a line to position x,y

BOOL LineTo(POINT aPoint);

// Draw a line to position defined by aPoint

CDC *pDC;

pDC->MoveTo(50,50); // Set the current position

pDC->LineTo(50,200); // Draw a vertical line down 150 units

pDC->LineTo(150,200); // Draw a horizontal line right 100 units

pDC->LineTo(150,50); // Draw a vertical line up 150 units

pDC->LineTo(50,50); // Draw a horizontal line left 100 units

Một số thao t|c vẽ cơ bản (2)

• Vẽ đường tròn (circle):

• Vẽ cung (Arc):

• Ví dụ:

BOOL Ellipse(int x1, int y1, int x2, int y2);

BOOL Ellipse(LPCRECT lpRect);

BOOL Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);

BOOL Arc(LPCRECT lpRect, POINT startPt, POINT endPt);

CDC *pDC;

pDC->Ellipse(50,50,150,150); // Draw the 1st (large) circle // Define the bounding rectangle for the 2nd (smaller) circle CRect rect(250,50,300,100);

CPoint start(275,100); // Arc start point CPoint end(250,75); // Arc end point pDC->Arc(&rect, start, end); // Draw the second circle

int DrawText(

const CString& str, LPRECT lpRect, UINT nFormat );

– Vẽ chữ với c|c m{u sắc, kiểu c|ch kh|c nhau

• Cần sử dụng c|c đối tượng vẽ (bút vẽ, chổi tô m{u, font chữ)

Trang 36

CPen( );

CPen(

int nPenStyle, int nWidth, COLORREF crColor );

CPen(

int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL );

Sử dụng bút vẽ (2)

• Ví dụ như sau tạo bút vẽ mới v{ chọn l{m bút vẽ

hiện thời, dùng:

143 Lập trình Windows

Sử dụng bút vẽ (3)

• Có thể tạo bút vẽ dùng h{m CPen::CreatePen

• Ví dụ minh họa c|ch dùng n{y:

144 Lập trình Windows

// Declare a pen object and initialize it as // a red solid pen drawing a line 2 pixels wide

CPen aPen;

aPen.CreatePen(PS_SOLID, 2, RGB(255, 0, 0));

CPen* pOldPen = pDC->SelectObject(&aPen); // Select aPen as the pen

pDC->Ellipse(50,50,150,150); // Draw the 1st (large) circle // Define the bounding rectangle for the 2nd (smaller) circle CRect rect(250,50,300,100);

CPoint start(275,100); // Arc start point CPoint end(250,75); // Arc end point pDC->Arc(&rect,start, end); // Draw the second circle

pDC->SelectObject(pOldPen); // Restore the old pen

Trang 37

GDI Fonts và Lớp CFont

• Ngo{i việc sử dụng font chữ mặc định, người dùng

còn có thể tạo font chữ trong chế độ đồ họa tùy

chọn

Ex2-4 Vẽ trong ứng dụng Sketcher

• Thực hiện các thao tác vẽ cơ bản trên ứng dụng Sketcher:

– Vẽ đường thẳng, hình tròn, hình chữ nhật– (C|c đối tượng vẽ tại vị trí hiện thời)

• Thay đổi bút vẽ (CPen), chổi vẽ (CBrush) khác nhau

Trang 38

2.5 Giao tiếp với chuột, b{n phím

• 2.5.1 Giao tiếp với chuột

• 2.5.2 Giao tiếp với b{n phím

149 Lập trình Windows

2.5.1 Giao tiếp với chuột

• Cần xử lý sự kiện chuột gì ?– Phím chuột tr|i/phải được ấn/nhả (down/up) – Giữ phím tr|i v{ di chuột (mousemove) – Phím chuột giữa, phím chuột mở rộng (nếu có) – Ấn phím chuột kèm phím chức năng (Control, Shift)

– C|c đối tượng được vẽ trên lớp CSketcherView, cần bắt

sự kiện chuột trên lớp n{y.

150 Lập trình Windows

Thông điệp từ sự kiện chuột

handlers) trong cột bên

phải tương ứng message

muốn xử lý

151 Lập trình Windows

Mouse Message Handlers (1)

Thông điệp (Messages)

Sự kiện (Events)

Hàm xử lý (Handlers)

WM_LBUTTONDOWN Nút tr|i chuột được nhấn xuống OnLButtonDown WM_LBUTTONUP Nút tr|i chuột được nhả ra OnLButtonUp WM_LBUTTONDBLCLK Nút tr|i chuột được nhấn kép OnLButtonDblClk WM_MBUTTONDOWN Nút giữa chuột được nhấn xuống OnMButtonDown WM_MBUTTONUP Nút giữa chuột được nhả ra OnMButtonUp WM_MBUTTONDBLCLK Nút giữa chuột được nhấn kép OnMButtonDblClk WM_RBUTTONDOWN Nút phải chuột được nhấn xuống OnRButtonDown WM_RBUTTONUP Nút phải chuột được nhả ra OnRButtonUp WM_RBUTTONDBLCLK Nút phải chuột được nhấn kép OnRButtonDblClk WM_MOUSEMOVE Con chuột được di chuyển OnMouseMove

152 Lập trình Windows

Trang 39

Mouse Message Handlers (2)

• C|c h{m xử lý thông điệp có dạng:

• Ví dụ h{m xử lý thông điệp nút chuột tr|i được

nhấn trên vùng cửa sổ hiển thị

• Lập trình xử lý hoặc gọi đến handlers tương ứng

của lớp cơ sở

153 Lập trình Windows

void CSketcherView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CView::OnLButtonDown(nFlags, point);

}

afx_msg void OnMsgName(UINT nFlags, CPoint point)

Mouse Message Handlers (3)

• 2 tham số:

– CPoint point: Tọa độ chuột lúc xảy ra sự kiện– UINT nFlags: Cờ (32 bit) cho biết nút chuột được nhấn v{ nhận biết c|c phím Control/Shift nếu được bấm kèm

– Có c|c gi| trị hằng mặt nạ (Mask) được định nghĩa phục vụ cho x|c định nFlags n{y

154 Lập trình Windows

nFlags

• Để nhận biết gi| trị cờ n{y, dùng phép & (bitwise)

với mặt nạ Ví dụ nhận biết phím Ctrl có được nhấn

cùng chuột:

if ((nFlags & MK_CONTROL) == MK_CONTROL) {…}

Ví dụ giao tiếp với chuột (1)

void CVdMouseView::OnLButtonDown(UINT nFlags, CPoint point) {

// TODO: Add your message handler code here and/or call default MyDrawFunction(point);

CView::OnLButtonDown(nFlags, point);

} void CVdMouseView::MyDrawFunction(CPoint point) {

CDC *pDC = GetDC();

if((m_PrevPoint.x == -1)&&(m_PrevPoint.y == -1)) pDC->MoveTo(point);

else { pDC->MoveTo(m_PrevPoint);

pDC->LineTo(point);

} m_PrevPoint = point;

Trang 40

Ví dụ giao tiếp với chuột (2)

157 Lập trình Windows

void CVdMouseView::OnMouseMove(UINT nFlags, CPoint point)

– Tổ hợp phím được nhấn (nhấn kèm c|c phím chức năng: Alt, Ctrl, Shift)

• Mục tiêu: bắt được c|c sự kiện về phím, đọc m~ phím để có xử lý thích hợp

Xử lý thông điệp từ b{n phím (1)

• MFC hỗ trợ giao tiếp b{n phím bởi c|c thông

điệp v{ h{m xử lý tương ứng như sau:

159 Lập trình Windows

Thông điệp

(Messages)

Sự kiện (Events)

Hàm xử lý (Handlers)

WM_KEYDOWN Phím thường được nhấn xuống OnKeyDown

WM_SYSKEYDOWN Phím chức năng được nhấn xuống OnSysKeyDown

WM_SYSKEYYP Phím chức năng được nhả ra OnSysKeyUp

Xử lý thông điệp từ b{n phím (2)

• C|c h{m xử lý thông điệp phím có dạng:

• Ví dụ:

160 Lập trình Windows

afx_msg void OnMsgName(UINT nChar, UINT nRepCnt, UINT nFlags)

void CSketcherView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{ // TODO: Add your message handler code here and/or call default

CView::OnKeyDown(nChar, nRepCnt, nFlags);

}

Ngày đăng: 19/05/2014, 12:39

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN