[100分][新手问题] 关于用SDK处理消息时遇到的问题 大家可以在自己的WM_LBUTTONUP消息中加个MessageBox看看能不能在父窗口中处理单击事件。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个很正常,弹出了窗口后程序就暂停在那里了。你可以这么试一下,点鼠标左键松开的时候在屏幕上打印鼠标位置,看看是不是你鼠标点的时候的位置你就明白了,打印语句在messagebox后面。 不是这样的。弹出MessageBox后,窗体经过了重绘。建议设置个标志变量,然后在WM_PAINT里面显示。在BN_CLICKED里面SendMessage(hWnd,WM_PAINT,0,0); 调用MessageBox后,所有的窗口消息都跑MessageBox的处理循环去了,所以接下来的一系列消息,包括WM_LBUTTONUP都不能送到你的Button里去,也就无法触发Button的BN_CLICK事件 上面的代码用看的,不好意思全部太多,贴不了~不过关键就那一句。不知道怎么解决这个问题呢?------------------------我的想法和jasonshark(最后一个暑假了...) 和一样,我也这么觉得 应该是按钮弹起时弹出消息框,之后才调用系统默认过程向父窗口发送WM_COMMON消息但是有序这里延长了按钮按下和弹起的时间差,导致系统不认为这次是单击。 楼上正解BN_CLICKED事件貌似鼠标松开事件但是当你松开鼠标的时候,可能鼠标已经不在那个button上了而且你响应Command事件的时候根本不需要判断事件类型switch(wmEvent) { case BN_CLICKED: { HDC hdc = ::GetDC(hWnd); ::TextOut(hdc, 50, 50, _T("123123123"), 1); // 这里就根本没救来 ::ReleaseDC(hWnd, hdc); break; } }把上面改为HDC hdc = ::GetDC(hWnd); ::TextOut(hdc, 50, 50, _T("123123123"), 1); // 这里就根本没救来::ReleaseDC(hWnd, hdc);break; ralphvsclark(微笑)说的很对你不要messagebox就可以了, TO: ggglivw() 一定要用messagebox呢! - - case WM_LBUTTONUP:// { ::MessageBox(NULL, _T("Test"), _T("Test"), MB_OK); // 只要加了这种消息提示,按钮就不会向父窗口发送WM_COMMON消息(处理单击事件),不加这句就很正常break;}不会向父窗口发送WM_COMMON消息,这是太正常的了,不知给这样行不int iRes = ::MessageBox(NULL, _T(str), _T("Test"), MB_YESNO); if(iRes == IDYES) { };//添加你的代码,向父窗口发送WM_COMMON消息 TO:yaazz((大山)我在成长)应该也不行的。这种情况很正常? 不是说了吗,你想应COMMAND事件的时候去掉外面的哪些判断switch(wmEvent) { case BN_CLICKED: {试一下 /** * Handle the WM_COMMAND messages.+++ */LRESULT msgCommand(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam){ if(LOWORD(wparam) == IDC_BUTTON1) { ::MessageBox(ghwnd,"Test","Test",MB_OK); } else { for (int i = 0; i < sizeof(keycode)/sizeof(KEYCODE); i++) { UINT id = keycode[i].ID; BYTE vk = keycode[i].VK; if (LOWORD(wparam) == id) { switch (keycode[i].ID) { case IDC_KEY_numAdd: gbShift = !gbShift; if (gbShift) keybd_event(VK_SHIFT, 0, 0, 0); keybd_event(vk, 0, 0, 0); keybd_event(vk, 0, KEYEVENTF_KEYUP, 0); if (gbShift) { keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); gbShift = false; InvalidateRect(GetDlgItem(hwnd, IDC_KEY_SHIFT), NULL, true); } // keybd_event(vk, 0, KEYEVENTF_KEYUP, 0);++++++++++++ break; case IDC_KEY_numArray: gbShift = !gbShift; if (gbShift) keybd_event(VK_SHIFT, 0, 0, 0); keybd_event(vk, 0, 0, 0); keybd_event(vk, 0, KEYEVENTF_KEYUP, 0); if (gbShift) { keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); gbShift = false; InvalidateRect(GetDlgItem(hwnd, IDC_KEY_SHIFT), NULL, true); } // keybd_event(vk, 0, KEYEVENTF_KEYUP, 0);++++++++++++ break; case IDC_KEY_SHIFT: gbShift = !gbShift; break; break; } } } } return 0;} 200求助一个小问题,将TCHAR *字符串转成unsigned char *字符串 socket 发送数据后一直接收数据到无数据可收 (全部分了)关于数据库自动编号的删除,数据库查询的方法。 CString转BYTE的问题 怎么样用ADO在ACCESS的表里添加记录啊?? 请问!工作者线程处理函数中调用SendMessage()函数的问题. 为什么两个线程中的对话框会相互影响 怎样调用一个Dll中函数,只知道函数和参数描述。 关与提高速度的问题! sql中varchar与VC中CString的转换问题 移出移动设备(U盘)问题 知道位图文件名,如何获取位图尺寸
我的想法和jasonshark(最后一个暑假了...) 和一样,我也这么觉得
但是有序这里延长了按钮按下和弹起的时间差,导致系统不认为这次是单击。
BN_CLICKED事件貌似鼠标松开事件
但是当你松开鼠标的时候,可能鼠标已经不在那个button上了而且你响应Command事件的时候根本不需要判断事件类型
switch(wmEvent)
{
case BN_CLICKED:
{
HDC hdc = ::GetDC(hWnd);
::TextOut(hdc, 50, 50, _T("123123123"), 1); // 这里就根本没救来
::ReleaseDC(hWnd, hdc); break;
}
}把上面改为
HDC hdc = ::GetDC(hWnd);
::TextOut(hdc, 50, 50, _T("123123123"), 1); // 这里就根本没救来
::ReleaseDC(hWnd, hdc);
break;
你不要messagebox就可以了,
{
::MessageBox(NULL, _T("Test"), _T("Test"), MB_OK); // 只要加了这种消息提示,按钮就不会向父窗口发送WM_COMMON消息(处理单击事件),不加这句就很正常
break;
}
不会向父窗口发送WM_COMMON消息,这是太正常的了,不知给这样行不
int iRes = ::MessageBox(NULL, _T(str), _T("Test"), MB_YESNO);
if(iRes == IDYES)
{ };//添加你的代码,向父窗口发送WM_COMMON消息
去掉外面的哪些判断
switch(wmEvent)
{
case BN_CLICKED:
{试一下
* Handle the WM_COMMAND messages.+++
*/
LRESULT msgCommand(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
{
if(LOWORD(wparam) == IDC_BUTTON1)
{
::MessageBox(ghwnd,"Test","Test",MB_OK);
}
else
{
for (int i = 0; i < sizeof(keycode)/sizeof(KEYCODE); i++)
{
UINT id = keycode[i].ID;
BYTE vk = keycode[i].VK;
if (LOWORD(wparam) == id)
{
switch (keycode[i].ID)
{
case IDC_KEY_numAdd:
gbShift = !gbShift;
if (gbShift)
keybd_event(VK_SHIFT, 0, 0, 0);
keybd_event(vk, 0, 0, 0);
keybd_event(vk, 0, KEYEVENTF_KEYUP, 0); if (gbShift)
{
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
gbShift = false;
InvalidateRect(GetDlgItem(hwnd, IDC_KEY_SHIFT), NULL, true);
} // keybd_event(vk, 0, KEYEVENTF_KEYUP, 0);++++++++++++
break;
case IDC_KEY_numArray:
gbShift = !gbShift;
if (gbShift)
keybd_event(VK_SHIFT, 0, 0, 0);
keybd_event(vk, 0, 0, 0);
keybd_event(vk, 0, KEYEVENTF_KEYUP, 0); if (gbShift)
{
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
gbShift = false;
InvalidateRect(GetDlgItem(hwnd, IDC_KEY_SHIFT), NULL, true);
} // keybd_event(vk, 0, KEYEVENTF_KEYUP, 0);++++++++++++
break;
case IDC_KEY_SHIFT:
gbShift = !gbShift;
break; break;
}
}
}
}
return 0;
}