1

タイトルは多くのことを述べていないので、説明させてください。

1枚の画像と4つのボタンを入れた応募フォームを作りました。上、下、左、右のキーを押して画像を移動すると、画像を移動する代わりにボタンが選択されます。たとえば、下キーを押すとボタン 2 が選択され、上キーを押すとボタン 1 が選択されます。

申し訳ありませんが、どのように見えるかを実際に説明することはできません。フォームで試してみてください。コードは次のとおりです。

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_UP:
      image1.Top := image1.Top - 10;
    VK_DOWN:
      image1.Top := image1.Top + 10;
    VK_LEFT:
      image1.Left := image1.Left - 10;
    VK_RIGHT:
      image1.Left := image1.Left + 10;
   end;
end;
4

1 に答える 1

6

最善の解決策は、コントロール (イメージ) をダイアログ キーを処理するウィンドウ (コントロール) に配置し、このコントロールが適切なタイミングでキーボード フォーカスを受け取るようにすることです。

ええと、正直なところ、グラフィック コントロールを動かして何かを描いたりアニメーション化したりしているようですね。最良の方法は、カスタム コントロールを作成し (から派生)、手動で描画することです (または、グラフィックの子コントロールを作成することもできます) 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;

さて、コントロールを動かしてアニメーションを行うのは良くありません。代わりに、手動で描画する必要があります。この回答をこの回答のコードと組み合わせると、完了です。

于 2013-04-19T14:02:39.497 に答える