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

[WINAPI-C++]bài 2: Thêm một xử lý cho cửa sổ - Handling Messages

Oki, hôm qua mình viết tut xong(29/1/2014) thì có gửi lên cho anh em chém gió. Nhận được nhiều phê bình mình rất vui, nghĩa là anh em đã quan tâm tới các tut của mình. Hôm nay mình lại hào hung viết tut tiếp, mặc dù âm dương là 29 tết rồi, chuẩn bị đón năm mới ^_^
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