0

いくつかの情報を表示するアプリを作成しようとしています.Panelsランタイムを作成し、その上に情報を配置します.各パネルは画像のようにフラットになり、アプリはランタイムテーマを使用するため、パネルを変更することはできません.マウスの動きで bg の色、TSpeedButton に情報を配置しようとしました :v Oo アプリがランタイム テーマを使用しているときにフラットなときに素晴らしいハイライト機能がありますが、主な問題は、スピード ボタンを移動すると画像とラベルが移動しないことです。これだけ必要です、彼らはただそこにとどまります..

TCustomPanel.Paint を編集して、パネルが強調表示されたボタンのように見えるかどうかを確認し、最後にコードを追加しようとしました。

PaintRect := ClientRect;
Details := StyleServices.GetElementDetails(ttbButtonHot);
StyleServices.DrawElement(Canvas.Handle, Details, PaintRect);

しかし、成功しませんでした..

また、実行時にいくつかのカスタム コードの OnClick イベントをリンクするのは非常に困難です。

ShowMessage('custom message on each panel');

私はこれを行う方法について何も考えていません.誰かが私にアドバイスを与えるか、いくつかの例を見せてくれることを願っています..

ところで、パネルは次のように作成されます。

var
  P: TPanel;
begin
 P := TPanel.Create(Self);
 P.Left := 20;
 P.Top := 100;
 P.Width := 60;
 P.Height := 20;
 P.Visible := True;
 P.Parent := Self;
 @P.OnClick := @Showmessageproc; // somehow this way..
end;

アプリの写真:

写真

私がそうする場合:

procedure TMyPanel.MouseMove(Shift: TShiftState; X, Y: Integer);
var
  mEvnt: TTrackMouseEvent;
begin
  inherited;
  if not FMouseTracking then begin
    mEvnt.cbSize := SizeOf(mEvnt);
    mEvnt.dwFlags := TME_LEAVE;
    mEvnt.hwndTrack := Handle;
    TrackMouseEvent(mEvnt);
    FMouseTracking := True;
    showmessage('IN');
  end;
end;

procedure TMyPanel.WMMouseLeave(var Msg: TMessage);
begin
 if Msg.Msg = WM_MOUSELEAVE then showmessage('OUT');
  Msg.Result := 0;
  FMouseTracking := False;
  if Assigned(FOnMouseLeave) then
    FOnMouseLeave(Self);
end;

procedure G(Sender: TObject);
begin
showmessage('message');
end;

procedure TMainFrm.Button1Click(Sender: TObject);
var
  P: TMyPanel;
begin
 P := TMyPanel.Create(Self);
 P.Left := 20;
 I := I + 100;
 P.Top := I;
 P.Width := 200;
 P.Height := 80;
 P.Visible := True;
 P.Parent := Self;
 @P.OnClick := @g;
end;

ランタイムで作成されたパネルでマウスを動かすと、IN と OUT の 2 つのメッセージ ボックスが表示されます。問題は、作成したパネルのキャンバスに描画できないことです。上記の例は、より簡単な方法で実現できます。

 @P.OnMouseLeave := @onmouseleaveproc;
 @P.OnMouseMove  := @onmousemoveproc;

しかし、Canvas を使用すると、すべてがより難しくなります。キャンバスが TCustomPanel で保護されていることをどこかで読んだことがあります。

また、別の質問があります: OnMouseMove などと呼ばれるパネルを処理することは可能ですか? おそらく30個あるからです(実行時に作成されたパネル)

私はこの方法を試しました:(そしてそれはうまくいきません)

type
  TMyPanel = class(TPanel)
  public
   constructor Create(AOwner: TComponent); override;
  private
  //  FMouseTracking: Boolean;
  //  FOnMouseLeave: TNotifyEvent;
    procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE;
  protected
  //  procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  published
  //  property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
  end;

    constructor TMyPanel.Create(AOwner: TComponent);
    begin
      ControlStyle := ControlStyle - [csParentBackground] + [csOpaque];
      inherited;
    end;


    procedure TMyPanel.CMMouseEnter(var msg: TMessage);
    begin
      inherited;
      Color := clBlue;
      { Do Whatever }
    end;

    procedure TMyPanel.CMMouseLeave(var msg: TMessage);
    begin
      inherited;
      Color := clRed;
      { Do Whatever }
    end;

ただ、色は変わりません。(テーマOFFで色が変わります)

4

2 に答える 2

1

基本的にここでは Delphi 6 について説明されていますが、同じ概念だと思います。パネルのカスタム Windows メッセージ ハンドラーを定義したいと考えています。これにより、基本的なマウスの出入り機能が提供されます。そこから TPanel プロパティを設定して、好みのものを見つけることができます。たとえば、速度ボタンを模倣するには、背景色を設定し、それに応じて境界線のベベルを変更するだけでよい場合があります。それが十分でない場合は、マウスの出入り時に TPanel の Canvas に直接書き込む (見たい動作をペイントする) ことで、目的の視覚的な動作を得ることができます。

于 2013-05-26T17:02:12.523 に答える