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

标签 delphi z-order delphi-xe3 tpanel

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

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

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

我有一个人才网格,当我将鼠标悬停在人才上时,我想查看信息。 除此之外,我希望信息显示在光标位置附近。

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

黑色半透明面板是我的工具提示。 您可以看到位于名为 pnlTalents 的深灰色面板中的天赋(那个小 4x6 网格) 该面板的父面板是覆盖整个表单的浅灰色面板,称为 Panel1。 名为 TooltipTalent 的工具提示也有父级 Panel1。 我尝试将 pnlTalent 发送到后面并将 TooltipTalent 发送到前面,但这根本没有区别。 我什至在位置改变时尝试了 TooltipTalent.BringToFront; 。 请注意,工具提示毫无问题地位于屏幕顶部带有速度按钮的深灰色面板的顶部。 我比较了两个面板(顶部的面板和带有天赋的面板),发现属性没有差异。 我在这里真的没有想法了。我不知道是什么原因造成的以及如何解决这个问题。

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

我也可以发布我的自定义组件的代码,但这会很多。 如果您想查看代码,请告诉我,我会找到一种方法来展示它:)

有人可以帮我解决这个问题吗? 亲切的问候

最佳答案

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

关于Delphi面板和自定义组件Z顺序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14254295/

相关文章:

delphi - 我怎样才能使用 Delphi XE3 在 SQLite 中插入 Blob

delphi - 以编程方式设置停靠工具栏的位置

windows - 如何获取串行 COM 端口的状态

windows - Delphi - 如何防止 Forms/MsgBoxes 在先前的表单下移动?

android - 共享元素转换(前景/背景)问题

delphi - 衰落值常规功能/过程

delphi - 文件放入 ListView 后看不到 TWMDropFiles

image - 如何正确添加资源(*.res)文件到组件包中?

Delphi 的功能区图像出现故障

python - 为 matplotlib 散点图中的每个标记提供单独的 zorder 值