Search…

Project Mẫu GDI+ với C++ Win32 API

18/09/20202 min read
Project mẫu Win32 API GDI+ đã được cấu hình sẵn dành cho các dự án hoặc đồ án môn học liên quan đến đồ họa căn bản.

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+

STDIO_GDIPlus_VS2019.zip

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.

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;

gdiplusStartupInputgdiplusToken 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()

Kết quả

GDI+ trong Win32 API.
IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024