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

Window will only update on mouse move

本文关键字:移动 更新 鼠标 窗口      更新时间:2023-10-16

我正在编程的测试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;
    }

当窗口空闲时,没有消息被发布到窗口,这就是为什么GetMessage不会返回,消息循环中的代码也不会运行。

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

正如@KenWhite在评论中提到的那样,使用WM_TIMER。它是为这类任务而设计的。