Delphi: проблемы с GDI + и градиентной рамкой / прямоугольником - PullRequest
5 голосов
/ 12 января 2012

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 голосов
/ 12 января 2012

При изменении кода, как показано ниже, выровненная по правому краю тонкая линия от прозрачного к непрозрачному черному.

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

Показывает дисфункцию TFrame при включенном GlassFrame (слева). На правой картинке показана полностью черная рамка (хотя на этой картинке правая сторона была обрезана при сжатии) с отключенным GlassFrame.

Обновление 2:

Включите SheetOfGlass, и все выглядит нормально.

enter image description here

Обновление 3:

Свойство top GlassFrame было установлено равным 40 и вызывало странный эффект границы вокруг кадра. Установка в 0 исправила эту проблему.

...