0

我的应用程序有一个很大的图形区域,在侧面板中有一些控件(滑块、按钮、文本编辑控件)。图形区域理解一些键盘命令。

我的问题是,当侧面板中的控件处于焦点时,主图形区域将不会收到任何键盘命令,因此这会使用户感到困惑。但是,对于某些控件,这是有意的,例如文本编辑控件。

我想要的是尽早自动返回图形区域的焦点(我称之为“贪婪”焦点) - 例如,当文本编辑完成时(回车键),或者当用户从组合框。

我正在寻找一种干净而强大的策略来处理这个问题,无论是使用 Windows API 还是 Borland Vcl。

如果您想分享您的想法,我将不胜感激。

4

2 回答 2

0

我还没有完全解决这个问题,但是在表单级别拦截的一个非常有用的消息是CM_DIALOGKEY(仅限 Borland Vcl)。它为通常用于在 UI 中导航的每个键发送。也就是说,光标键、tab 和 shift-tab、Enter 和其他可能。

我添加了一个事件处理程序,用于CM_DIALOGKEY将焦点返回到图形区域并将按键转发到该组件。这样用户仍然可以通过键盘控制 UI 元素(对于文本输入很重要),但光标键由图形区域处理。

于 2012-10-19T12:31:11.647 回答
0

我知道你的意思我在一些 BIG 应用程序 lice CAD/CAM 上遇到了类似的问题......

我的解决方案简单、强大,而且我使用了多年。

1.该 gfx 区域的所有击键处理

  • 必须在该区域所在的表格事件中完成
  • 不在面板中,无论是油漆盒...

2.create unfocus函数(最好是form的成员,但不是必须的)

  • 此功能将失去任何 VCL 项目的焦点
  • 所以焦点会形成自己,这就是你想要的
  • 我正在使用这个:

    //---------------------------------------------------------------------------
    void main_unfocus()
        {          
        Main->bt_unfocus->Visible=true;
        Main->bt_unfocus->SetFocus();
        Main->bt_unfocus->Visible=false;
        }
    //---------------------------------------------------------------------------
    
  • Main 是表单指针

  • bt_unfocus 是按钮(可以是任何可聚焦的 VCL 组件)
  • 我通常将此按钮放在 App 的左上角,并将其大小设置为 2x2 像素
  • 一开始是不可见的
  • 这个想法是把焦点放在它上面(但首先取消隐藏它所以不会抛出异常)
  • 然后隐藏它使其失去焦点
  • 在 BCB5 和 BDS2006 中运行良好(没有与任何其他 IDE 一起使用)
  • 如您所见,大多数情况下该组件是不可见的

4.现在何时调用 main_unfocus ?

  • 当您使用鼠标从 gfx 区域的外部到内部时(OnMouseMove 事件)
  • 或者当你点击它时
  • 您也可以将其与记住焦点是否在 gfx 区域相结合
  • 这可以通过 OnExit 之类的事件来完成...
  • 或者当您在焦点位于编辑框内时按 Esc ...\
  • 我相信您掌握了这个想法并根据您的需要进行调整

希望能帮助到你

于 2014-01-28T10:21:24.043 回答