【问题标题】:Delphi7, I cannot move images using UP, DOWN, LEFT, RIGHT Keys, because of buttonsDelphi7,由于按钮,我无法使用向上、向下、向左、向右键移动图像
【发布时间】:2013-04-19 13:57:11
【问题描述】:

标题并没有说太多,所以让我解释一下:

我制作了一个申请表,其中包含 1 个图像和 4 个按钮。每当我按下键:上、下、左、右移动图像时,它会选择我的按钮,而不是移动图像。例如,如果我按下向下键,它会选择我 button2,如果我按下向上,它将选择我 button1....

我很抱歉,我无法真正描述它的外观,在你的表单中尝试一下,你会明白我的意思,代码是这样的:

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;

【问题讨论】:

  • 使用无法获得焦点的按钮(和所有其他控件),例如 TSpeedButton
  • @LURD:没关系。
  • @AndreasRejbrand,是的,我意识到了这一点,删除了评论并添加了可能的重复项。
  • @LURD:我不认为这是一个完美的复制品,因为在这种情况下,最好的解决方案不是实际捕获箭头键,而是将图像放在单独的控件中。

标签: image delphi button key move


【解决方案1】:

最好的解决方案是将您的控件(图像)放入处理对话框键的窗口(控件)中,然后确保该控件在适当的时间获得键盘焦点。

好吧,老实说,您似乎是通过移动图形控件来绘制/制作动画的。 非常最好的方法是创建一个自定义控件(从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.

Sample demo EXE

要试用此控件,只需将形状/图像放入其中,并使用此控件的OnKeyDown 事件。此外,请确保将焦点设置为此控件,例如当用户点击它时:

procedure TForm1.WindowContainer1Click(Sender: TObject);
begin
  WindowContainer1.SetFocus;
end;

现在,通过移动控件来制作动画很糟糕。相反,您应该手动绘制。将此答案与this 答案中的代码结合起来,您就完成了。

【讨论】:

  • "进入一个窗口(控件),请问,什么是控件,哪个控件接收键盘焦点?
  • @user2296565:你可以自己轻松编写这样的控件。
  • 你能给我举个例子吗?谢谢
  • WM_GETDLGCODE 消息处理程序中使用Message.Result := Message.Result or DLGC_WANTALLKEYS; 还不够吗? DLGC_WANTALLKEYS 代码不是其他关键相关代码的内部组合(类似于DLGC_WANTALLKEYS = DLGC_WANTARROWS || DLGC_WANTCHARS || DLGC_WANTTAB)吗? [+1]
  • @TLama:IIRC 不是(令人惊讶的是)情况。
猜你喜欢
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多