procedure TForm1.DoInvisible;
var
  AControl : TControl;
  A, Margin, X, Y, CtlX, CtlY : Integer;
begin
  Margin := ( Width - ClientWidth ) div 2;
  FullRgn := CreateRectRgn(0, 0, Width, Height);
  X := Margin;
  Y := Height - ClientHeight - Margin;
  ClientRgn := CreateRectRgn( X, Y, X + ClientWidth, Y + ClientHeight );
  CombineRgn( FullRgn, FullRgn, ClientRgn, RGN_DIFF );
  for A := 0 to ControlCount - 1 do begin
    AControl := Controls[A];
    if ( AControl is TWinControl ) or ( AControl is TGraphicControl )
        then with AControl do begin
      if Visible then begin
        CtlX := X + Left;
        CtlY := Y + Top;
        CtlRgn := CreateRectRgn( CtlX, CtlY, CtlX + Width, CtlY + Height );
        CombineRgn( FullRgn, FullRgn, CtlRgn, RGN_OR );
      end;
    end;
  end;
  SetWindowRgn(Handle, FullRgn, TRUE);
end;
这是我看的一个制作透明窗体的源码,其中
  Margin := ( Width - ClientWidth ) div 2;
  FullRgn := CreateRectRgn(0, 0, Width, Height);
  X := Margin;
  Y := Height - ClientHeight - Margin;
  ClientRgn := CreateRectRgn( X, Y, X + ClientWidth, Y + ClientHeight );
我理解应该是创建窗体所在的区域,可是窗体的坐标X,Y为什么是这样的,请高手指点一下,确实理解不了,就是给下面几句注释一下,解释一下为什么,谢谢,我认为Width是屏幕宽度,ClientWidth是窗体宽度,可是为什么坐标成了两个之差的一半,如果我理解有错请指点一下,不胜感激!
  Margin := ( Width - ClientWidth ) div 2;
  FullRgn := CreateRectRgn(0, 0, Width, Height);
  X := Margin;
  Y := Height - ClientHeight - Margin;

解决方案 »

  1.   

    这样是让窗体局中。
      Margin := ( Width - ClientWidth ) div 2;//////窗体和客户区的空白/2
      FullRgn := CreateRectRgn(0, 0, Width, Height);
      X := Margin;///窗体的横坐标X应该在空白区/2
    -----------------------------------
    |            Width               |
    |  x ------------------------    |
    |   |                       |    |
    |   |      ClientWidth      |    |
    |   |                       |  x=(Width-ClientWidth)/2  Y := Height - ClientHeight - Margin;