Winapi 为什么赢了';在调用看似无关的函数之前,是否在顶部窗口中显示矩形?

Winapi 为什么赢了';在调用看似无关的函数之前,是否在顶部窗口中显示矩形?,winapi,gdi,Winapi,Gdi,我正在尝试刷新尝试直接在桌面窗口上用GDI绘图 在我看到一个有效的例子之前,一切似乎都不起作用;但只有在调用RegisterClassEx之后。我用LoadIcon替换了RegisterClassEx,它仍然可以工作 下面的代码仅在调用LoadIcon(在3秒延迟睡眠后)时绘制正方形 起初我以为这只是我的MinGW,但我在VisualStudio2012中测试了它,它也直到睡觉后才画正方形 为什么会发生这种情况?在不注册任何窗口类/调用LoadIcon的情况下,如何使绘图正常工作 #includ

我正在尝试刷新尝试直接在桌面窗口上用GDI绘图

在我看到一个有效的例子之前,一切似乎都不起作用;但只有在调用RegisterClassEx之后。我用LoadIcon替换了RegisterClassEx,它仍然可以工作

下面的代码仅在调用LoadIcon(在3秒延迟睡眠后)时绘制正方形

起初我以为这只是我的MinGW,但我在VisualStudio2012中测试了它,它也直到睡觉后才画正方形

为什么会发生这种情况?在不注册任何窗口类/调用LoadIcon的情况下,如何使绘图正常工作

#include <Windows.h>

int main(int argc, char **argv)
{
    HBRUSH hbr = CreateSolidBrush(RGB(0, 255, 255));
    RECT rect = {0, 0, 100, 100};
    HDC hdc = GetDC(NULL);

    FillRect(hdc, &rect, hbr);
    Sleep(3000);
    LoadIcon(NULL,IDI_APPLICATION);

    return 0;
}
#包括
int main(int argc,字符**argv)
{
HBRUSH hbr=CreateSolidBrush(RGB(0,255,255));
RECT RECT={0,01000};
HDC HDC=GetDC(空);
FillRect(hdc和rect、hbr);
睡眠(3000);
LoadIcon(空,IDI_应用程序);
返回0;
}

我认为答案是,为了使用GDI,您的应用程序必须有一个消息泵。的首页引用了。没有消息泵的GUI应用程序的某些部分可能仍然可以工作,但不能以可预测的方式工作,例如,您看到的行为。您的答案似乎是正确的。当我删除LoadIcon并将
CoInitialize(NULL)放入时,它甚至可以工作在块的开头和
coninitialize()结束。您可以尝试调用
GdiFlush()
@JonathanPotter,这样做很有效。我在寻找那个函数。有点奇怪,为什么它在程序开始时也能与CoInitialize(NULL)一起工作,即使最后没有CoUninitialize(没有GdiFlush)。。。非常奇怪。我认为答案是为了使用GDI,您的应用程序必须有一个消息泵。的首页引用了。没有消息泵的GUI应用程序的某些部分可能仍然可以工作,但不能以可预测的方式工作,例如,您看到的行为。您的答案似乎是正确的。当我删除LoadIcon并将
CoInitialize(NULL)放入时,它甚至可以工作在块的开头和
coninitialize()结束。您可以尝试调用
GdiFlush()
@JonathanPotter,这样做很有效。我在寻找那个函数。有点奇怪,为什么它在程序开始时也能与CoInitialize(NULL)一起工作,即使最后没有CoUninitialize(没有GdiFlush)。。。很奇怪。