Delphi 如何创建子层alpha透明窗口?

Delphi 如何创建子层alpha透明窗口?,delphi,childwindow,alpha-transparency,layered-windows,Delphi,Childwindow,Alpha Transparency,Layered Windows,我正在尝试创建透明的子窗口 procedure TForm1.BtnGoClick(Sender: TObject); var bmp:TBitmap; BitmapPos: TPoint; BitmapSize: TSIZE; BlendFunction: _BLENDFUNCTION; exStyle: Cardinal; begin bmp := TBitmap.Create; bmp.LoadFromFile('my32bitbitmap.bmp'); e

我正在尝试创建透明的子窗口

procedure TForm1.BtnGoClick(Sender: TObject);
var
  bmp:TBitmap;
  BitmapPos: TPoint;
  BitmapSize: TSIZE;
  BlendFunction: _BLENDFUNCTION;
  exStyle: Cardinal;
begin
  bmp := TBitmap.Create;
  bmp.LoadFromFile('my32bitbitmap.bmp');
  exStyle := GetWindowLongA(Form2.Handle, GWL_EXSTYLE);
  if (exStyle and WS_EX_LAYERED = 0) then
    SetWindowLong(Form2.Handle, GWL_EXSTYLE, exStyle or WS_EX_LAYERED);
  BitmapPos := Point(0, 0);
  BitmapSize.cx := bmp.Width;
  BitmapSize.cy := bmp.Height;
  BlendFunction.BlendOp := AC_SRC_OVER;
  BlendFunction.BlendFlags := 0;
  BlendFunction.SourceConstantAlpha := 200;
  BlendFunction.AlphaFormat := AC_SRC_ALPHA;
  UpdateLayeredWindow(Form2.Handle, 0, nil, @BitmapSize, bmp.Canvas.Handle, @BitmapPos, 0, @BlendFunction, ULW_ALPHA);

  Windows.SetParent(Form2.Handle, Form1.Handle);
  bmp.Free;      
end;
它几乎起作用了:Form2在Form1中变成了一个漂亮的透明窗口。但看起来Form2并没有随着Form1一起移动。当我移动Form1时,Form2窗口会移动,但在屏幕上我看到了它。当窗体1被移动时,我不能点击窗体2,点击会通过,所以我知道窗口被移动了


那个么问题是,若并没有这些特性,如何使子窗口透明?(只是普通的窗口,随着它的移动而移动)

您需要在每次移动或调整表单大小后调用UpdateLayeredWindow 2。或者您可以将其替换为TCustomTransparentControl子体。

Delphi表单有一个可以设置的
AlphaBlendValue
属性。这将使窗体透明。为什么要乱搞API调用,请参见:@Johan:property AlphaBlendValue只能使我的窗口始终透明。对我来说还不够……请添加一张移动Form1时看到的屏幕截图,好吗?我不完全理解你的行为。Form2是否为Form1的子代?当你移动Form1时,它是否呈现ok但敌人Form2似乎停留在原来的位置,或者你是否看到一条“轨迹”,或者…?请注意为什么会出现第二种形式-你能在第一种形式上使用32位图像实现同样的效果吗?@DavidM有一个正在讨论的代码示例。你可以试着自己看看。我不认为短屏幕在这方面有帮助。你们必须移动窗口,看看会发生什么。没有“踪迹”之类的。你到底试过什么?TCustomTransparentControl或UpdateLayeredWindow?已尝试UpdateLayeredWindow。有没有关于如何为子窗口使用TCustomTransparentControl和UpdateLayeredWindow的示例?您是否尝试过这些针对子窗口的解决方案?