关于WM_COMMAND消息

linwubin1982 2011-09-14 03:56:37
我用sendMessage()向对话框发送WM_COMMAND消息一次,为什么对话框收到两次

发送代码如下
SendMessage(hwndDlg,WM_COMMAND,(BM_GETCHECK>>16)+IDC_AUTOCLEAR,(LPARAM)GetDlgItem(hwndDlg,IDC_AUTOCLEAR));
其中hwndDlg是对话框句柄 IDC_AUTOCLEAR是控件ID


case IDC_AUTOCLEAR:
MessageBox(NULL,TEXT("调用IDC_AUTOCLEAR"),TEXT("系统提示"),IDOK);
if(BST_CHECKED == IsDlgButtonChecked(hwndDlg,IDC_AUTOCLEAR)){
MessageBox(NULL,TEXT("IDC_AUTOCLEAR选中"),TEXT("系统提示"),IDOK);
if(getGameWindowHandle()==NULL){
//CheckDlgButton(hwndDlg,IDC_AUTOCLEAR,BST_UNCHECKED);
//break;
}
//SetTimer(NULL,autoClearId,autoTime,autoClear);
}

处理分支如上,发一次消息,打印了两次
...全文
126 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
linwubin1982 2011-09-14
  • 打赏
  • 举报
回复
[Code]
INT_PTR CALLBACK MainDialog(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam){
WORD wControlId = LOWORD(wParam);//取出对话框上子控件ID
switch(uMsg){
case WM_CLOSE:
EndDialog(hwndDlg,0);
return TRUE;
case WM_INITDIALOG:
hWinMain = hwndDlg;
//设置滑动条范围
SendDlgItemMessage(hwndDlg,IDC_HANGSPEED,TBM_SETRANGE,TRUE,(3000<<16)+200);
SendDlgItemMessage(hwndDlg,IDC_HANGSPEED,TBM_SETTICFREQ,200,0);
SendDlgItemMessage(hwndDlg,IDC_HANGSPEED,TBM_SETPAGESIZE,0,200);
//SendMessage(hwndDlg,WM_SETICON,ICON_SMALL,(LPARAM)LoadIcon(hInstance,MAKEINTRESOURCE(ICO_MAIN)));
return TRUE;
case WM_COMMAND:
switch(wControlId){
//开始游戏,取出游戏主窗口坐标,设置到输入框
case IDOK:
//模拟点击开始游戏
//StartGame();
ClearPair();
break;
case IDC_AUTOCLEAR:
MessageBox(NULL,TEXT("调用IDC_AUTOCLEAR"),TEXT("系统提示"),IDOK);
if(BST_CHECKED == IsDlgButtonChecked(hwndDlg,IDC_AUTOCLEAR)){
MessageBox(NULL,TEXT("IDC_AUTOCLEAR选中"),TEXT("系统提示"),IDOK);
if(getGameWindowHandle()==NULL){
CheckDlgButton(hwndDlg,IDC_AUTOCLEAR,BST_UNCHECKED);
break;
}
//SetTimer(NULL,autoClearId,autoTime,autoClear);
}
else if(BST_UNCHECKED == IsDlgButtonChecked(hwndDlg,IDC_AUTOCLEAR)){
MessageBox(NULL,TEXT("IDC_AUTOCLEAR没选中"),TEXT("系统提示"),IDOK);
KillTimer(NULL,autoClearId);
}
break;
}
return TRUE;
case WM_HSCROLL:
switch(wControlId){
case TB_PAGEDOWN:
case TB_PAGEUP:
case TB_THUMBPOSITION:
MessageBox(NULL,TEXT("发送消息中"),TEXT("系统提示"),IDOK);
autoTime = SendDlgItemMessage(hwndDlg,IDC_HANGSPEED,TBM_GETPOS,0,0);
SendMessage(hwndDlg,WM_COMMAND,(BM_GETCHECK>>16)+IDC_AUTOCLEAR,(LPARAM)GetDlgItem(hwndDlg,IDC_AUTOCLEAR));
break;
return TRUE;

}

}
return FALSE;
}
[/Code]
linwubin1982 2011-09-14
  • 打赏
  • 举报
回复
<code>
INT_PTR CALLBACK MainDialog(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam){
WORD wControlId = LOWORD(wParam);//取出对话框上子控件ID
switch(uMsg){
case WM_CLOSE:
EndDialog(hwndDlg,0);
return TRUE;
case WM_INITDIALOG:
hWinMain = hwndDlg;
//设置滑动条范围
SendDlgItemMessage(hwndDlg,IDC_HANGSPEED,TBM_SETRANGE,TRUE,(3000<<16)+200);
SendDlgItemMessage(hwndDlg,IDC_HANGSPEED,TBM_SETTICFREQ,200,0);
SendDlgItemMessage(hwndDlg,IDC_HANGSPEED,TBM_SETPAGESIZE,0,200);
//SendMessage(hwndDlg,WM_SETICON,ICON_SMALL,(LPARAM)LoadIcon(hInstance,MAKEINTRESOURCE(ICO_MAIN)));
return TRUE;
case WM_COMMAND:
switch(wControlId){
//开始游戏,取出游戏主窗口坐标,设置到输入框
case IDOK:
//模拟点击开始游戏
//StartGame();
ClearPair();
break;
case IDC_AUTOCLEAR:
MessageBox(NULL,TEXT("调用IDC_AUTOCLEAR"),TEXT("系统提示"),IDOK);
if(BST_CHECKED == IsDlgButtonChecked(hwndDlg,IDC_AUTOCLEAR)){
MessageBox(NULL,TEXT("IDC_AUTOCLEAR选中"),TEXT("系统提示"),IDOK);
if(getGameWindowHandle()==NULL){
CheckDlgButton(hwndDlg,IDC_AUTOCLEAR,BST_UNCHECKED);
break;
}
//SetTimer(NULL,autoClearId,autoTime,autoClear);
}
else if(BST_UNCHECKED == IsDlgButtonChecked(hwndDlg,IDC_AUTOCLEAR)){
MessageBox(NULL,TEXT("IDC_AUTOCLEAR没选中"),TEXT("系统提示"),IDOK);
KillTimer(NULL,autoClearId);
}
break;
}
return TRUE;
case WM_HSCROLL:
switch(wControlId){
case TB_PAGEDOWN:
case TB_PAGEUP:
case TB_THUMBPOSITION:
MessageBox(NULL,TEXT("发送消息中"),TEXT("系统提示"),IDOK);
autoTime = SendDlgItemMessage(hwndDlg,IDC_HANGSPEED,TBM_GETPOS,0,0);
SendMessage(hwndDlg,WM_COMMAND,(BM_GETCHECK>>16)+IDC_AUTOCLEAR,(LPARAM)GetDlgItem(hwndDlg,IDC_AUTOCLEAR));
break;
return TRUE;

}

}
return FALSE;
}
</code>
以上是完整的对话框过程
linwubin1982 2011-09-14
  • 打赏
  • 举报
回复
case TB_THUMBPOSITION:
MessageBox(NULL,TEXT("发送消息中"),TEXT("系统提示"),IDOK);
autoTime = SendDlgItemMessage(hwndDlg,IDC_HANGSPEED,TBM_GETPOS,0,0);
SendMessage(hwndDlg,WM_COMMAND,(BM_GETCHECK>>16)+IDC_AUTOCLEAR,(LPARAM)GetDlgItem


这样的发消息的,现在找到原因了,原来是我拖动了一次滑动条然后拖到位置后释放,但是他好像给主窗口发了两次
TB_THUMBPOSITION通知,我用TB_ENDTRACK这个通知,也是发了两次,不知道为啥,MSDN只是简单说了在TB_THUMBPOSITION在通知码后紧跟WM_LBUTTONUP这个消息,就没其它解释了,不知道 有高手知道不
636f6c696e 2011-09-14
  • 打赏
  • 举报
回复
你这个sendmessage在哪个方法里面?
liuwei2500 2011-09-14
  • 打赏
  • 举报
回复
什么叫打印了两次?

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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