MainWindow中的子窗口显示一秒钟然后消失

时间:2020-07-23 16:16:18

标签: c++ winapi

我有MainWindow实例,并且要在其中创建一堆子窗口,这些子窗口是我这样做的GemWindow类的实例

    for (unsigned int i = 0; i < win.GetcGem(); i++)
    {
        for (unsigned int j = 0; j < win.GetcGem(); j++)
        {
            if (!win.Gems[i][j].Create(L"gem", WS_CHILDWINDOW | WS_VISIBLE, NULL, 0, 0, 80, 80, win.Window(), NULL))
                return 0;
        }
    }

但是子窗口显示了一秒钟(至少在我的机器上),然后它们消失了(我使用spy ++进行了检查),并且有一些窗口作为MainWindow的子窗口,但未显示。 我找不到任何可靠的理由来删除它们。

感谢您抽出宝贵时间来帮助

1 个答案:

答案 0 :(得分:1)

您可以通过SetClassLong功能修改背景色,而无需处理WM_PAINT消息。

只需将代码修改为:

for (unsigned int i = 0; i < GetcGem(); i++)
{
    for (unsigned int j = 0; j < GetcGem(); j++)
    {
        if (Gems[i][j].Create(L"gem", WS_CHILD | WS_VISIBLE, NULL, 5 + i * GetsGem().cx + i * 5, 5 + j * GetsGem().cy + j * 5, GetsGem().cx, GetsGem().cy, Window(), NULL))
        {
            HBRUSH hbrush = CreateSolidBrush(0X7d7d7d);//rgb hexadecimal
            HBRUSH hOldBrush = (HBRUSH)SetClassLongPtr(Gems[i][j].Window(), GCLP_HBRBACKGROUND, (LONG_PTR)hbrush);
            DeleteObject(hOldBrush);
            InvalidateRect(Gems[i][j].Window(), NULL, 1);
        }
        else
        {
            return FALSE;
        }
    }
    
}