【问题标题】:Simulate a webpage feedback button模拟网页反馈按钮
【发布时间】:2012-08-14 18:29:00
【问题描述】:

我喜欢在模拟网页中的主 (MDIParent) 表单上放置一个反馈按钮。

当鼠标经过它时,它会变大。就像网络一样。 带有问题的表格和数据的发送,我真的不需要它,只是视觉的东西。

有没有这样的组件? 我不认为这很难做到,但如果它已经存在,它会在一段时间内和我一样。

谢谢

【问题讨论】:

  • 你能发布一个链接到一些有反馈按钮的页面吗?我不是 100% 确定你的意思...
  • @TLama 问题不在于它的外观,而在于当鼠标移到另一个元素上时如何显示浮动面板
  • @Juan,所以我可能错过了 当鼠标移过它时增长的部分,因为这对我来说听起来像是某种动画。
  • 在提问时,如果您包含您正在使用的特定 Delphi 版本,这真的很有帮助,因此人们不必尝试记住或查找您的旧问题来找出答案。添加 Delphi 7 标签。
  • @Rob,这里的 Delphi 版本很有帮助。更高版本的 Delphi 提供了可以在组件中覆盖的 DoMouseEnter/DoMouseLeave 事件,而早期版本特别要求您处理 *CM_MOUSE*` 事件。

标签: delphi feedback


【解决方案1】:

要制作动画幻灯片面板,您可以使用如下代码:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    FFeedbackBtn: TPanel;
    FFeedbackPanel: TPanel;
    procedure OnFeedbackBtnMouseEnter(Sender: TObject);
    procedure OnFeedbackPanelMouseLeave(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FFeedbackBtn := TPanel.Create(Self);
  FFeedbackBtn.Parent := Self;
  FFeedbackBtn.Anchors := [akLeft, akTop, akBottom];
  FFeedbackBtn.Caption := '';
  FFeedbackBtn.SetBounds(0, 0, 40, ClientHeight);
  FFeedbackBtn.OnMouseEnter := OnFeedbackBtnMouseEnter;

  FFeedbackPanel := TPanel.Create(Self);
  FFeedbackPanel.Parent := Self;
  FFeedbackPanel.Anchors := [akLeft, akTop, akBottom];
  FFeedbackPanel.Caption := 'Feedback panel';
  FFeedbackPanel.Visible := False;
  FFeedbackPanel.SetBounds(0, 0, 250, ClientHeight);
  FFeedbackPanel.OnMouseLeave := OnFeedbackPanelMouseLeave;
end;

procedure TForm1.OnFeedbackBtnMouseEnter(Sender: TObject);
begin
  AnimateWindow(FFeedbackPanel.Handle, 150, AW_ACTIVATE or AW_SLIDE or
    AW_HOR_POSITIVE);
end;

procedure TForm1.OnFeedbackPanelMouseLeave(Sender: TObject);
begin
  AnimateWindow(FFeedbackPanel.Handle, 150, AW_HIDE or AW_SLIDE or
    AW_HOR_NEGATIVE);
end;

end.

更新:

这是上面的另一个版本,现在像 典型的反馈按钮一样具有垂直文本,呈现在 按钮面板上拉伸的油漆框上:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    FFeedbackBtn: TPanel;
    FFeedbackBtnOverlay: TPaintBox;
    FFeedbackPanel: TPanel;
    procedure OnFeedbackBtnMouseEnter(Sender: TObject);
    procedure OnFeedbackPanelMouseLeave(Sender: TObject);
    procedure OnFeedbackBtnOverlayPaint(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FFeedbackBtn := TPanel.Create(Self);
  FFeedbackBtn.Parent := Self;
  FFeedbackBtn.Anchors := [akLeft, akTop, akBottom];
  FFeedbackBtn.Caption := '';
  FFeedbackBtn.Color := $0000B3FF;
  FFeedbackBtn.ParentBackground := False;
  FFeedbackBtn.SetBounds(0, 0, 40, ClientHeight);

  FFeedbackBtnOverlay := TPaintBox.Create(Self);
  FFeedbackBtnOverlay.Parent := FFeedbackBtn;
  FFeedbackBtnOverlay.Align := alClient;
  FFeedbackBtnOverlay.OnPaint := OnFeedbackBtnOverlayPaint;
  FFeedbackBtnOverlay.OnMouseEnter := OnFeedbackBtnMouseEnter;

  FFeedbackPanel := TPanel.Create(Self);
  FFeedbackPanel.Parent := Self;
  FFeedbackPanel.Anchors := [akLeft, akTop, akBottom];
  FFeedbackPanel.Caption := 'Feedback panel';
  FFeedbackPanel.Color := $0000F9FF;
  FFeedbackPanel.ParentBackground := False;
  FFeedbackPanel.Visible := False;
  FFeedbackPanel.SetBounds(0, 0, 250, ClientHeight);
  FFeedbackPanel.OnMouseLeave := OnFeedbackPanelMouseLeave;
end;

procedure TForm1.OnFeedbackBtnMouseEnter(Sender: TObject);
begin
  AnimateWindow(FFeedbackPanel.Handle, 150, AW_ACTIVATE or AW_SLIDE or
    AW_HOR_POSITIVE);
end;

procedure TForm1.OnFeedbackPanelMouseLeave(Sender: TObject);
begin
  AnimateWindow(FFeedbackPanel.Handle, 150, AW_HIDE or AW_SLIDE or
    AW_HOR_NEGATIVE);
end;

procedure TForm1.OnFeedbackBtnOverlayPaint(Sender: TObject);
var
  S: string;
  X, Y: Integer;
begin
  S := 'Feedback...';
  with FFeedbackBtnOverlay do
  begin
    Canvas.Brush.Color := $0000B3FF;
    Canvas.FillRect(ClientRect);
    Canvas.Font.Orientation := 900;
    X := (ClientWidth - Canvas.TextHeight(S)) div 2;
    Y := ClientHeight - (ClientHeight - Canvas.TextWidth(S)) div 2;
    Canvas.TextOut(X, Y, S);
  end;
end;

end.

结果:

您还应该实现一些逻辑,以防止用户在实际填写字段时隐藏反馈面板,但这是此类反馈表单的自然弱点。

【讨论】:

  • 是的。知道 AnimateWindow。谢谢
  • 不客气!但这只是一个猜测。我将扩展这个答案并尝试添加一个带有动画效果的 gif(如果我得到了正确的应用程序)。
猜你喜欢
  • 2011-05-29
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 2020-10-18
  • 2011-07-13
  • 1970-01-01
相关资源
最近更新 更多