delphi……我想把自己的窗体制作成一个一不规则图形的界面!!怎么制作!!谢谢……

 我来答
百度网友25868f29d
2012-02-17
知道答主
回答量:15
采纳率:0%
帮助的人:24.2万
展开全部
可以使用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结构体创建一个矩形区域
mit1208
2012-02-16 · TA获得超过2347个赞
知道大有可为答主
回答量:2743
采纳率:0%
帮助的人:1850万
展开全部
三角形窗体代码,可以自己修改!
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.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
AI影像达人
2012-02-29 · TA获得超过377个赞
知道小有建树答主
回答量:849
采纳率:50%
帮助的人:235万
展开全部
自己找
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式