いくつかの情報を表示するアプリを作成しようとしています.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で色が変わります)