Thứ Tư, 29 tháng 1, 2014

[WINAPI-C++]bài 3: Vòng lặp tin nhắn - What is a Message?

Giờ ngồi cứ nghĩ nghĩ, mình đến tuổi này rồi(24 tuổi) mà vẫn bị mấy đứa em chê.. Ừ thì đúng là kém nên phải chấp nhận thôi.. Suy cho cùng thì làm gì cũng phải tự tin và đi đến cùng và không ẩu, không làm dở chừng, thì mới thành công được.
Lằng nhằng rồi, tut này sẽ trình bày cho các bạn hiểu về vòng lặp tin nhắn. Vậy vòng lặp tin nhắn là gì?
Trong C/C++ thì một thông báo trả về 1 giá trị nguyên. He he, ở đời khi bạn muốn báo cho ai biết điều gì vd như báo bạn bè bạn có bạn gái hay báo bạn phải đi đổ vỏ thì bạn hô hào, truyền miệng. Nhưng máy tính thì nó chỉ hiểu số nên chung quy lại báo cáo thực chất là trả về số. Nhưng đọc 1 số và xem nó là báo cáo gì thì rất khó.
Và trong tập lệnh API thì người ta định nghĩa sẵn cho dễ lập trình, kiểu như:
#define WM_INITDIALOG                   0x0110
#define WM_COMMAND                      0x0111
#define WM_LBUTTONDOWN                  0x0201

Dạng: #define <tên thông báo> <giá trị tương ứng>
Để gửi tin nhắn chúng ta dùng  2 lệnh PostMessage() or SendMessage()
PostMessage() : đưa tin nhắn vào hang đợi và thực hiện khi đến lượt
SendMessage(): đưa tin nhắn vào cửa sổ và trả về cho đến khi thực hiện
ví dụ: Khi bạn muốn đóng cửa sổ có thể dùng nút close trên cửa sổ, hoặc gửi thông điệp PostMessage(hwnd, WM_CLOSE, 0, 0)
Thành phần tin nhắn gồm: wParam and lParam
wParam:là biến nguyên 16bit
lParam:là biến nguyên 32bit
Trong 1 số tin nhắn thì có thể dùng cả 2 giá trị này, hoặc không dùng để 0 như lệnh tắt cửa sổ ở trên.
wParam bao gồm 2 giá trị: HIWORD để thông báo tin nhắn(nếu có) và LOWORD để điều khiển hay chứa id tin nhắn.
lParam là cửa sổ tin nhắn, có thể nhận NULL nếu như không phải là tin nhắn điều khiển.
(HIWORD và LOWORD là 2 macro chứa biến nguyên high word 32 bit 0xFFFF0000) và low word tương ứng(0x0000FFFF))
Cấu trúc vòng lặp tin nhắn:
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
}

Hàm GetMessage để đợi tin nhắn của bạn, bất cứ thao tác chuột, bàn phím... Nó trả về giá trị không nếu gặp tin nhắn WM_QUIT và giá trị <0 (-1 ?)khi gặp lỗi nào đó. Bình thường thì giá trị  >0
Hàm TranslateMessage để dịch các dạng tin nhắn như phím ảo..vvv.. (?)
Hàm DispatchMessage gửi tin nhắn về cửa sổ để xử lý..









Không có nhận xét nào:

Đăng nhận xét

Nhập nhận xét về bài viết của bạn vào ô dưới. Mình sẽ trả lời khi có thời gian :D