首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用WM_MOUSEMOVE/WM_NCMOUSEMOVE更新指定区域

使用WM_MOUSEMOVE/WM_NCMOUSEMOVE更新指定区域
EN

Stack Overflow用户
提问于 2021-03-02 12:16:10
回答 1查看 188关注 0票数 0

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

代码语言:javascript
复制
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按钮相比,无论我滑过的速度有多快,它仍然可以正常工作。它是怎么做到的?

EN

回答 1

Stack Overflow用户

发布于 2021-03-06 16:39:48

如果鼠标移动得很快,你的程序就是can receive not all mouse messages。我认为在你的例子中,当鼠标移动到一个新的位置时,你的程序仍然会处理一个旧位置的消息,因此输出是错误的。

要处理此问题,您可以检查其他处理程序中的鼠标位置,例如WM_TIMER

在启动时(通常在WM_CREATE处理程序中),您应该创建计时器:

代码语言:javascript
复制
#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处理程序中:

代码语言:javascript
复制
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)关闭计时器:

代码语言:javascript
复制
KillTimer(hwnd, 1);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66433271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档