1

我正在使用此代码

procedure DrawPolygonRegion(wnd : HWND; rect : TRect; NumPoints : Integer; DoStarShape : Boolean);
const
  RadConvert = PI/180;
  Degrees    = 360;
  MaxLines   = 100;
var
  x, y,
  xCenter,
  yCenter,
  radius,
  pts,
  I       : Integer;
  angle,
  rotation: Extended;
  arPts   : Array[0..MaxLines] of TPoint;
  rgn  : HRGN;
begin

  xCenter := (rect.Right - rect.Left) div 2;
  yCenter := (rect.Bottom - rect.Top) div 2;
  if DoStarShape then
    begin
      rotation := Degrees/(2*NumPoints);
      pts := 2 * NumPoints;
    end
  else
    begin
      rotation := Degrees/NumPoints;             //get number of degrees to turn per point
      pts := NumPoints
    end;
  radius := yCenter;

  {This loop defines the Cartesian points of the shape. Again,
   I've added 90 degrees to the rotation angle so the shapes will
   stand up rather than lie on their sides. Thanks again to Terry Smithwick and
   David Ullrich for their trig help on CompuServe.}
  for I := 0 to pts - 1 do begin
    if DoStarShape then
      if (I mod 2) = 0 then //which means that
        radius := Round(radius/2)
      else
        radius := yCenter;

    angle := ((I * rotation) + 90) * RadConvert;
    x := xCenter + Round(cos(angle) * radius);
    y := yCenter - Round(sin(angle) * radius);
    arPts[I].X := x;
    arPts[I].Y := y;
  end;

  rgn := CreatePolygonRgn(arPts, pts, WINDING);
  SetWindowRgn(wnd, rgn, TRUE);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DrawPolygonRegion(Handle, BoundsRect, 5, True)
end;

以这种方式设置表格的形状

在此处输入图像描述

现在我需要在形状中绘制一个彩色边框,但我不知道如何完成这项任务。我寻找的结果是这样的。

在此处输入图像描述

任何想法如何完成这项任务?

4

1 回答 1

4

如果您要继续使用某个区域,则FrameRgn()在 Form 的OnPaint事件中调用 Win32 API 函数,例如:

type
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
  private
    Rgn: HRGN;
  protected
    procedure CreateWindowHandle(const Params: TCreateParams); override;
  end;

function CreateMyPolygonRegion(rect : TRect; NumPoints : Integer; DoStarShape : Boolean): HRGN; 
const 
  RadConvert = PI/180; 
  Degrees    = 360; 
  MaxLines   = 100; 
var 
  x, y, 
  xCenter, 
  yCenter, 
  radius, 
  pts, 
  I       : Integer; 
  angle, 
  rotation: Extended; 
  arPts   : Array[0..MaxLines] of TPoint; 
begin 
  xCenter := (rect.Right - rect.Left) div 2; 
  yCenter := (rect.Bottom - rect.Top) div 2; 
  if DoStarShape then 
    begin 
      rotation := Degrees/(2*NumPoints); 
      pts := 2 * NumPoints; 
    end 
  else 
    begin 
      rotation := Degrees/NumPoints;             //get number of degrees to turn per point 
      pts := NumPoints 
    end; 
  radius := yCenter; 

  {This loop defines the Cartesian points of the shape. Again, 
   I've added 90 degrees to the rotation angle so the shapes will 
   stand up rather than lie on their sides. Thanks again to Terry Smithwick and 
   David Ullrich for their trig help on CompuServe.} 
  for I := 0 to pts - 1 do begin 
    if DoStarShape then 
      if (I mod 2) = 0 then //which means that 
        radius := Round(radius/2) 
      else 
        radius := yCenter; 

    angle := ((I * rotation) + 90) * RadConvert; 
    x := xCenter + Round(cos(angle) * radius); 
    y := yCenter - Round(sin(angle) * radius); 
    arPts[I].X := x; 
    arPts[I].Y := y; 
  end; 

  Result := CreatePolygonRgn(arPts, pts, WINDING); 
end; 

procedure TForm1.CreateWindowHandle(const Params: TCreateParams);
begin
  inherited;
  Rgn := CreateMyPolygonRegion(BoundsRect, 5, True);
  SetWindowRgn(Handle, Rgn, TRUE);
end;

procedure TForm1.FormPaint(Sender: TObject); 
begin 
  Canvas.FillRect(ClientRect);
  Canvas.Brush.Color := clRed;
  FrameRgn(Canvas.Handle, Rgn, Canvas.Brush.Handle, 2, 2);
end; 

但是,在 Windows 2000 和更高版本上,不再使用窗口区域会更好、更有效地利用操作系统资源。 TForm自 Delphi 6 以来已经有TransparentTransparentColor可用的属性,您应该使用它们。将Transparent属性设置为True,将TransparentColor属性设置为不会出现在表单中其他任何位置的唯一颜色(clFuchsia常用),绘制所需的形状并在与表单TBitmap相同WidthHeight背景填充的Form's TranparentColor,然后您可以在事件中将 绘制TBitmap到 Form's上(或者将CanvasOnPaintTBitmapTImage所以您不必手动绘制表单)。每当 Windows 合成您的窗体窗口进行显示时,它会自动省略使用TransparentColor. 最终结果是相同的 - 一个成形的窗口 - 但 Windows 将能够更有效地管理透明度、命中测试、与其他窗口重叠/混合等。

于 2012-04-20T01:03:52.300 回答