Delphi:GDI+和渐变边框/矩形的问题

5

Delphi XE2. 这里有一个窗体和一个框架。

窗体和框架都启用了doublebuffered,并启用了GlassFrame

我正在绘制框架的背景,并尝试绘制一个右对齐的矩形,但是出现了一些错误,特别是在调整大小时出现错误。

这个矩形无法正常绘制从透明到不透明黑色的颜色渐变。 enter image description here

uses ...GDIPAPI, GDIPOBJ...
type
  TFrame2 = class(TFrame)
    procedure PaintWindow(DC: HDC); override;

  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation
{$R *.dfm}

procedure TFrame2.PaintWindow(DC: HDC);
var
  R: TGPRect;
  pen: TGPPen;
  Graphics: TGPGraphics;
  linGrBrush: TGPLinearGradientBrush;
begin
  R.X := 0;
  R.Y := 0;
  R.Width := self.Width;
  R.Height := self.Height;

  Graphics := TGPGraphics.Create(DC);

  linGrBrush := TGPLinearGradientBrush.Create(R, MakeColor(255, 120, 248, 253),
    MakeColor(255, 200, 216, 250), LinearGradientModeVertical);

  Graphics.FillRectangle(linGrBrush, 0, 0, R.Width, R.Height);
  linGrBrush.Free;

    linGrBrush := TGPLinearGradientBrush.Create(MakePoint(0, 0),
MakePoint(189, 2), MakeColor(0, 0, 0, 0), MakeColor(255, 0, 0, 0));

  Graphics.FillRectangle(linGrBrush, R.Width - 189, 79, 189, 2);

  linGrBrush.Free;
  Graphics.Free;
end;

请帮我在渐变框架上正常绘制一个矩形,颜色从透明到不透明的黑色。

1个回答

3

将下面所示的代码更改后,将绘制一条从透明到黑色不透明的右对齐细线。

linGrBrush := TGPLinearGradientBrush.Create( 
  MakePoint(R.Width-189,0), MakePoint(R.Width,2),
  MakeColor(0, 0, 0, 0),
  MakeColor(255, 0, 0, 0));
Pen := TGPPen.Create( linGrBrush,3);
Graphics.DrawLine(Pen,R.Width-189,79,R.Width,79);
InvalidateRect(Handle,Rect(0,0,R.Width,R.Height),False);

更新:使用InvalidateRect来刷新整个区域会强制重新绘制框架。否则,重绘可能会以奇怪的方式被裁剪。这将解决您的颜色更改效果。
但是,最后两张图片中显示了一个GlassFrame缺陷。TFrame的外框在顶部和上侧没有正确显示。
显示启用了GlassFrame时TFrame的功能障碍(左图)。右图显示了完全黑色的框架(即使在此图中右侧被压缩),并且已禁用GlassFrame
更新2:
启用SheetOfGlass,一切似乎都没问题。
更新3:
GlassFrame的顶部属性设置为40会导致框架周围出现奇怪的边框效果。将其设置为0可以解决此问题。

谢谢!但这不是我想要的。请下载上面的项目并调整窗体大小,您会发现矩形的颜色会改变。 - maxfax
看到我的更新。开启/关闭glassframe时仍然存在奇怪的效果。在两侧,当glassframe打开时,边框从高度35左右开始出现。这似乎是系统中的一个错误。 - LU RD
如果您注释掉PaintWindow过程并切换glassframe开/关,玻璃框架的功能障碍会更加明显。 - LU RD
啊,你在GlassFrame属性中定义了 top = 40。将其设置为零解决了奇怪的窗口边框效果。 - LU RD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接