形式 – 圆形与系统阴影
发布时间:2020-12-15 04:28:51 所属栏目:大数据 来源:网络整理
导读:我试图用SetWindowRgn,我不能. 可以这样做(顶部的两个角落是圆的,窗口有一个阴影)像这张照片? 解决方法 以下是如何使用阴影设置窗口区域的代码示例: (注意:表单BorderStyle假定为bsnone,不可重新定义) typeTForm1 = class(TForm) procedure FormCreate(Se
我试图用SetWindowRgn,我不能.
可以这样做(顶部的两个角落是圆的,窗口有一个阴影)像这张照片? 解决方法
以下是如何使用阴影设置窗口区域的代码示例:
(注意:表单BorderStyle假定为bsnone,不可重新定义) 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,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,Right - Left + 1,Bottom - Top + 1,CORNER_SIZE,CORNER_SIZE); // exclude left-bottom corner ExcludeRectRgn(Rgn,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,Right - Left,Bottom - Top); end; // the operating system owns the region,delete the Rgn only SetWindowRgn fails if SetWindowRgn(Handle,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; 绘制自定义阴影的另一种方法是设置Window WS_EX_LAYERED并使用 这是一个very good example的完成(来源是C,但很容易理解) 对于更复杂的形状,您可以在表单和Alpha Blend上使用PNG图像. 编辑: 调整WS_POPUP窗口大小是一个痛苦的世界… >写一个WM_NCHITEST handler 请注意,当您重新调整窗口区域(例如OnResize事件)时,需要重新创建窗口区域. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |