前提条件:
1、透明的分层窗口作为画布:
LONG stl = GetWindowLong(hWndCavas, GWL_EXSTYLE);
LONG s = ::SetWindowLong(hWndCavas, GWL_EXSTYLE, stl | WS_EX_LAYERED);
::SetWindowLong(hWndCanvas, GWL_EXSTYLE, stl| WS_EX_TRANSPARENT);
2、工具条窗口无焦点,为画布提供画笔选择
setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
::SetWindowPos((HWND)winId(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
导致问题:鼠标从画布移动到工具条,点击工具条窗口,这时候输入焦点还在画布(尽管工具条浮在画布上面), 第一次点击事件投递给了画布,第二次点击事件才投递给工具条,导致需要点击两次才能切换到工具条输入。
解决方法:
1、捕获画布窗口的WM_MOUSELEAVE事件
TRACKMOUSEEVENT csTME;
csTME.cbSize = sizeof(csTME);
csTME.dwFlags = TME_LEAVE;// 捕获WM_MOUSELEAVE事件
csTME.hwndTrack = hWndCanvas;// hWndCanvas为画布窗口
csTME.dwHoverTime = 20;
::_TrackMouseEvent(&csTME);
2、在画布窗口的WM_MOUSELEAVE事件处理函数中,激活工具条窗口
POINT pt;
GetCursorPos(&pt);
HWND hWnd = WindowFromPoint(pt);
if (hWnd && hWnd == toolbarWnd)
{
::SetWindowPos(toolbarWnd, NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE); // active the toolbar window
}