C++ 如何使在没有WS_的情况下创建的Win32控件可见?

C++ 如何使在没有WS_的情况下创建的Win32控件可见?,c++,winapi,controls,C++,Winapi,Controls,假设hCtl是一个控件的句柄,该控件创建时不带WS\u可见标志,例如: HWND hCtl = CreateWindowEx(0, WC_STATIC, L"some text", WS_CHILD | SS_NOTIFY, // no WS_VISIBLE flag 0, 0, 0, 0, hWndParent, (HMENU)IDC_STATIC1, g_hInst, 0); 有没有

假设
hCtl
是一个控件的句柄,该控件创建时不带WS\u可见标志,例如:

HWND hCtl = CreateWindowEx(0, WC_STATIC, L"some text",
                           WS_CHILD | SS_NOTIFY, // no WS_VISIBLE flag
                           0, 0, 0, 0, hWndParent, (HMENU)IDC_STATIC1, g_hInst, 0);
有没有比下面更直接的方法让它可见

void make_visible(HWND hCtl, HWND hWndParent) {
    SetWindowLongPtr(hCtl, GWL_STYLE,
                     GetWindowLongPtr(hCtl, GWL_STYLE) | WS_VISIBLE);
    RECT rc{};
    GetClientRect(hCtl, &rc);
    MapWindowRect(hCtl, hWndParent, &rc);
    InvalidateRect(hWndParent, &rc, TRUE);
    UpdateWindow(hWndParent);

    //ShowWindow(hCtl, SW_SHOW); // no use: does not update window
    //SetWindowPos(hCtl, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);   // no use: does not update window
}

使窗口可见的正常方法只有函数。没有必要处理旗帜等问题。通常使用
SW\u SHOW
作为子窗口的参数。检查其他值并使用您认为合适的值

如果窗口有一个可见的矩形,并且没有被另一个窗口覆盖,它将显示出来。甚至不需要UpdateWindow调用。该窗口将在下一个绘制周期中显示。如果控件的大小为0,0,0,0(创建时),它将永远不会显示

如果窗口位于不同的线程上,也可以使用一个函数来避免阻塞


顺便说一句:我不明白你试图使父窗口区域无效。如果有子窗口剪辑(
WS_CLIPCHILDREN
),则没有任何效果。

我相信您的问题在于您自己明确设置了
WS_VISIBLE
样式,然后调用
ShowWindow
,这会让窗口误以为窗口已经可见,不需要重新绘制

只需调用
ShowWindow
。因为。您不需要强制重新绘制控件


此外,如果您发现需要显式地使控件无效,只需执行
invalidate-institute(hCtl,NULL)
,而不必费心处理
GetClientRect
MapWindowRect
就足够了,要使子控件可见,请像这样调用
SetWindowPos

SetWindowPos(hCtl, 0, 0, 0, 0, 0, 
  SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_SHOWWINDOW);
您要调用的代码
MapWindowRect
无效安装
更新安装
等应该被删除


可能真正的问题是创建了宽度和高度为零的静态控件。

ShowWindow()适用于顶级窗口。带有SWP_SHOWWINDOW的SetWindowPos()在子控件上工作。您的意思是仅使控件的客户端区域无效吗?这就是你的代码所做的。这是不寻常的。当指出时,我将大小更正为非零值。这不是故意的。所以,一旦你这样做了,只需调用<代码> StWistWOPOS 我演示,这就是全部。我让你知道编辑,所以也许你也可能想考虑编辑出你的答案的那一部分。这是我无意中犯的一个错误,不幸的是,它冲淡了这个问题。我只是照着写的方式回答了这个问题。我不认为我需要花更多的时间来进行编辑。你现在知道怎么打开窗户了,明白了。我只是觉得其他人读到这个问题会更干净。我感谢你的意见。