4

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

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

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

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

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

黑色半透明面板是我的工具提示。您会看到位于pnlTalents 名为Panel1. 调用的工具提示TooltipTalent也有 parent 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 回答