2012-08-14 4 views
2

웹 페이지를 시뮬레이션 할 수있는 메인 (MDIParent) 폼에 피드백 버튼을 배치하고 싶습니다.웹 페이지 피드백 버튼 시뮬레이션

마우스가 올라갈 때 자 랍니다. 웹처럼. 질문이있는 양식과 데이터를 보내려면 정말 필요하지 않습니다. 단지 시각적 인 것입니다.

이러한 구성 요소가 있습니까? 나는 그것을하기가 어렵다고 생각하지 않지만, 이미 존재한다면 그것은 나에게도 어느 정도 시간이 걸릴 것이다.

감사

+0

피드백 버튼이있는 페이지에 대한 링크를 게시 할 수 있습니까? 나는 당신이 무엇을 의미하는지 100 % 확실하지 않다. ... – TLama

+0

@tlama 질문은 어떻게 생겼는지에 관한 것이 아니라, 마우스가 다른 요소 위로 이동할 때 부동 패널을 표시하는 방법에 관한 것이다. –

+0

@Juan, 그럼 아마도 마우스를 움직이면 성장한 부분을 놓친 것입니다. 왜냐하면 그것은 나에게 어떤 종류의 애니메이션처럼 들리기 때문입니다. – TLama

답변

5

은 다음처럼 코드를 사용할 수있는 애니메이션 슬라이드 패널을 만들려면 :

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. 

업데이트 : 여기

이와 지금, 위의 또 다른 버전입니다 일반적인 피드백 버튼과 같은 세로 텍스트는 에 펼쳐지는 페인트 상자에 렌더링됩니다. utton 패널 :

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. 

그리고 결과 : 또한 실제로 필드를 작성합니다 피드백 패널을 숨길 수있는 사용자를 방지하기 위해 일부 로직을 구현해야

Result

하지만 자연 약점이다 이러한 종류의 피드백 양식.

+0

예. AnimateWindow에 대해 알고 있었나요? 감사합니다 – Jlouro

+1

당신을 환영합니다! 그러나 그것은 단지 추측이었습니다. 이 대답을 확장하고 애니메이션 효과가있는 gif를 추가하려고합니다 (이 작업을 수행하는 데 적합한 응용 프로그램을 얻는 경우). – TLama

+3

@traama - 아주 추측! –

관련 문제