Ứng dụng win32 cơ bản

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_HREDRAWCS_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ả:

Basic windows

Be the first to comment

Leave a Reply