2012-02-13 27 views
11

Tôi đã cố gắng thực hiện với SetWindowRgn và tôi không thể.Biểu mẫu được làm tròn với hệ thống Shadow

Có thể làm điều đó (2 góc trên cùng được làm tròn, cửa sổ có bóng) giống như trên hình này?

enter image description here

+2

Phiên bản bạn đang sử dụng, nếu kiểu XE2 VCL có – VibeeshanRC

+0

Hệ điều hành của bạn là gì? – menjaraz

+0

Đây có phải là hành vi mặc định trên Windows 7 không? –

Trả lời

16

Đây là một mẫu mã như thế nào để thiết lập các khu vực cửa sổ với bóng:
(Ghi chú: Mẫu BorderStyle giả định là bsNone, không tái khá lớn)

type 
TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
private 
    procedure CreateFlatRoundRgn; 
protected 
    procedure CreateParams(var Params: TCreateParams); override; 
public 
end; 

var 
    Form1: TForm1; 

implementation 

{$R *.DFM} 

procedure ExcludeRectRgn(var Rgn: HRGN; LeftRect, TopRect, RightRect, BottomRect: Integer); 
var 
    RgnEx: HRGN; 
begin 
    RgnEx := CreateRectRgn(LeftRect, TopRect, RightRect, BottomRect); 
    CombineRgn(Rgn, Rgn, RgnEx, RGN_OR); 
    DeleteObject(RgnEx); 
end; 

procedure TForm1.CreateFlatRoundRgn; 
const 
    CORNER_SIZE = 6; 
var 
    Rgn: HRGN; 
begin 
    with BoundsRect do 
    begin 
    Rgn := CreateRoundRectRgn(0, 0, Right - Left + 1, Bottom - Top + 1, CORNER_SIZE, CORNER_SIZE); 
    // exclude left-bottom corner 
    ExcludeRectRgn(Rgn, 0, Bottom - Top - CORNER_SIZE div 2, CORNER_SIZE div 2, Bottom - Top + 1); 
    // exclude right-bottom corner 
    ExcludeRectRgn(Rgn, Right - Left - CORNER_SIZE div 2, Bottom - Top - CORNER_SIZE div 2, Right - Left , Bottom - Top); 
    end; 
    // the operating system owns the region, delete the Rgn only SetWindowRgn fails 
    if SetWindowRgn(Handle, Rgn, True) = 0 then 
    DeleteObject(Rgn); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    BorderStyle := bsNone; 
    CreateFlatRoundRgn; 
end; 

procedure TForm1.CreateParams(var Params: TCreateParams); 
const 
    CS_DROPSHADOW = $00020000; 
begin 
    inherited CreateParams(Params); 
    with Params do 
    begin 
    Style := WS_POPUP; 
    WindowClass.Style := WindowClass.Style or CS_DROPSHADOW; 
    end; 
end; 

Một cách vẽ bóng tùy chỉnh sẽ là đặt Window WS_EX_LAYERED và sử dụng UpdateLayeredWindow

Đây là very good example o f làm thế nào nó được thực hiện (nguồn là trong C + + nhưng rất dễ hiểu)

Đối với hình dạng phức tạp hơn, bạn có thể sử dụng hình ảnh PNG trên biểu mẫu và Alpha Blend.


EDIT:

Thay đổi kích thước một cửa sổ WS_POPUP là một thế giới của đau ... Bạn có một vài lựa chọn:

LƯU Ý mà bạn cần phải tạo lại khu vực cửa sổ khi bạn chỉnh lại kích thước (ví dụ OnResize sự kiện).

+0

kobik, cảm ơn !!! Chúng ta có thể làm cho một hình thức resizeble? – maxfax

+0

@maxfax, Xem chỉnh sửa. – kobik

Các vấn đề liên quan