當前位置:編程學習大全網 - 源碼下載 - API消息機制中的WM_COMMAND

API消息機制中的WM_COMMAND

lz 妳好

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

我給妳舉個例子,妳就清晰了:(我上傳完整的源代碼)

//button.c

#include<windows.h>

//按鈕個數

#define?NUM 2

//按鈕的文本

TCHAR*?btnName[NUM]={TEXT("按鈕1"),?TEXT("按鈕2")};

LRESULT?CALLBACK?WndProc(HWND,?UINT,?WPARAM,?LPARAM);

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);

}

運行結果:

按下按鈕1,就顯示"按鈕1"

按下按鈕2 , 就顯示"按鈕2"

其實對於以WM開頭的windows消息的應用妳都可以查詢msdn中相關的說明,應該是能看懂的

希望能幫助妳哈

  • 上一篇:程序員改bug 問題是怎麽改好的
  • 下一篇:如何破解ECC6.0不用申請Access key
  • copyright 2024編程學習大全網