Как создать дочернее слоистое альфа-прозрачное окно? - PullRequest
3 голосов
/ 13 октября 2011

Я пытаюсь создать прозрачное дочернее окно.

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, щелчки проходят, поэтому я знаю, что окно было перемещено.

Итак, вопрос в том, как сделать дочернее прозрачное окно без этих функций? (просто обычное окно, которое движется вместе с parrent)

1 Ответ

1 голос
/ 13 октября 2011

Вам необходимо вызывать UpdateLayeredWindow после каждого перемещения или изменения размера вашей Form2. Или вы можете заменить его на потомок TCustomTransparentControl.

...