delphi……我想把自己的窗体制作成一个一不规则图形的界面!!怎么制作!!谢谢……
3个回答
展开全部
可以使用SetWindowRgn 函数。
SetWindowRgn 函数设定某一窗体的特定区域(窗体区域)。 这一区域决定了该窗体中系统可以画图的范围。 系统不会显示该窗体在这一区域以外的任何部分。
配合CreateRectRgn函数(创建一个矩形区域)和CombineRgn函数(组合两个矩形区域)来实现不规则的窗体界面。
SetWindowRgn 函数定义
function SetWindowRgn(hWnd: HWND; hRgn: HRGN; bRedraw: BOOL): Integer;
参数
hWnd 将被设定窗体区域的窗体的柄。
hRgn 窗体区域的句柄。 函数将窗体的区域设定为这一个区域。
如果 hRgn 是无效的,函数将窗体区域设定为零。
bRedraw 描述述系统是否在设定窗体区域之后重画窗体。
返回值
如果函数调用成功,回返值是非零。
如果函数调用失败,回返值是零。
CreateRectRgn 函数定义
function CreateRectRgn(p1, p2, p3, p4: Integer): HRGN;
[说明] 创建一个由点X1,Y1和X2,Y2描述的矩形区域
参数
P1,P1 矩形左上角X,Y坐标
P3,P4 矩形右下角X,Y坐标
返回值
执行成功为区域句柄,失败则为零。
不用时一定要用DeleteObject函数删除该区域。
CombineRgn 函数定义
function CombineRgn(p1, p2, p3: HRGN; p4: Integer): Integer;
参数
p1 包含组合结果的区域句柄
p2 源区域1
p3 源区域2
p4 组合两区域的方法。可设为下述常数
RGN_AND p1被设置为两个源区域的交集(集合中的交集)
RGN_COPY p1被设置为p2的拷贝
RGN_DIFF p1被设置为p2与p3相减后的区域(集合中的差集)
RGN_OR p1被设置为两个区域的并集(集合中的并集)
RGN_XOR p1被设置为两个区域的异或操作后的区域(集合中的异或操作)
返回值为下列常数之一:
COMPLEXREGION:区域有互相交叠的边界
SIMPLEREGION:区域边界没有互相交叠
NULLREGION:区域为空
ERRORAPI:不能创建组合区域
下边例子,可以让窗体只显示窗体中所有可视控件的区域。没有控件的区域将被去除。
var
AControl : TControl;
A, Margin, X, Y, CtlX, CtlY : Integer;
FullRgn,ClientRgn, CtlRgn:HRGN;
begin
//BorderStyle := bsNone; //使用这句,可以让窗体的标题栏与边框也不显示。
Margin := ( Width - ClientWidth ) div 2;
FullRgn := CreateRectRgn(0, 0, Width, Height);//窗体大小
X := Margin;
Y := Height - ClientHeight - Margin;
ClientRgn := CreateRectRgn( X, Y, X + ClientWidth, Y + ClientHeight );
CombineRgn( FullRgn, FullRgn, ClientRgn, RGN_DIFF );//取两个矩形的交集
for A := 0 to ControlCount - 1 do
begin
//循环本窗体所有控件 并得到控件的矩形区域,再组合在一起。
AControl := Controls[A];
if ( AControl is TWinControl ) or ( AControl is TGraphicControl )
then with AControl do begin
if Visible then begin
CtlX := X + Left;
CtlY := Y + Top;
CtlRgn := CreateRectRgn( CtlX, CtlY, CtlX + Width, CtlY + Height );
CombineRgn( FullRgn, FullRgn, CtlRgn, RGN_OR ); //取两个矩形的并集
end;
end;
end;
SetWindowRgn(Handle, FullRgn, TRUE);
DeleteObject(CtlRgn);
DeleteObject(ClientRgn);
//FullRgn 不用释放,因为SetWindowRgn后,FullRgn由系统维护。
end;
其他与创建区域的相关函数
CreateRectRgnIndirect 创建一个圆角矩形
CreateEllipticRgn 创建一个椭圆
CreateRoundRectRgn 根据TRect结构体创建一个矩形区域
SetWindowRgn 函数设定某一窗体的特定区域(窗体区域)。 这一区域决定了该窗体中系统可以画图的范围。 系统不会显示该窗体在这一区域以外的任何部分。
配合CreateRectRgn函数(创建一个矩形区域)和CombineRgn函数(组合两个矩形区域)来实现不规则的窗体界面。
SetWindowRgn 函数定义
function SetWindowRgn(hWnd: HWND; hRgn: HRGN; bRedraw: BOOL): Integer;
参数
hWnd 将被设定窗体区域的窗体的柄。
hRgn 窗体区域的句柄。 函数将窗体的区域设定为这一个区域。
如果 hRgn 是无效的,函数将窗体区域设定为零。
bRedraw 描述述系统是否在设定窗体区域之后重画窗体。
返回值
如果函数调用成功,回返值是非零。
如果函数调用失败,回返值是零。
CreateRectRgn 函数定义
function CreateRectRgn(p1, p2, p3, p4: Integer): HRGN;
[说明] 创建一个由点X1,Y1和X2,Y2描述的矩形区域
参数
P1,P1 矩形左上角X,Y坐标
P3,P4 矩形右下角X,Y坐标
返回值
执行成功为区域句柄,失败则为零。
不用时一定要用DeleteObject函数删除该区域。
CombineRgn 函数定义
function CombineRgn(p1, p2, p3: HRGN; p4: Integer): Integer;
参数
p1 包含组合结果的区域句柄
p2 源区域1
p3 源区域2
p4 组合两区域的方法。可设为下述常数
RGN_AND p1被设置为两个源区域的交集(集合中的交集)
RGN_COPY p1被设置为p2的拷贝
RGN_DIFF p1被设置为p2与p3相减后的区域(集合中的差集)
RGN_OR p1被设置为两个区域的并集(集合中的并集)
RGN_XOR p1被设置为两个区域的异或操作后的区域(集合中的异或操作)
返回值为下列常数之一:
COMPLEXREGION:区域有互相交叠的边界
SIMPLEREGION:区域边界没有互相交叠
NULLREGION:区域为空
ERRORAPI:不能创建组合区域
下边例子,可以让窗体只显示窗体中所有可视控件的区域。没有控件的区域将被去除。
var
AControl : TControl;
A, Margin, X, Y, CtlX, CtlY : Integer;
FullRgn,ClientRgn, CtlRgn:HRGN;
begin
//BorderStyle := bsNone; //使用这句,可以让窗体的标题栏与边框也不显示。
Margin := ( Width - ClientWidth ) div 2;
FullRgn := CreateRectRgn(0, 0, Width, Height);//窗体大小
X := Margin;
Y := Height - ClientHeight - Margin;
ClientRgn := CreateRectRgn( X, Y, X + ClientWidth, Y + ClientHeight );
CombineRgn( FullRgn, FullRgn, ClientRgn, RGN_DIFF );//取两个矩形的交集
for A := 0 to ControlCount - 1 do
begin
//循环本窗体所有控件 并得到控件的矩形区域,再组合在一起。
AControl := Controls[A];
if ( AControl is TWinControl ) or ( AControl is TGraphicControl )
then with AControl do begin
if Visible then begin
CtlX := X + Left;
CtlY := Y + Top;
CtlRgn := CreateRectRgn( CtlX, CtlY, CtlX + Width, CtlY + Height );
CombineRgn( FullRgn, FullRgn, CtlRgn, RGN_OR ); //取两个矩形的并集
end;
end;
end;
SetWindowRgn(Handle, FullRgn, TRUE);
DeleteObject(CtlRgn);
DeleteObject(ClientRgn);
//FullRgn 不用释放,因为SetWindowRgn后,FullRgn由系统维护。
end;
其他与创建区域的相关函数
CreateRectRgnIndirect 创建一个圆角矩形
CreateEllipticRgn 创建一个椭圆
CreateRoundRectRgn 根据TRect结构体创建一个矩形区域
展开全部
三角形窗体代码,可以自己修改!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
procedure SetTriangleWin(w: HWND );
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.SetTriangleWin( w: HWND );
var
rgn: HRGN;
points: array [ 0..2 ] of TPoint;
wrect: TRect;
begin
if (SetWindowRgn(w,0,false)=0 ) then
begin
ShowMessage( '不能设置窗口形状! ' );
exit;
end;
if not (GetWindowRect(w, wrect)) then
begin
ShowMessage( '无法得到窗口区域! ' );
exit;
end;
// 利用point数组建立新的窗体形状
points[ 0 ].x := 0;
points[ 0 ].y :=0;
points[ 1 ].x := ( wrect.right - wrect.left ) div 2;
points[ 1 ].y := wrect.bottom - wrect.top;
points[ 2 ].x := wrect.right - wrect.left;
points[ 2 ].y :=0;
// 创建该窗体
rgn := CreatePolygonRgn( points, 3, WINDING );
if ( rgn = 0 ) then
ShowMessage( '无法创建不规则窗体! ' )
else
begin
if (SetWindowRgn(w,rgn,true)=0) then
begin
ShowMessage( '无法创建不规则窗体! ' );
end;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SetWindowRgn( Handle, 0, false );
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
SetTriangleWin(Handle);
end;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
procedure SetTriangleWin(w: HWND );
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.SetTriangleWin( w: HWND );
var
rgn: HRGN;
points: array [ 0..2 ] of TPoint;
wrect: TRect;
begin
if (SetWindowRgn(w,0,false)=0 ) then
begin
ShowMessage( '不能设置窗口形状! ' );
exit;
end;
if not (GetWindowRect(w, wrect)) then
begin
ShowMessage( '无法得到窗口区域! ' );
exit;
end;
// 利用point数组建立新的窗体形状
points[ 0 ].x := 0;
points[ 0 ].y :=0;
points[ 1 ].x := ( wrect.right - wrect.left ) div 2;
points[ 1 ].y := wrect.bottom - wrect.top;
points[ 2 ].x := wrect.right - wrect.left;
points[ 2 ].y :=0;
// 创建该窗体
rgn := CreatePolygonRgn( points, 3, WINDING );
if ( rgn = 0 ) then
ShowMessage( '无法创建不规则窗体! ' )
else
begin
if (SetWindowRgn(w,rgn,true)=0) then
begin
ShowMessage( '无法创建不规则窗体! ' );
end;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SetWindowRgn( Handle, 0, false );
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
SetTriangleWin(Handle);
end;
end.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
自己找
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询