2015-05-24 50 views
0

我在我的应用程序中使用了TPaintBox。已经设置了几个鼠标事件处理程序:鼠标向下,鼠标向上等。但是,我也想响应键盘输入:如果用户按下任何功能键,我想执行一个单独的过程(事件处理程序),而不是Mouse *事件处理函数。但是我也需要在新程序中使用鼠标位置。将键盘事件添加到TPaintBox组件

我该如何编码,因为TPaintBox不支持任何按键事件?

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    // here some code 
end; 

procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, 
    Y: Integer); 
begin 
    // more code here 
end; 

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    // here other code 
end; 

回答

8

TPaintBox不会TWinControl下降,而是来自TGraphicControl,这意味着它不能接收输入焦点,所以它没有任何功能反应到键盘事件。

可能的解决方案:

  • 落实OnKeyPress事件上的颜料盒所在的父窗体,使窗体的KeyPreview财产。
  • 添加一个特定按键按下的动作,作为其ShortCut属性并实现其OnExecute事件处理程序。 (另见:When does a ShortCut fire?)。
  • 为MainForm或应用程序实施OnShortCut事件处理程序。
  • 将PaintBox放置并对齐到TWinControl并实现该容器的OnKeyPress事件。

对于鼠标和键盘输入的组合,检查鼠标事件的Shift参数或使用Win32 GetKeyState()GetKeyboardState()功能。

+1

我会为最后一个选项投票,更具体地说:将paintbox放在一个框架上。这样,您可以在IDE中使用设计器,并仍然在项目中的其他表单上重新使用该框架。 –