【问题标题】:C++ Builder 2009 - Cannot focus a disabled or invisible windowC++ Builder 2009 - 无法聚焦禁用或不可见的窗口
【发布时间】:2013-03-16 01:04:42
【问题描述】:

我一直在重构一个旧项目。我发现当老程序员尝试使用TWinControlsSetFocus() 时,他们用空catch 块将它们包围在try/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() 的控件和父级不起作用,请参见屏幕截图。

【问题讨论】:

    标签: c++ c++builder


    【解决方案1】:

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

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

    【讨论】:

    • 我尝试了 CanFocus() 作为我的故障排除步骤的一部分。我发现它可以替换 Control->Enabled 和 Control->Visible,但是如果父级不可见,它并不能解决异常。
    【解决方案2】:

    感谢@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();
        }
    }
    

    【讨论】:

    • 这是错误的 - ParentWindow 是 HWND(或 THandle),而不是 THandle*。您不应该硬转换,尤其是不要转换为指针类型。这在您的另一个问题stackoverflow.com/questions/15444503/… 中已指出
    【解决方案3】:

    改进James Oravecanswer。我只是改变了:

    bool parentIsVisible = IsWindowVisible(hWnd);
    

    到:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      相关资源
      最近更新 更多