Cấu trúc chương trình trong Windows

Chú ý: từ bây giờ cho đến hết Tutorial này. Chúng ta sẽ dùng windows : cửa sổ, còn Windows : hệ điều hành Windows.

1. windows
Theo quan điểm của người lập trình, mọi thứ trong ứng dụng đều là cửa sổ (windows)

2. Cấu trúc chương trình trong Windows
Mọi chương trình ứng dụng trong Windows bắt buộc phải có 2 hàm:
– WinMain()
– Window procedure

2.1 WinMain(): tương tự như hàm main() (trong Dos hoặc UNIX) khởi tạo chương trình ứng dụng. Có 2 nhiệm vụ chính:
– Hiển thị cửa sổ ứng dụng lên màn hình
– Tiến hành vòng lặp Message

Khai báo hàm Winmain()

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow );

Paramter

hInstance là một thể hiện của chương trình. Nó là số nguyên 32bit, số nguyên này sẽ được cho bởi Windows khi chương trình ứng dụng bắt đầu thực hiện.

hPrevInstance : là thông số để NULL
lpCmdLine:
nCmdShow: chỉ ra cửa sổ sẽ được hiển thị như thế nào (Minimumized, maximized, Hidden).

Hàm WinMain() sẽ kết thúc khi nó nhận được bản tin WM_QUIT.
Hàm WinMain() được xây dựng theo các bước sau:

Bước 1: Đăng kí cửa sổ (Register windows)
Trước khi chúng ta tạo cửa sổ, chúng ta cần phải đăng kí cửa sổ đó với HĐH Windows. Tất cả các cửa sổ cần phải được đăng kí.
HĐH Windows định nghĩa cửa sổ dưới dạng một cấu trúc WNDCLASS.Cấu trúc này chứa các thông số quy định các đặc tính cho cửa sổ(tên cửa sổ, màu background,..). Chúng ta sẽ xét cụ thể trong ví dụ.
Cuối cùng ta gọi hàm RegisterClass() để đăng kí cửa sổ với HĐH Windows.

Bước 2: Tạo cửa sổ
Để tạo một cửa sổ ta gọi hàm CreateWindow()

HWND CreateWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle,

int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu,

HINSTANCE hInstance, LPVOID lpParam );

Parameter

lpClassName: tên đăng kí với HĐH Windows
lpWindowName: tên sẽ hiển thị lên cửa sổ
dwStyle:
x,y: hoành độ, tung độ để hiển thị cửa sổ
nWidth: độ rộng của cửa sổ
nHeight: độ cao của cửa sổ
hWndParent: handle tới cửa sổ cha
hMenu: handle tới các menu
hInstance: handle tới các thể hiện của chương trình
lpParam:

Return :Handle tới cửa sổ vừa mới được tạo.

2.2 Message
– Hàm WinMain() tạo ra 1 vòng lặp thông điệp(message loop). Nó là vòng lặp vô hạn, chạy trong suốt vòng đời của ứng dụng. Message loop là 1 cấu trúc đợi và phát các sự kiện hoặc các message trong chương trình. HĐH Windows giao tiếp sử dụng các message.

– Message là giá trị integer chỉ ra một sự kiện cụ thể. VD: Khi chúng ta click vào button, thay đổi kích thước cửa sổ hoặc đóng ứng dụng,…v.v. Thì sẽ có rất nhiều message được tạo ra. Các message này có thể không được xử lí đồng thời, mà các message này sẽ được đưa vào 1 hàng đợi thông điệp (message queue) và đợi để xử lí lần lượt từng message một.

– Hàm GetMessage() được sử dụng để lấy các bản tin từ message queue.
– Hàm TranslateMessage() translate virtual-key message thành character message.
( HĐH Windows tạo ra các Virtual-key message khi người dùng ấn các phím trên key-board (nhưng không phải là giá trị character). Ứng dụng muốn lấy được message này thì cần phải có hàm để translate virtual-key message thành character message).
– Hàm DispatchMessage() dùng để phát message tới window produce.

2.3 Window Procedure

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

– Hàm WindowProc() sẽ nhận và xử lí các message gửi đến. Các message nào không được xử lí trong hàm này sẽ được xử lí trong hàm DefWindowProc() của HĐH Windows.
– hwnd: handle to the windows
– uMsg:
– wParam, lParam: chứa các thông tin về message.

2.4 Các Message cơ bản
WM_CHAR : Khi nhập 1 kí tự từ bàn phím
WM_COMMAND :Khi lựa chọn các item trong popup menu
WM_CREATE: Khi windows được tạo
WM_DESTROY : Khi windows bị destroy
WM_LBUTTONDOWN: Khi click chuột trái
WM_RBUTTONDOWN : Khi click chuột phải
WM_MOUSEMOVE : Khi di chuyển con trỏ chuột
WM_PAINT : Khi windows được vẽ lại
WM_QUIT: Khi close windows

Dưới đây là hình vẽ mô tả quá trình nhận và xử lí message của ứng dụng Win32

Win32 flow

Be the first to comment

Leave a Reply

Your email address will not be published.

*