Delphi面板和自定义组件Z顺序问题

时间:2013-01-10 09:14:22

标签: delphi z-order delphi-xe3 tpanel

我正在从事一个个人项目,最近我遇到了很多问题,导致了很多问题,但是,嘿,这就是SO的正确用途? ;)

无论如何,我尝试制作透明的TPanel,这是我通过制作自定义组件实现的。 我正在制作的应用程序是关于魔兽世界,我在官方网站上制作了一个人才计算器,但在Windows应用程序中。 天赋是法术/技能,每个天赋都有信息显示在工具提示中。

所以我有一个信息工具提示,

我有一个有天赋的网格,当我徘徊在一个天才我想看到信息。 除此之外,我希望信息显示在光标位置附近。

几乎可以工作。定位工作,它显示正确的信息但是!这是问题所在。 看看这张图片: Talent screen

黑色半透明面板是我的工具提示。 你会看到那些位于名为pnlTalents的深灰色面板中的才能(那个小4x6网格) 该面板的父级是较浅的灰色面板,覆盖整个表单Panel1。 名为TooltipTalent的工具提示也包含父Panel1。 我尝试将pnlTalents发送到后面并将TooltipTalent带到前面,但这根本没有任何区别。 我甚至在职位改变时尝试了TooltipTalent.BringToFront;。 注意工具提示如何在屏幕顶部带有速度按钮的深灰色面板顶部没有问题。 我比较了两个面板(顶部的一个和天赋的一个),发现性能没有区别。 我在这里严重缺乏想法。我不知道造成它的原因以及如何解决这个问题。

作为最后的手段,我尝试删除覆盖整个表单的另一个透明面板,看看是否有帮助,但问题仍然存在。

我也可以发布我的自定义组件的代码,但这将是很多。 如果你想看到代码让我知道,我会找到一种方法来展示它:)

任何人都可以帮我这个吗? 亲切的问候

1 个答案:

答案 0 :(得分: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我得到了这个结果

enter image description here

就像示例一样,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的问题:

enter image description here