2015-05-24 47 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中使用設計器,並仍然在項目中的其他表單上重新使用該框架。 –