如何知道我的控件是否可见

问题描述 投票:0回答:2

我有一个包含控件(编辑、组合框等)的对话框,有些控件可见,有些控件不可见。

在函数中,我想要的是循环所有控件并获取最后显示的控件。

我想补充一点,在创建对话框时,我将某些控件的可见性设置为

SW_HIDE
,将其他控件的可见性设置为
SW_SHOW

我所做的是使用

::IsWindowVisible
,但即使我将可见性设置为
SW_SHOW
,也会返回 false。

注意:该函数在对话框创建后立即调用,对话框还不可见。

c++ winapi
2个回答
5
投票

该控件在您调用该函数时可见,因为包含它的对话框不可见。根据

IsWindowVisible
函数的文档:

如果指定的窗口、其父窗口、其父窗口的父窗口等具有

WS_VISIBLE
样式,则返回值非零。否则,返回值为零。

这不仅解释了您所看到的行为,而且还提出了可能的解决方案。如果您想知道特定窗口是否设置了

WS_VISIBLE
样式位(并且不关心其任何祖先),则只需检索该窗口的样式并直接测试
WS_VISIBLE
位是否存在。例如:

LONG_PTR wndStyles = GetWindowLongPtr(hwndCtrl, GWL_STYLE);
bool     isVisible = (wndStyles & WS_VISIBLE) == WS_VISIBLE;

也就是说,我真的不明白为什么你需要这样做。如果您的对话框初始化代码设置了控件的可见性,那么您“知道”它们的可见性是什么。您不需要在运行时动态检索它。换句话说,这听起来像是“X-Y 问题”。我怀疑有更好的方法来编写代码,这样整个问题就不再是问题了。 我不确定答案。这是我的代码,我根据 Cody Gray 的建议使用。 ShowWindow(SW_SHOW)之后,结果没有改变!就我而言,控件在两种情况下都不可见,可能在对话框之外。


0
投票

返回真; // 除非将焦点设置到控件,否则返回 TRUE // 例外:OCX 属性页应返回 FALSE }

© www.soinside.com 2019 - 2024. All rights reserved.