2012-01-11 18 views
5

Delphi XE2フレーム&という形があります。Delphi:GDI +およびグラデーションフレーム/矩形の問題

フォームとフレームは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; 

私は不透明な黒色に透明性から、通常の勾配フレームに四角形を描画するために助けてください。

答えて

3

以下のようなコードを変更すると、透明から黒色の不透明に細分化された右揃えの線が描画されます。全領域に対してInvalidateRectを用い

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

更新は、フレームの総再描画を強制します。 そうしないと、再描画が奇妙な方法でクリップされることがあります。 これにより、色の変更効果が解決されます。

しかし、GlassFrameの欠陥は、下の2つの画像で示されています。 TFrameの外側フレームは、上側と上側で正しく表示されません。 GlassFrameが(左)が有効になっているときのTFrameの機能不全を表示

enter image description here

GlassFrame enabled GlassFrame disabled

。 右側の画像は完全な黒いフレームを示しています(この画像では、右側が圧縮されて切り取られていますが、GlassFrameは無効です)。

アップデート2:

SheetOfGlassを有効にし、すべてがOKと思われます。

enter image description here

アップデート3:

GlassFrameトッププロパティが40に設定され、フレームの周りに不思議なボーダー効果を引き起こしました。 0に設定すると、この問題が修正されました。

+0

ありがとうございます!しかし、それは私が望むものではありません。上記のプロジェクトをダウンロードしてフォームのサイズを変更すると、四角形の色が変わるのがわかります。 – maxfax

+0

私の更新を見てください。ガラスフレームのスイッチをオン/オフすると、変な効果が得られます。フレームエッジはガラスフレームがオンの状態で両面の高さ35から始まります。どこかのシステムにバグがあるようだ。 –

+0

PaintWindowプロシージャをコメントアウトしてGlassframeをオン/オフに切り替えると、ガラスフレームの機能不全がより目に見えます。 –

関連する問題