2012-01-11 19 views
5

Delphi XE2. Hay un formulario & un marco.Delphi: problemas con GDI + y gradiente de marco/rectángulo

La forma y el marco son doublebuffered. GlassFrame está habilitado.

Pinto el fondo del marco y trato de dibujar un rectángulo alineado a la derecha pero tengo errores. Especialmente tengo errores mientras cambio el tamaño.

El rectángulo no quiere dibujarse normalmente desde la transparencia hasta el color negro opaco. 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; 

Por favor ayude a que dibuje un rectángulo en el marco de degradado normalmente de transparencia al color negro opaco.

Respuesta

3

Al cambiar el código como se muestra a continuación se dibujará una línea fina alineada desde la transparencia hasta el negro opaco.

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); 

actualización, utilizando InvalidateRect para toda la zona obliga a redibujar total de la trama. De lo contrario, el redibujado podría cortarse de maneras extrañas. Esto resolverá su efecto de cambio de color.

Pero un defecto GlassFrame se ilustra con las dos últimas imágenes a continuación. El marco exterior del TFrame no se ve correctamente en los lados superior y superior.

enter image description here

GlassFrame enabled GlassFrame disabled

Mostrando disfunción del TFrame cuando GlassFrame está habilitado (izquierda). La imagen de la derecha muestra un marco negro completo (aunque en esta imagen el lado derecho se cortó en compresión) con GlassFrame deshabilitado.

Actualización 2:

Habilitar SheetOfGlass y todo parece bien.

enter image description here

Actualización 3:

La propiedad top GlassFrame se establece en 40, y causó el efecto frontera extraña alrededor del marco. Establecerlo en 0 solucionó este problema.

+0

Gracias! Pero no es lo que quiero. Descargue el proyecto anterior y cambie el tamaño del formulario; verá que cambian los colores del rectángulo. – maxfax

+0

Ver mi actualización. Sigue siendo un efecto extraño al encender/apagar el marco de vidrio. Los bordes del marco comienzan alrededor de la altura 35 en ambos lados con el marco de vidrio activado. Parece ser un error en el sistema en alguna parte. –

+0

La disfunción del marco de cristal es más visible si comenta el procedimiento PaintWindow y enciende/apaga el marco de cristal. –

Cuestiones relacionadas