C ++ Builder 2009 - 如何确定控件的窗口是否可见

时间:2013-03-16 01:19:08

标签: c++ winapi com c++builder void-pointers

我有一个TWinControl,我正在尝试确定父窗口是否可见。

我看到TWinControl的属性为ParentWindowParentWindow的返回类型为void *。所以我很好奇我是否必须转换为特定类型,然后让我访问以检查窗口是否可见。

有没有人知道我需要投射的类型,或其他方式来实现这个目标?


其他疑难解答说明,第1部分:

我试图通过以下方式获取ParentWindows类:

String parentWindowClassName = ((TObject *)(Control->ParentWindow))->ClassName();

但是这违反了访问权限。我也试过转换为TForm,这也给出了访问冲突,这让我相信父窗口可能是由windows控制的。如果是这样,有没有人知道检查它是否可见的任何技巧?例如。任何COM技巧或任何东西?

其他疑难解答说明,第2部分:

这个问题的答案可能有助于解决我的另一个问题:C++ Builder 2009 - Cannot focus a disabled or invisible window

然而,如果没有这种方法,其他问题可能会得到解决,这就是为什么我发布了一个不同的问题。

其他疑难解答说明,第3部分:

感谢额外的信息肯。我从代码帮助中获取了我的信息: enter image description here

但是我从http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Controls_TWinControl_ParentWindow.html

看到你的HWND返回类型

这可能是我需要的额外信息......如果我开始工作,我会发布解决方案。 THX。

1 个答案:

答案 0 :(得分:0)

@KenWhite,你的建议给了我所需要的,谢谢!

以下是解决我问题的代码:

#include "winuser.h"

...

void SafeSetFocus(TWinControl *Control)
{
    HWND hWnd = Control->ParentWindow;
    bool parentIsVisible = IsWindowVisible(hWnd);

    if(Control->Enabled && Control->Visible && parentIsVisible)
    {
        Control->SetFocus();
    }
}