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?
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?
Đâ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:
WM_Syscommand
$F008
để thay đổi kích thước (ở trên liên kết) hoặc $F012
đến move the Window.WS_EX_STATICEDGE
and WS_SIZEBOX
kiểu.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).
Phiên bản bạn đang sử dụng, nếu kiểu XE2 VCL có – VibeeshanRC
Hệ điều hành của bạn là gì? – menjaraz
Đây có phải là hành vi mặc định trên Windows 7 không? –