API消息机制中的WM_COMMAND
这个消息中的switch(LOWORD(lParam))和switch(HIWORD(lParam))的使用有什么区别。...
这个消息中的switch(LOWORD(lParam)) 和switch(HIWORD(lParam))的使用有什么区别。
展开
展开全部
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中相关的说明,应该是能看懂的
希望能帮助你哈
展开全部
LOWORD和HIWORD的值是不一样的,WPARAM和LPARAM可以包含两个值,一个是LOWROD低值,一个是HIWORD高值。
这两个值可以由用户定义。
// 组合LPARAM
LPARAM MAKELPARAM(
WORD wLow,
WORD wHigh
);
// 组合WPARAM
LPARAM MAKEWPARAM(
WORD wLow,
WORD wHigh
);
这两个值可以由用户定义。
// 组合LPARAM
LPARAM MAKELPARAM(
WORD wLow,
WORD wHigh
);
// 组合WPARAM
LPARAM MAKEWPARAM(
WORD wLow,
WORD wHigh
);
更多追问追答
追问
没说重点,什么时候使用哪个值。LOWORD和HIWORD的使用总是扑朔迷离。
追答
这个当然没办法说,我上面也提到过:LOWORD和HIWORD是由用户定义的。所以要知道如何使用,只能看开发文档,知道LPARAM是被怎么定义的。
比如WPARAM在WM_PAINT消息里传递的是HDC句柄,这个就是微软定义的。
再如WPARAM在我自定义的消息里,传递的是一个字符串。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
6w9ddwmgwtm0J6aj x
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询