4

私は個人的なプロジェクトに取り組んでおり、最近多くの問題に直面して多くの質問を引き起こしていますが、ねえ、それはSOが正しいのですか?;)

とにかく、カスタムコンポーネントを作成して実現した透明なTPanelを作成してみました。私が作っているアプリは、World of Warcraftに関するもので、公式Webサイトのように、Windowsアプリケーションでタレント計算機を作成しました。タレントは呪文/スキルであり、各タレントにはツールチップに表示される情報があります。

だから私は情報を含むツールチップを持っています、

私には才能のあるグリッドがあり、才能にカーソルを合わせると情報が表示されます。それに加えて、カーソルの位置の近くに情報を表示したいと思います。

ほとんど動作します。ポジショニングは機能しますが、正しい情報が表示されます!ここに問題があります。この画像を見てください: タレントスクリーン

黒の半透明のパネルが私のツールチップです。と呼ばれる濃い灰色のパネルに配置されている才能(その小さな4x6グリッド)が表示されます。pnlTalents そのパネルの親は、と呼ばれるフォーム全体をカバーする明るい灰色のパネルですPanel1。と呼ばれるツールチップにTooltipTalentも親がありPanel1ます。pnlTalents後ろに送ってTooltipTalent前に持ってきてみましたが、まったく違いはありませんでした。私も試しましたTooltipTalent.BringToFront;位置が変わった瞬間。スピードボタンが付いた画面上部の暗い灰色のパネルの上にツールチップが問題なく表示されていることに注目してください。両方のパネル(上部のパネルと才能のあるパネル)を比較したところ、プロパティに違いはありませんでした。私はここで真剣にアイデアを使い果たしています。何が原因で、どうすればこの問題を解決できるのかわかりません。

最後の手段として、フォーム全体を覆う別の透明なパネルをドロップして、それが役立つかどうかを確認しましたが、問題は解決しませんでした。

カスタムコンポーネントのコードを投稿することもできますが、それは大変なことです。コードを見たい場合は私に知らせてください、そして私はそれを示す方法を見つけます:)

誰かがこれについて私を助けることができますか?敬具

4

1 に答える 1

3
procedure TMyPanel.CreateParams(var params: TCreateParams);
begin
  params.ExStyle := params.ExStyle or WS_EX_TRANSPARENT or WS_EX_TOPMOST ;
  inherited CreateParams(params);    
end;

Quickhackcodeを使用すると、この結果が得られます

ここに画像の説明を入力してください

例として、Image1には半透明のpngが含まれています。

unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, dxGDIPlusClasses;

type

  TMyPanel=Class(TPanel)
     procedure CreateParams(var params: TCreateParams); override;
     procedure WMEraseBkGnd(var msg: TWMEraseBkGnd); message WM_ERASEBKGND;
  End;


  TForm4 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Image1: TImage;
    Button2: TButton;
    CheckBox1: TCheckBox;
    Panel2: TPanel;
    Button3: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }

   Fmp:TMyPanel;
   fisInPaint:Boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

{ TMyPanel }

procedure TMyPanel.CreateParams(var params: TCreateParams);
begin
  params.ExStyle := params.ExStyle or WS_EX_TRANSPARENT or WS_EX_TOPMOST ;
  inherited CreateParams(params);
end;



procedure TMyPanel.WMEraseBkGnd(var msg: TWMEraseBkGnd);
begin
  SetBkMode (msg.DC, TRANSPARENT);
  msg.result := 1;
end;

procedure TForm4.Button1Click(Sender: TObject);
begin

  Fmp := TMyPanel.Create(self);
  With Fmp do
    begin
      Parent := self;
      left:= Panel1.Left -100;
      top:= Panel1.top -100;
      width := 300;
      Height := 300;
    end;
   image1.Parent := Fmp;
   Image1.Align := alClient;
   Image1.Stretch := true;
   Fmp.BringToFront;
   Label1.Parent := FMP;
   label1.Transparent := true;
   Label1.Left := 100;
   Label1.Left := 100;
end;

procedure TForm4.Button3Click(Sender: TObject);
begin
   Fmp.Left := fmp.Left + 10;
end;

end.

XPでも問題を再現できません:

ここに画像の説明を入力してください

于 2013-01-10T10:46:02.270 に答える