最善の解決策は、コントロール (イメージ) をダイアログ キーを処理するウィンドウ (コントロール) に配置し、このコントロールが適切なタイミングでキーボード フォーカスを受け取るようにすることです。
ええと、正直なところ、グラフィック コントロールを動かして何かを描いたりアニメーション化したりしているようですね。最良の方法は、カスタム コントロールを作成し (から派生)、手動で描画することです (または、グラフィックの子コントロールを作成することもできます) 。TCustomControl
次に、このコントロールを矢印キーに反応させることが簡単にできます。
このコントロールはそれを行います:
unit WindowContainer;
interface
uses
SysUtils, Windows, Messages, Classes, Controls;
type
TWindowContainer = class(TCustomControl)
private
protected
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
public
constructor Create(AOwner: TComponent); override;
published
property OnStartDrag;
property OnStartDock;
property OnUnDock;
property OnClick;
property OnCanResize;
property OnAlignPosition;
property OnAlignInsertBefore;
property OnResize;
property OnMouseWheel;
property OnMouseWheelDown;
property OnMouseWheelUp;
property OnMouseUp;
property OnMouseMove;
property OnMouseLeave;
property OnMouseEnter;
property OnMouseDown;
property OnMouseActivate;
property OnKeyUp;
property OnKeyPress;
property OnKeyDown;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Rejbrand 2009', [TWindowContainer]);
end;
{ TWindowContainer }
constructor TWindowContainer.Create(AOwner: TComponent);
begin
inherited;
ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
csSetCaption, csDoubleClicks, csReplicatable, csPannable,
csFramed];
end;
procedure TWindowContainer.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
inherited;
Message.Result := Message.Result or DLGC_WANTCHARS or DLGC_WANTARROWS
or DLGC_WANTTAB or DLGC_WANTALLKEYS;
end;
end.
サンプル デモ EXE
このコントロールを試すには、形状/画像を配置し、OnKeyDown
このコントロールのイベントを使用します。また、ユーザーがクリックしたときなどに、このコントロールにフォーカスを設定してください。
procedure TForm1.WindowContainer1Click(Sender: TObject);
begin
WindowContainer1.SetFocus;
end;
さて、コントロールを動かしてアニメーションを行うのは良くありません。代わりに、手動で描画する必要があります。この回答をこの回答のコードと組み合わせると、完了です。