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

标签 c++ visual-studio winapi

我正在编程的测试 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。它是为此类任务而设计的。

关于c++ - 窗口只会在鼠标移动时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25688018/

相关文章:

visual-studio - 默认显示所有文件

python - 将 Qt 嵌入 native 窗口 (Windows)

c++ - 如何在类中正确使用结构?

c++ - 如何找到 C++ 标准的修订版,其中删除或更改了特定要求?

c# - C# 中的类型推断有哪些优点和缺点?

c++ - "LNK1104: cannot open file '×'": How to find out who wants X linked in?

c# - 如何检查 bool 列表中的值?

c# - Windows 如何决定显示屏幕保护程序

c++ - unique_ptr 所有权语义

c++ - 用于继承和构造函数的未解析的外部符号 c++