2012-01-11 12 views
5

Delphi XE2. Có một hình thức & một khung.Delphi: sự cố với GDI + và khung/hình chữ nhật gradient

Biểu mẫu và khung là doublebuffered. GlassFrame được bật.

Tôi vẽ nền của khung và cố vẽ hình chữ nhật được căn phải nhưng có lỗi. Đặc biệt là tôi có lỗi trong khi thay đổi kích thước.

Hình chữ nhật không muốn được vẽ bình thường từ trong suốt đến màu đen đục. 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; 

Xin hãy giúp tôi để vẽ một hình chữ nhật trên khung Gradient thường từ minh bạch để các màu đen mờ đục.

Trả lời

3

Thay đổi mã như được hiển thị bên dưới sẽ vẽ một đường thẳng được căn chỉnh thẳng từ trong suốt sang màu đen mờ.

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

Cập nhật, sử dụng InvalidateRect cho toàn bộ khu vực buộc tổng vẽ lại của khung. Nếu không, việc vẽ lại có thể bị cắt bớt theo những cách kỳ lạ. Điều này sẽ giải quyết hiệu ứng thay đổi màu sắc của bạn.

Nhưng lỗi GlassFrame được minh họa bằng hai hình ảnh cuối cùng bên dưới. Khung bên ngoài của TFrame không hiển thị chính xác ở phía trên và phía trên.

enter image description here

GlassFrame enabled GlassFrame disabled

Hiển thị rối loạn chức năng của TFrame khi GlassFrame được kích hoạt (bên trái). Ảnh bên phải hiển thị khung màu đen hoàn chỉnh (mặc dù trong ảnh này phía bên phải đã được cắt thành nén) với GlassFrame bị tắt.

Cập nhật 2:

Enable SheetOfGlass và tất cả mọi thứ có vẻ ok.

enter image description here

Cập nhật 3:

Các GlassFrame bất động sản hàng đầu được thành lập đến 40, và gây ra hiệu ứng biên giới kỳ lạ xung quanh khung. Đặt nó thành 0 đã khắc phục sự cố này.

+0

Cảm ơn! Nhưng đó không phải là điều tôi muốn. Vui lòng tải xuống dự án ở trên và thay đổi kích thước biểu mẫu, bạn sẽ thấy màu sắc của hình chữ nhật thay đổi. – maxfax

+0

Xem cập nhật của tôi. Vẫn còn một hiệu ứng lạ khi bật/tắt khung kính. Cạnh khung bắt đầu từ độ cao 35 trên cả hai mặt với khung kính trên. Dường như là một lỗi trong hệ thống ở đâu đó. –

+0

Các rối loạn chức năng kính hiển vi có thể nhìn thấy rõ hơn nếu bạn bình luận đi các thủ tục PaintWindow, và chuyển đổi khung kính bật/tắt. –