Имитация кнопки обратной связи на веб-странице



Я хотел бы разместить кнопку обратной связи на главной форме (MDIParent), которая имитирует их на веб-страницах.



Нравится, чтобы она росла, когда мышь проходит над ней. Совсем как в сети.
Форма с вопросами и отправка данных, мне действительно не нужны, только визуальные материалы.



Существует ли такой компонент ?.
Я не думаю, что это трудно сделать, но если это уже существует, то это будет стоить мне некоторого времени.



Спасибо

543   1  

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.

И результат:

Результат

Вы также должны реализовать некоторую логику, чтобы запретить пользователю скрывать панель обратной связи, когда будет фактически заполнение полей, но это естественная слабость такого рода формы обратной связи.

Comments

    Ничего не найдено.