在Windows中有时因为需要需创建一个异形窗体,我们可以利用Windows API函数SetWindowRgn()达到目的,在Window单元中它是这样声明的:
int SetWindowRgn(
HWND hWnd, // 要改变窗口的句柄
HRGN hRgn, // 窗口的显示区域
BOOL bRedraw //指明窗口在被改变显示区域之后是否需要重绘(一般设为True)
);
SetWindowRgn函数能够将窗口设定成任意形状。现在我们来建立一个小太阳的窗体。先创建一空白窗体,没置窗体的Color属性为clRed(红色),BorderStyle为:bsNone(去掉标题栏).在FormCreate事件中添加如下代码:
procedure TForm1.FormCreate(Sender: TObject);
var
hRgn:LongInt;
begin
//建立一圆形窗体,如要创建其他形状的窗体,只需调用不同的建立区域的函数
hRgn:=CreateRoundRectRgn(0,0,200,200,200,200);
SetWindowRgn(Handle,hRgn,True);
end;
现在我们再添加代码实现无标题窗体的移动,这里我们要拦截WM_NCHITTEST消息,这个消息是当光标移动、鼠标按下或释放时发生的。当在客户区按下Mouse时,我们欺骗Windows认为是标题栏被按下:
procedure TForm1.WMNcHitTest(var Msg: TWmNcHitTest);message WM_NCHITTEST;
begin
inherited;
//如果Mouse按下是窗体的客户区,将值赋为标题区
if (Msg.Result=HTClient) then
Msg.Result:=HTCaption;
end;
这样我们就实现了无标题的异常窗体的创建及移动问题,再加上若干码,我们就可创建一个实用的小时钟程序。
int SetWindowRgn(
HWND hWnd, // 要改变窗口的句柄
HRGN hRgn, // 窗口的显示区域
BOOL bRedraw //指明窗口在被改变显示区域之后是否需要重绘(一般设为True)
);
SetWindowRgn函数能够将窗口设定成任意形状。现在我们来建立一个小太阳的窗体。先创建一空白窗体,没置窗体的Color属性为clRed(红色),BorderStyle为:bsNone(去掉标题栏).在FormCreate事件中添加如下代码:
procedure TForm1.FormCreate(Sender: TObject);
var
hRgn:LongInt;
begin
//建立一圆形窗体,如要创建其他形状的窗体,只需调用不同的建立区域的函数
hRgn:=CreateRoundRectRgn(0,0,200,200,200,200);
SetWindowRgn(Handle,hRgn,True);
end;
现在我们再添加代码实现无标题窗体的移动,这里我们要拦截WM_NCHITTEST消息,这个消息是当光标移动、鼠标按下或释放时发生的。当在客户区按下Mouse时,我们欺骗Windows认为是标题栏被按下:
procedure TForm1.WMNcHitTest(var Msg: TWmNcHitTest);message WM_NCHITTEST;
begin
inherited;
//如果Mouse按下是窗体的客户区,将值赋为标题区
if (Msg.Result=HTClient) then
Msg.Result:=HTCaption;
end;
这样我们就实现了无标题的异常窗体的创建及移动问题,再加上若干码,我们就可创建一个实用的小时钟程序。