Tutorial này sẽ giúp bạn tạo ra 1 ứng dụng đơn giản là hiển thị 1 cửa sổ ra màn hình.
#include "windows.h" // Gọi hàm xử lí message LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Hàm Winmain() int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { MSG msg ; HWND hwnd; WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.lpszClassName = TEXT( "Window" ); wc.hInstance = hInstance ; wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); wc.lpszMenuName = NULL; wc.lpfnWndProc = WndProc; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); RegisterClass(&wc); hwnd = CreateWindow( wc.lpszClassName, TEXT("Window"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 250, 150, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); // Display windows UpdateWindow(hwnd); // Update windows while( GetMessage(&msg, NULL, 0, 0)) { DispatchMessage(&msg); } return (int) msg.wParam; } LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch(msg) { case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wParam, lParam); }
Giải thích:
#include "windows.h"
là header của của chương trình C.
Nó chứa việc gọi các hàm API, các macro và tất cả dữ liệu cơ bản.
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
Khai báo hàm xử lí message.
wc.style = CS_HREDRAW | CS_VREDRAW;
Đây là style của cửa sổ. CS_HREDRAW và CS_VREDRAW được thiết lập. Khi người dùng thay đổi kích thước cửa sổ thì cửa sổ sẽ được vẽ lại.
wc.cbClsExtra = 0; wc.cbWndExtra = 0;
Ta không sử dụng các byte bổ sung (additional bytes). Nên ta đặt chúng bằng 0.
wc.lpszClassName = TEXT( "Window" );
Tên của class. Chúng ta sẽ dùng tên này để tạo cửa sổ. (Các bạn có thể thay đổi tên khác tùy theo ý các bạn).
wc.hInstance = hInstance wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
Đặt màu cho nền cửa sổ chính.
wc.lpszMenuName = NULL;
Trong ví dụ này, chúng ta không thiết kế menu cho ứng dụng.
wc.lpfnWndProc = WndProc;
Khai báo thủ tục xử lí message cho class.
wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
Đặt biểu tượng con trỏ và Icon trong ứng dụng.
RegisterClass(&wc);
Đăng kí lớp cửa sổ với Windows
ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd);
Hiển thị và update cửa sổ.
while( GetMessage(&msg, NULL, 0, 0)) { DispatchMessage(&msg); }
Đây là vòng lặp message. Sử dụng hàm GetMessage() để lấy message từ hàng đợi và gửi các message này cho các thủ tục xử lí message bằng hàm DispatchMessage().
switch(msg) { case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wParam, lParam);
Đoạn code xử lý các message.
Khi người dùng close ứng dụng, bản tin WM_DESTROY gửi tới win procedure.
Hàm PostQuitMessage() sẽ gửi bản tin WM_QUIT tới hàng đợi thông điệp để chờ xử lí. Bản tin WM_QUIT sẽ được xử lí trong tại thủ tục mặc định của Windows
Kết quả:
Leave a Reply
You must be logged in to post a comment.