窗口只会在鼠标移动时更新

Posted

技术标签:

【中文标题】窗口只会在鼠标移动时更新【英文标题】:Window will only update on mouse move 【发布时间】:2014-09-05 14:18:48 【问题描述】:

我正在编程的测试 GUI 有问题。我想显示 GUI 已经运行的时间量,并让这个计数每秒更新一次(左右)。我的问题是,我的 GUI 只更新我移动鼠标的时间。

我已经单步执行了我的程序,在 InvalidateRect() 调用之前添加了一个断点。当我有这个断点时,我可以看到句柄 hwndTimeOn 得到更新(基本上当我的程序中断时,我会按 F5 并且我看到句柄每次都更新为正确的计数)。但是当我在没有断点的情况下运行我的程序时,我的句柄只有在我移动鼠标时才会更新......这是否意味着我的主窗口失去焦点(或不活动),因此没有正确更新我的 hwndTimeOn?我不确定还有什么可能是真正的原因,我在我的窗口处理函数中没有任何关于鼠标移动或点击的消息处理,并且我没有在我的程序中的其他任何地方更新我的句柄 hwndTimeOn。

这里有一些代码:

使用的一些变量:

CString temp, timeDiff;
time_t startCount, now, start;
double diffTime;

对于时间阅读文本编辑句柄:

hwndTimeOn= CreateWindowEx(NULL,
    "EDIT",
    "Time On",
    WS_TABSTOP | WS_VISIBLE |
    WS_CHILD,
    520,
    5,
    100,
    24,
    hwnd,
    (HMENU)IDC_TIMEON,
    GetModuleHandle(NULL),
    NULL);

在我的消息循环中:

if (difftime(now, startCount) > 1)
    
        diffTime = difftime(now, start);
        temp.Format("%f", diffTime);
        timeDiff = "Time On: ";
        timeDiff.Append(temp);

        SetWindowText(hwndTimeOn, timeDiff);

        InvalidateRect(hwndTimeOn, NULL, TRUE);
        startCount = now;
    

【问题讨论】:

没有。这意味着时间更改不会发布会导致进入消息循环的 Windows 消息。为了做你想做的事,你需要使用一个 Windows 定时器,它会向窗口发送一个 WM_TIMER 事件;为了响应该事件,您可以更新您的 UI。 好的,我试试,谢谢 【参考方案1】:

窗口空闲时没有消息发布到窗口,这就是GetMessage 不返回并且消息循环内的代码不运行的原因。

当您移动鼠标时,WM_MOUSEMOVE 消息将被发布,作为副作用,程序也有机会在消息循环中运行代码。

正如@KenWhite 在 cmets 中提到的,使用WM_TIMER。它专为此类任务而设计。

【讨论】:

好的,谢谢,我没有意识到窗口空闲时没有消息发布到窗口,现在你提到它很有意义 谢谢解答,只是一个问题,WM_TIMER事件的频率是多少?我的意思是每秒触发一次?半秒? @Miguel 你决定。参见SetTimer的文档。

以上是关于窗口只会在鼠标移动时更新的主要内容,如果未能解决你的问题,请参考以下文章

为啥不先移动鼠标就无法滚动视差?

AS3:mouseX 在鼠标移动之前不会更新

鼠标移动时滚动窗口

用于移动SDL2窗口的功能,而鼠标按下时会闪烁该窗口,并且移动速度不够快

在用鼠标拖动窗口时有阴影怎么办

用鼠标移动窗口时,移动上下滚动条时总是感觉像水波一样挪动是怎么回事,