3

透明な子ウィンドウを作成しようとしています。

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-Window が移動しますが、画面上では移動したときに表示されます。Form1が移動すると、Form2をクリックできず、クリックが通過するため、ウィンドウが移動したことがわかります。

質問は、これらの機能なしで子を透明なウィンドウにする方法ですか? (親と一緒に移動する通常のウィンドウ)

4

1 に答える 1

1

Form2 を移動またはサイズ変更するたびに、UpdateLayeredWindow を呼び出す必要があります。または、TCustomTransparentControl の子孫に置き換えることもできます。

于 2011-10-13T12:16:16.550 に答える