我的建议:当光标悬停在指定区域时,会出现一个矩形,用红色笔刷填充。当光标离开此区域时,用蓝色笔刷填充。所以我处理WM_MOUSEMOVE/WM_NCMOUSEMOVE消息(取决于区域,客户端区域或非客户端区域),根据光标位置的参数,我做不同的绘制。然而,如果我拆分得更快,它就不能正常工作。

case WM_NCMOUSEMOVE: {
UINT HITPOS = wParam;
POINT pt={GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam)};
BOOL active_flag=(GetActiveWindow()==hwnd);
Frame_NCDraw(hwnd,&active_flag);
if(HITPOS==HTMENU) Frame_PopMenu(hwnd,pt);
TRACKMOUSEEVENT tme;
tme.cbSize=sizeof(TRACKMOUSEEVENT);
tme.dwFlags=TME_NONCLIENT;
tme.hwndTrack=hwnd;
tme.dwHoverTime=HOVER_DEFAULT;
TrackMouseEvent(&tme);
return 0;
} break;
case WM_NCMOUSELEAVE: {
BOOL active_flag=(GetActiveWindow()==hwnd);
Frame_NCDraw(hwnd,&active_flag);
TRACKMOUSEEVENT tme;
tme.cbSize=sizeof(TRACKMOUSEEVENT);
tme.dwFlags=TME_CANCEL;
tme.hwndTrack=hwnd;
tme.dwHoverTime=HOVER_DEFAULT;
TrackMouseEvent(&tme);
} break;我认为这可能是因为每条WM_MOUSEMOVE消息的旋转都被触发了。与window非客户端区域的max/min/close按钮相比,无论我滑过的速度有多快,它仍然可以正常工作。它是怎么做到的?
发布于 2021-03-06 16:39:48
如果鼠标移动得很快,你的程序就是can receive not all mouse messages。我认为在你的例子中,当鼠标移动到一个新的位置时,你的程序仍然会处理一个旧位置的消息,因此输出是错误的。
要处理此问题,您可以检查其他处理程序中的鼠标位置,例如WM_TIMER。
在启动时(通常在WM_CREATE处理程序中),您应该创建计时器:
#define ID_MY_TIMER 750
void SetupTimer(HWND hwnd)
{
//Set timer for every second
if( !SetTimer(hwnd, ID_MY_TIMER, 1000, (TIMERPROC) NULL))
handle error;
}在您的WndProc add WM_TIMER处理程序中:
case WM_TIMER:
{
if( wParam == ID_MY_TIMER )
{
TODO:
Get mouse position (for example GetCursorPos, it returns cursor
position in screen coordinates), compare it with the previous position.
If the position changed, issue a redraw command (seems it is Frame_NCDraw
call in your case).
Save the current position as previous position
//Set timer
SetupTimer(hwnd);
}
break;
}在关闭时(通常是WM_DESTROY)关闭计时器:
KillTimer(hwnd, 1);https://stackoverflow.com/questions/66433271
复制相似问题