关于清单方块类别的 WM_COMMAND消息

selooloo 2011-12-22 05:04:35
今天发现一个奇怪的问题,创建了两个listbox类控件,点击其中一个会产生两个WM_COMMAND消息。

只创建一个listbox类控件时,第一次点击也会产生两个WM_COMMAND消息。如果加入SetFocus的话就正常(一个listbox类控件)

代码如下,无关代码都去掉了:
case WM_CREATE:
hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
cxChar=LOWORD(GetDialogBaseUnits());
cyChar=HIWORD(GetDialogBaseUnits());

hwndYear=CreateWindow(TEXT("listbox"),NULL,
WS_CHILD|WS_VISIBLE|LBS_STANDARD,
cxChar,cyChar*3,
cxChar*8,
cyChar*2,
hwnd,(HMENU)ID_YEAR,
hInstance,
NULL);

hwndMonth=CreateWindow(TEXT("listbox"),NULL,
WS_CHILD|WS_VISIBLE|LBS_STANDARD|LBS_SORT,
cxChar,cyChar*10,
cxChar*8+GetSystemMetrics(SM_CXVSCROLL),
cyChar*2,
hwnd,(HMENU)ID_MONTH,
hInstance,
NULL);

return 0;

case WM_COMMAND:

++count;
return 0;


实在想不出什么原因,望高手指点一二
...全文
112 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2012-02-08
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
selooloo 2011-12-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chayedanwc 的回复:]
引用 3 楼 selooloo 的回复:
引用 1 楼 chayedanwc 的回复:
从MSDN中查询的一些通知或消息有一些是在WM_COMMAND的附属参数中的,例如BN_CLICKED通知,它触发WM_COMMAND消息,wParam的high-order字节中。因此我猜测WM_COMMAND是一些消息的集合,你在点击的时候触发了多个使用WM_COMMAND作为消息载体的通知或事件。你将……
[/Quote]
谢谢你的耐心解答
This message is sent when a combo box loses the keyboard focus. The parent window of the combo box receives this message through the WM_COMMAND message.

这个消息我也查了,这两个消息应该都是失去焦点产生的吧,但是失去焦点不应该产生WM_KILLFOCUS消息吗?
chayedanwc 2011-12-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 selooloo 的回复:]
引用 1 楼 chayedanwc 的回复:
从MSDN中查询的一些通知或消息有一些是在WM_COMMAND的附属参数中的,例如BN_CLICKED通知,它触发WM_COMMAND消息,wParam的high-order字节中。因此我猜测WM_COMMAND是一些消息的集合,你在点击的时候触发了多个使用WM_COMMAND作为消息载体的通知或事件。你将截获的两次WM_COMMAND;

针对……
[/Quote]

512,1004,593732111
4,1003,198386111的两个消息从头文件winuser.h中得到定义,512(0x0200)这个消息定义如下

#define EN_KILLFOCUS 0x0200

从MSDN中搜索EN_KILLFOCUS的定义,描述为
The EN_KILLFOCUS notification message is sent when an edit control loses the keyboard focus. The parent window of the edit control receives this notification message through a WM_COMMAND message.

LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_COMMAND
WPARAM wParam, // edit control identifier, EN_KILLFOCUS
LPARAM lParam // handle to edit control (HWND)
);
很显然第一个WM_COMMAND消息就来自Edit的KillFocus事件;


同样分析第二个消息“4”来自Combox,可以自己查一下这个消息是什么。
#define CBN_KILLFOCUS 4
selooloo 2011-12-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shen_wei 的回复:]
一次 是killFocus
一次 是 Onclick
[/Quote]
能否详细点?
selooloo 2011-12-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chayedanwc 的回复:]
从MSDN中查询的一些通知或消息有一些是在WM_COMMAND的附属参数中的,例如BN_CLICKED通知,它触发WM_COMMAND消息,wParam的high-order字节中。因此我猜测WM_COMMAND是一些消息的集合,你在点击的时候触发了多个使用WM_COMMAND作为消息载体的通知或事件。你将截获的两次WM_COMMAND;

针对你的操作,我特意创建了一个ListBox和一个E……
[/Quote]
多谢你的解答,我还有点不明白的是第一次点击时会产生两个WM_COMMAND消息,以后在点击就只产生一个消息了,是不是获得输入焦点时会产生一个WM_COMMAND消息?
shen_wei 2011-12-24
  • 打赏
  • 举报
回复
一次 是killFocus
一次 是 Onclick
chayedanwc 2011-12-24
  • 打赏
  • 举报
回复
从MSDN中查询的一些通知或消息有一些是在WM_COMMAND的附属参数中的,例如BN_CLICKED通知,它触发WM_COMMAND消息,wParam的high-order字节中。因此我猜测WM_COMMAND是一些消息的集合,你在点击的时候触发了多个使用WM_COMMAND作为消息载体的通知或事件。你将截获的两次WM_COMMAND;

针对你的操作,我特意创建了一个ListBox和一个Edit,将Edit设置为默认焦点,点击LilstBox的时候触发了WM_COMMAND消息两次;
两个控件的定义如下

#define IDC_LIST1 1003
#define IDC_EDIT1 1004


我截获这两次消息

if (uMsg==WM_COMMAND)
{
TRACE("\r\n%d,%d,%d",HIWORD(wParam),LOWORD(wParam),lParam);
}


请看debug输出结果是
512,1004,593732111
4,1003,198386111
很明显,触发的两次WM_COMMAND消息分别是来自控件ID为1004和1003的两个控件;也就说明在焦点切换的时候Edit和Listbox分别触发了WM_COMMAND消息。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧