API消息機制中的WM_COMMAND

在WM_COMMAND消息中 , lParam參數沒有高地位的值之分 . 如果這個消息是由一個窗口發送的 , 那麼這個參數lParam就表示這個窗口的窗口句柄HWND,這個主要是爲了區分消息是從哪個按鈕(或其它窗口控件)發送來的。


//button.c
#include<windows.h>
 
//按鈕個數
#define NUM        2
 
//按鈕的文本
TCHAR*  btnName[NUM]={TEXT("按鈕1"), TEXT("按鈕2")};
 
LRESULT CALLBACK WndProc(HWNDUINTWPARAMLPARAM);
 
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   PSTR szCmdLine,
                   int iCmdShow)
{
    static  TCHAR   szAppName[] = TEXT("Btn");
    HWND            hwnd;
    MSG             msg;
    WNDCLASS        wndclass;
    int             cxScreen, cyScreen;
     
    wndclass.style          = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc    = WndProc;
    wndclass.cbClsExtra     = 0;
    wndclass.cbWndExtra     = 0;
    wndclass.hInstance      = hInstance;
    wndclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName   = NULL;
    wndclass.lpszClassName  = szAppName;
     
    if(!RegisterClass(&wndclass))
    {
        MessageBox(NULL, TEXT("This program requires Windows NT!"),
            szAppName, MB_ICONERROR);
        return 0;
    }
     
    cxScreen = GetSystemMetrics(SM_CXSCREEN);
    cyScreen = GetSystemMetrics(SM_CYSCREEN);
    hwnd = CreateWindow(szAppName,
                        TEXT("Btn Demo"),
                        WS_OVERLAPPEDWINDOW,
                        cxScreen * 3 / 10,
                        cyScreen / 5,
                        cxScreen * 2 / 5,
                        cyScreen * 3 / 5,
                        NULL,
                        NULL,
                        hInstance,
                        NULL);
 
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);
 
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
     
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND        hwndBtn[NUM];//按鈕句柄
    HINSTANCE       hInstance;  //窗口實例
    int             cxChar, cyChar, i;//默認字體的寬度和高度 循環變量
     
    switch(message)
    {
    case WM_CREATE:
        cxChar = LOWORD(GetDialogBaseUnits());
        cyChar = HIWORD(GetDialogBaseUnits());
        hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
         
        //創建兩個按鈕
        for(i=0; i<NUM; i++)
            hwndBtn[i] = CreateWindow(TEXT("button"), btnName[i],
                                    WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
                                    10, i * 100 + 10, 20 * cxChar, 7 * cyChar / 4,
                                    hwnd, (HMENU)9, hInstance, NULL);
          return 0;
 
    case WM_COMMAND:
        //響應兩個按鈕的按下消息
        for(i=0; i<NUM; i++)
            //如果按鈕句柄匹配  就顯示相應信息
            if((HWND)lParam == hwndBtn[i])
            {
                MessageBox(NULL, btnName[i], TEXT("提示"), MB_OK);
                break;
            }
        return 0;
 
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
 
    return DefWindowProc(hwnd, message, wParam, lParam);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章