我正在从事一个个人项目,最近遇到了很多问题,导致了很多问题,但是嘿,这就是 SO 的用途,对吧? ;)
无论如何,我尝试制作一个透明的 TPanel,这是通过制作自定义组件来实现的。 我制作的应用程序是关于魔兽世界的,我制作了一个天赋计算器,就像在官方网站上一样,但在 Windows 应用程序中。 天赋是法术/技能,每个天赋都有显示在工具提示中的信息。
所以我有一个包含信息的工具提示,
我有一个人才网格,当我将鼠标悬停在人才上时,我想查看信息。 除此之外,我希望信息显示在光标位置附近。
几乎可以工作了。定位有效,它显示了正确的信息但是!问题就在这里。 看看这张图片:
黑色半透明面板是我的工具提示。
您可以看到位于名为 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 我得到了这个结果
举个例子,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 的问题:
关于Delphi面板和自定义组件Z顺序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14254295/