【问题标题】:How I can draw a border in a region using delphi?如何使用delphi在区域中绘制边框?
【发布时间】:2012-04-20 00:56:58
【问题描述】:

我正在使用此代码

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;

这样设置表格的形状

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

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

【问题讨论】:

    标签: delphi


    【解决方案1】:

    如果你要继续使用一个区域,那么在Form的OnPaint事件中调用Win32 APIFrameRgn()函数,例如:

    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 相同,并且其背景填充了表单的TranparentColor,然后您可以在OnPaint 事件中将TBitmap 绘制到表单的Canvas 上(或者将TBitmap 放在客户端对齐TImage 上,这样您就不必手动绘制表单)。每当 Windows 合成您的窗体窗口进行显示时,它会自动忽略使用TransparentColor 的最终像素。最终结果是相同的 - 形状窗口 - 但 Windows 将能够更有效地管理透明度、命中测试、与其他窗口重叠/混合等。

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多