Bài viết cung cấp 1 project mẫu đã được cấu hình để có thể tiếp tục lập trình với GDI+ Win32 API.
- Khởi tạo GDI+.
- Các thao tác vẽ cơ bản sử dụng GDI+.
Phù hợp với các đồ án môn học tìm hiểu về các thuật toán vẽ đường như vẽ đường thẳng với Bresenham, Midpoint, đường cong Bézier hoặc vẽ các Fractal đệ quy, ...
Download project mẫu GDI+
Giải thích mã nguồn
Trong project này chỉ cần tập trung vào các file chính:
- WinMain.cpp: dành cho việc khởi tạo project và có thể hiểu như đầu vào (Entry Point) của chương trình Win32 API vì nó chứa đầu vào của chương trình và các cài đặt cần thiết.
- GlobalVars.h: chứa các biến toàn cục liên quan tới GDI+.
- Application.h và Application.cpp: chứa tất cả các hàm liên quan đến việc khởi tạo và hủy các tài nguyên của GDI+, trong đó:
- Hàm
init
: khởi tạo dữ liệu cho chương trình nếu cần. - Hàm
run
: được tự gọi lại liên tục, đặt các hàm cập nhật logic và vẽ tại đây.
- Hàm
WinMain.cpp
File này chứa code khởi tạo cửa sổ chương trình với Win32 API, có thể không cần quan tâm file này nhiều vì toàn bộ code cho chương trình chính được dời vào file Application.h và Application.cpp.
GlobalVars.h
extern Gdiplus::GdiplusStartupInput gdiplusStartupInput; extern ULONG_PTR gdiplusToken; extern Gdiplus::Graphics* graphic;
gdiplusStartupInput
và gdiplusToken
là 2 biến dành cho việc khởi tạo tài nguyên và token nắm giữ tham chiếu đến GDI, nhờ nó để quản lý và hủy các tài nguyên vẽ GDI+ khi không cần sử dụng nữa.
Đối tượng graphic
lưu giữ các hàm để vẽ của GDI+, nếu đối tượng này khởi tạo không thành công thì không thể vẽ.
Application.h và Application.cpp
Để sử dụng GDI+ cần thư viện gdiplus.h (gdiplus.lib), toàn bộ thành phần liên quan GDI+ nằm trong namespace Gdiplus
nên khi gọi các hàm của GDI+ thì cần thêm namespace Gdiplus::
trước đó.
#include <gdiplus.h> #pragma comment(lib, "gdiplus.lib")
Hàm khởi tạo init
Khởi tạo GDI+ và khởi tạo đối tượng đồ họa graphic
Application.cpp:
void init() { GdiplusStartup(&STDIO_gdiplusToken, &STDIO_gdiplusStartupInput, NULL); graphic = new Gdiplus::Graphics(GetDC(STDIO_AppHandle)); }
Hàm hủy destroy
Khi không cần dùng GDI+ nữa có thể gọi hàm này để hủy tài nguyên mà GDI+ đang nắm giữ.
void destroy() { delete graphic; Gdiplus::GdiplusShutdown(gdiplusToken); }
Hàm cập nhật logic và vẽ chính, muốn thêm thành phần vẽ thì thêm vào hàm này, đây là hàm chính để thao tác vẽ, cần tập trung thêm code vào hàm này.
Có thể không cần quan tâm các hàm khác ngoài việc thao tác vẽ trong hàm này, tuy nhiên, nếu muốn thật sự hiểu biết về GDI+ thì nên tìm hiểu kỹ từng phần như đã giới thiệu ở trên.
void run()