Archive for the ‘MFC’ Category

托盘图标的左键单击与双击的处理

星期五, 3月 14th, 2008 84 次访问

前两天在编写windows桌面程序时遇了一个小问题。问题如题. 原先我简单的认为只要区分开WM_LBUTTONUP与WM_LBUTTONDBLCLK消息就可以处理了。经过测试发现,当我双击时会出现两次WM_LBUTTONUP,一次WM_LBUTTONDBLCLK,顺序为WM_LBUTTONUP,WM_LBUTTONDBLCLK,WM_LBUTTONUP。由于双击只想处理WM_LBUTTONDBLCLK.但是WM_LBUTTONDBLCLK前必定会先收到WM_LBUTTONUP的消息。那么在单击事件里面就无法区分开是否进行了又击操作。 在同事的建议下我试用了下outlook的托盘图标的左键单,双击事件的响应。发现一个好玩的问题:当左键单击的菜单弹出速度比右键单击弹出的速度慢了一点。而且刚好左键也有响应双击事件。于是鉴定为要区分开同一键的单双击。比较好的处理方式就是单击事件延后处理当发现处理了双击事件后就不处理单击事件. 但是由于WM_LBUTTONUP消息会发送两次这为设定开关变量,以及控制会超成不便.于是google了一下.收获不小: 如果在窗口风格中未包含CS_DBLCLKS,双击了鼠标按键,那么窗口消息处理程序会接收到下面这些消息: WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDOWN WM_LBUTTONUP 如果您的窗口类别风格中包含了CS_DBLCLKS,那么双击时窗口消息处理程序将收到如下消息: WM_LBUTTONDOWN WM_LBUTTONUP WM_LBUTTONDBLCLK WM_LBUTTONUP 于是我把处理WM_LBUTTONUP的消息改成WM_LBUTTONDOWN问题解决. 代码如下: ........... switch (lParam) { case WM_LBUTTONDOWN: //廷时运行 beginTime = GetTickCount(); this->m_isLDoubleClick = false; while(GetTickCount() < beginTime+GetDoubleClickTime()) { MSG msg; HWND hwnd = NULL; PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE); TranslateMessage(&msg); DispatchMessage(&msg); } if(this->m_isLDoubleClick) { break; } //do something break case WM_LBUTTONDBLCLK: this->m_isLDoubleClick = true; //do something break; default: break; }