C ++ Builder 2009 - 无法关注禁用或不可见的窗口

时间:2013-03-16 01:04:42

标签: c++ c++builder

我一直在重构一个旧项目。我发现当旧程序员试图使用SetFocus() TWinControls时,他们在try / catches中用空catch块包围它们。因此吞下了例外。

如果启用了控件,程序的默认行为是设置焦点。为了做到这一点,我创建了一个函数,我可以将TWinControl传递给:

void SafeSetFocus(TWinControl *Control)
{
    if(Control->Enabled && Control->Visible)
    {
        Control->SetFocus();
    }
}

此代码适用于大多数程序,但是我发现在一个区域中我仍然得到Cannot focus a disabled or invisible window的调试器异常。

我认为问题可能与父母有关,所以我尝试了以下调整:

void SafeSetFocus(TWinControl *Control)
{
    if(Control->Enabled && Control->Visible &&
            Control->Parent->Enabled && Control->Parent->Visible)
    {
        Control->SetFocus();
    }
}

这改变并没有解决问题。因此,我意识到窗口可能不一定是父窗口。所以我的问题归结为:

有没有办法确定TWinControl的窗口是什么,并检查它是否可见?这假设例外是准确的......否则,如果您知道问题所在,请分享您的知识:)


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

我试图通过以下代码确定ParentWindow的类名:

String parentWindowClassName = ((TObject *)(Control->ParentWindow))->ClassName();
MessageDlg("parentWindowClassName: " + parentWindowClassName, mtInformation, TMsgDlgButtons() << mbOK, 0);

第一行代码在我运行时会出现访问冲突...有什么想法尝试确定信息的不同方式吗?

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

只有控件的

CanFocus()不起作用。控件的CanFocus()和父级不起作用,请参见屏幕截图。

enter image description here

3 个答案:

答案 0 :(得分:3)

有一个更简单的解决方案 - 在调用TWinControl::CanFocus()之前调用TWinControl::SetFocus()方法:

void SafeSetFocus(TWinControl *Control)
{
    if (Control->CanFocus())
        Control->SetFocus();
}

答案 1 :(得分:0)

感谢@KenWhite提出的问题建议(C++ Builder 2009 - How to Determine if Control's Window is Visible

他在这个问题上的建议引出了我的答案。以下是其他人可能感兴趣的代码:

#include "winuser.h"

...

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

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

答案 2 :(得分:0)

改进James Oravecanswer。我刚刚改变了:

bool parentIsVisible = IsWindowVisible(hWnd);

为:

bool parentIsVisible = IsWindowVisible((HWND__*)hWnd);