键盘焦点:寻找一般策略

时间:2012-10-05 13:00:07

标签: c++ winapi keyboard c++builder

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

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

我想要的是在尽可能早的时候(我称之为“贪婪”焦点)自动返回图形区域的焦点 - 例如当文本编辑完成时(Enter键),或者当用户从组合框中选择了一个项目时。

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我知道你的意思我和一些BIG应用程序有类似的问题虱子CAD / CAM ...

我的解决方案简单,强大,我使用它多年。

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

  • 必须在区域所在的表格的活动中完成
  • 不在面板,油漆盒等......

2.创建非聚焦功能(最好是成员但不需要)

  • 此功能将失去任何VCL项目的焦点
  • 所以重点是形成你想要的本身
  • 我正在使用它:

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

  • bt_unfocus是按钮(可以是任何可聚焦的VCL组件)
  • 我将此按钮放在App的左上角,并将其大小设置为2x2像素
  • 它在开始时是不可见的
  • 的想法是将焦点设置到它(但首先取消隐藏它以便不抛出任何异常)
  • 然后隐藏它以使它失去焦点
  • 在BCB5和BDS2006中运行良好(未与任何其他IDE一起使用)
  • 正如您所看到的,大部分时间都是此组件不可见

4.现在何时调用main_unfocus?

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

希望有所帮助