Имитация кнопки обратной связи на веб-странице
Я хотел бы разместить кнопку обратной связи на главной форме (MDIParent), которая имитирует их на веб-страницах.
Нравится, чтобы она росла, когда мышь проходит над ней. Совсем как в сети.
Форма с вопросами и отправка данных, мне действительно не нужны, только визуальные материалы.
Существует ли такой компонент ?.
Я не думаю, что это трудно сделать, но если это уже существует, то это будет стоить мне некоторого времени.
Спасибо
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