2012-01-11 47 views
5

Delphi XE2。有一个表格&。德尔福:问题与GDI +&梯度框架/矩形

窗体和框架是doublebufferedGlassFrame已启用。

我画框的背景,并尝试绘制一个右对齐的矩形,但有错误。尤其是我在调整大小时出现了错误。

矩形不希望从透明度正常绘制到不透明的黑色。 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; 

请帮我从透明度通常绘制渐变框架上的一个矩形不透明黑色。

回答

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的外部框架在顶部和顶部不正确可见。

enter image description here

GlassFrame enabled GlassFrame disabled

GlassFrame被启用(左)显示TFRAME的功能障碍。 正确的图片显示一个完整的黑色框架(尽管在这张图片中右侧被压缩裁剪),GlassFrame被禁用。

更新2:

启用SheetOfGlass,一切似乎确定。

enter image description here

更新3:

GlassFrame顶部属性设置为40,并造成周围的框架奇怪的边界效应。将其设置为0可解决此问题。

+0

谢谢!但这不是我想要的。请下载上面的项目并调整窗体大小,您将看到矩形的颜色发生变化。 – maxfax 2012-01-12 17:21:14

+0

查看我的更新。打开/关闭玻璃框架仍然是一个奇怪的效果。框架边缘从玻璃框架两侧的高度35左右开始。似乎是某个系统中的一个错误。 – 2012-01-12 18:13:14

+0

如果您注销PaintWindow过程并打开/关闭玻璃框,玻璃框架功能障碍更加明显。 – 2012-01-12 18:27:30