2012-01-11 10 views
5

Delphi XE2. C'è un modulo & una cornice.Delphi: problemi con GDI + e cornice sfumata/rettangolo

Il modulo e il frame sono doublebuffered. GlassFrame è abilitato.

Dipingo lo sfondo del riquadro e cerco di disegnare un rettangolo allineato a destra ma con alcuni bug. Soprattutto ho bug durante il ridimensionamento.

Il rettangolo non deve essere disegnato normalmente dalla trasparenza al nero 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; 

Please help me per disegnare un rettangolo sul telaio gradiente normalmente da trasparenza al colore nero opaco.

risposta

3

Cambiando il codice come mostrato di seguito si traccia una linea sottile allineata a destra da trasparente a nero 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); 

Aggiorna, utilizzando InvalidateRect per l'intera area costringe il ridisegno totale del telaio. Altrimenti il ​​ridisegno potrebbe essere ritagliato in modi strani. Questo risolverà il tuo effetto di cambio colore.

Tuttavia, un difetto GlassFrame è illustrato con le ultime due immagini di seguito. La cornice esterna di TFrame non è correttamente visibile sui lati superiore e superiore.

enter image description here

GlassFrame enabled GlassFrame disabled

Mostra disfunzione del TFrame quando GlassFrame è attivata (a sinistra). L'immagine a destra mostra una cornice nera completa (anche se in questa immagine il lato destro è stato ritagliato in compressione) con GlassFrame disattivato.

Aggiornamento 2:

Abilita SheetOfGlass e tutto sembra ok.

enter image description here

Update 3:

Il GlassFrame proprietà top è stata impostata su 40, e ha causato l'effetto frontiera strano attorno alla cornice. Impostandolo su 0 risolto questo problema.

+0

Grazie! Ma non è quello che voglio. Si prega di scaricare il progetto di cui sopra e ridimensionare il modulo, vedrete che i colori del rettangolo cambiano. – maxfax

+0

Vedere il mio aggiornamento. Ancora uno strano effetto quando accendi/spegni glassframe. I bordi del telaio iniziano intorno all'altezza 35 su entrambi i lati con la cornice di vetro inserita. Sembra essere un bug nel sistema da qualche parte. –

+0

La disfunzione del vetroflo è più visibile se si commenta la procedura di PaintWindow e si attiva/disattiva il glassframe. –