15

我正在尝试确定已使用 CWnd::ShowWindow() 隐藏或启用的窗口控件的可见性。(或 ::ShowWindow(hWnd,nCmdShow))

我不能简单地使用 ::IsWindowVisible(hWnd),因为控件位于选项卡上,它本身可能会被切换出去,导致 IsWindowVisible 返回 FALSE。

有没有办法获得 SW_SHOW/HIDE(或其他)窗口状态,或者我是否需要使用 ShowWindow() 的 retun 值并相应地重置?

编辑:由于控件已启用(或禁用)以显示,但当前可能不可见,因为选项卡已切换,我认为它的 SW_SHOW 状态将保持不变,即使窗口本身实际上并未打开. 如果我的期望不切实际,那也没关系。

所以我真的在寻找'可以显示这个窗口/控件'

4

6 回答 6

12

调用GetWindowLong( handle, GWL_STYLE),检查返回值是否存在 WS_VISIBLE 样式。

于 2009-09-16T11:26:22.683 回答
7

使用GetWindowPlacement。它填充了具有字段的WINDOWPLACEMENTshowCmd结构。

showCmd
指定窗口的当前显示状态。此成员可以是以下值之一。

于 2009-09-16T11:24:23.203 回答
2

我会使用GetWindowPlacement,但我不确定我是否理解你想要的。它填充一个WINDOWPLACEMENT结构,然后使用该showCmd成员。

于 2009-09-16T11:23:16.107 回答
0

GetWindowPlacement () 函数只有在窗口最大化或最小化时才会起作用。否则,当窗口被隐藏时,showCmd 成员也会返回 SW_SHOWNORMAL,正如 StackOverflow 回答中指出的那样:WINDOWPLACEMENT's showCmd... always 1?

您可以使用更直接的布尔函数IsWindowVisible () 来获取指定的 Window 是否处于可见状态。

于 2016-01-05T15:18:15.057 回答
0

如果它是多选项卡对话框而不是控件,则覆盖为

void MyClass::OnShowWindow(BOOL bShow, UINT nStatus)
{
    m_nCmdShow = bShow;
    CDialog::OnShowWindow(bShow, nStatus);
}

在 BEGIN_MESSAGE_MAP 中,添加 ON_WM_SHOWWINDOW()。

如果窗口是 SW_SHOW 或 SW_HIDE,m_nCmdShow 现在具有状态。

于 2018-02-10T16:11:58.610 回答
-1

我不知道是否有适合此任务的方法,但我会尝试使用WindowFromPoint 函数。

评论

WindowFromPoint 函数不会检索隐藏或禁用窗口的句柄,即使该点位于窗口内。应用程序应使用 ChildWindowFromPoint 函数进行非限制性搜索。

例如,我会将控件的角坐标转换为屏幕坐标,然后尝试从这些点获取它的句柄。

于 2009-09-16T11:21:08.590 回答