Bài này mình thêm 1 xử lý cho cửa sổ, khi kick vào cửa sổ thì nó hiện thông báo ra ứng dụng đang chạy bao gồm đường dẫn của ứng dung.
Cái này gọi là Handling Messages: Có nhiều Handling Messages lắm. Đó là các sự kiện của người dung và sau đó là code để xử lý sự kiện đó. Sự kiện kick chuột là
WM_LBUTTONDOWN
. Còn khi các bạn muốn xử lý cho sự kiện này thì thêm vào đoạn LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)Code thêm ở đoạn này:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_LBUTTONDOWN: // <-
// <- Chúng ta sẽ add code ở đây break; // <-
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
Để thêm tập lệnh xử lý cho sự kiện này, các bạn phải đặt code ở cặp lệnh :
// BEGIN NEW CODE và // END NEW CODE thì chương trình mới chạy được.
Tập lệnh như sau:
char szFileName[MAX_PATH]: Khai báo mảng cha, có độ dài là số ký tự tối đa của đường dẫn. Tiếng anh: Path : đường dẫn.
HINSTANCE hInstance = GetModuleHandle(NULL):
GetModuleFileName(hInstance, szFileName, MAX_PATH);
MessageBox(hwnd, szFileName, "Chuong trinh nay la:", MB_OK | MB_ICONINFORMATION);
Rồi, đến đây mình sẽ giải thích cho các bạn biết những gì mà chúng ta đã làm ở tut 1. Hi nếu các bạn đủ kiên nhẫn thì đọc tiếp nhé:
(COPY và cho nó chạy. Nếu không chắc copy chuẩn thì các bạn lấy code ở đây nhé)
#include <windows.h> //thu vien cho lap trinh window
const char g_szClassName[] = "myWindowClass";
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg) //THong diep quan ly khi ban bam chuot, tat chuong trinh,....
{
case WM_LBUTTONDOWN: //Khi ban kick chuot
{
char szFileName[MAX_PATH];
HINSTANCE hInstance = GetModuleHandle(NULL);
GetModuleFileName(hInstance, szFileName, MAX_PATH);
MessageBox(hwnd, szFileName, "Chuong trinh nay la:", MB_OK | MB_ICONINFORMATION);
}
break;
case WM_CLOSE://Khi ban tat man hinh
DestroyWindow(hwnd);
break;
case WM_DESTROY://Khi man hinh bi tat
PostQuitMessage(0);
break;
default://Mac dinh
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;//Lop luu tru ve thong tin icon, mau, ten, menu cua chuong trinh
HWND hwnd;//Handle cho window
MSG Msg;//Thong diep cho window
wc.cbSize = sizeof(WNDCLASSEX);//Dat kich co cho lop, tuc la cap bo nho cho no
wc.style = 0;//Kieu cua so mac dinh
wc.lpfnWndProc = WndProc;//Thu tuc cua cua so, kiem tra cac thong diep tac dong den cua so
wc.cbClsExtra = 0;//Phan mo rong cua cua so, de mac dinh 0
wc.cbWndExtra = 0;//nhu tren
wc.hInstance = hInstance;//Instance tam thoi va co the co nhieu instance
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);//icon chuong trinh va logo
wc.hCursor = LoadCursor(NULL, IDC_ARROW);//Lay cursor mac dinh
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))//Neu dang ky that bai
{
MessageBox(NULL, "Dang ky cua so that bai!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"Tieu de cua so",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, "Tao cua so that bai!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
Vậy là xong tut 2. Bạn muốn yên tâm thì copy code ở đây nhé. Còn nếu các bạn vẫn bị mắc lỗi khi chạy chương trình thì cho mình xem lỗi, mình sẽ sửa lại cho.
thank all!
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