API消息机制中的WM_COMMAND

这个消息中的switch(LOWORD(lParam))和switch(HIWORD(lParam))的使用有什么区别。... 这个消息中的switch(LOWORD(lParam)) 和switch(HIWORD(lParam))的使用有什么区别。 展开
 我来答
未来需努力点缀
2013-08-17 · TA获得超过4679个赞
知道大有可为答主
回答量:850
采纳率:50%
帮助的人:529万
展开全部

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中相关的说明,应该是能看懂的


希望能帮助你哈

任明星Ming
2013-08-17 · TA获得超过798个赞
知道小有建树答主
回答量:1061
采纳率:100%
帮助的人:1147万
展开全部
LOWORD和HIWORD的值是不一样的,WPARAM和LPARAM可以包含两个值,一个是LOWROD低值,一个是HIWORD高值。
这两个值可以由用户定义。

// 组合LPARAM
LPARAM MAKELPARAM(
WORD wLow,
WORD wHigh
);

// 组合WPARAM
LPARAM MAKEWPARAM(
WORD wLow,
WORD wHigh
);
更多追问追答
追问
没说重点,什么时候使用哪个值。LOWORD和HIWORD的使用总是扑朔迷离。
追答
这个当然没办法说,我上面也提到过:LOWORD和HIWORD是由用户定义的。所以要知道如何使用,只能看开发文档,知道LPARAM是被怎么定义的。

比如WPARAM在WM_PAINT消息里传递的是HDC句柄,这个就是微软定义的。
再如WPARAM在我自定义的消息里,传递的是一个字符串。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友008b099
2019-07-29
知道答主
回答量:1
采纳率:0%
帮助的人:717
展开全部
6w9ddwmgwtm0J6aj x
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式