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