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