1、在FormCreate中计算窗体的不规则区域
procedure TForm1.FormCreate(Sender: TObject);
var
ThreadRgn, TmpRgn: HRgn;
X, Y,Height, Width: Integer;
begin
BitMapb := TBitMap.Create;
BitMapb.LoadFromFile(ExtractFileDir(Application.ExeName) + '\Pic\5.bmp');
//设置窗体的大小
Self.Height := BitMapb.Height;
self.Width := BitMapb.Width;
Height := BitMapb.Height;
Width := BitMapb.Width;
//创建矩形区域
ThreadRgn := CreateRectRgn(0, 0, Width, Height);
for Y := 0 to Height do
for X := 0 to Width do
begin
//R := GetRValue(BitMapb.Canvas.Pixels[X, Y]); R为整型
if BitMapb.Canvas.Pixels[X, Y] = rgb(0,0,255) then
begin
TmpRgn := CreateRectRgn(x, y, x + 1, y + 1);
//区域融合,取ThreadRgn与TmpRgn连个区域OR之外的部分赋给ThreadRgn
CombineRgn(ThreadRgn, ThreadRgn, TmpRgn, RGN_XOR);
DeleteObject(TmpRgn);
end;
end;
SetWindowRgn(handle, ThreadRgn, False);//设置窗体区域的有效区域
end;
2、//重新绘制窗体
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Draw(0, 0, BitMapb); // 绘图
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
BitMapb.Free;
end;
3、//设置窗体的移动
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button=Mbleft then
begin
ReleaseCapture;
Perform(WM_NCLBUTTONDOWN,HTCAPTION,0);//消息处理
end;
end;
4,其余的可以参考:
procedure TTextForm.FormCreate(Sender: TObject);
var
Rgn :HRGN;
begin
TextForm.Color := ClBlue;
//启动一个路径分支,之后执行的GDI绘图命令会自动成为路径的一部分
BeginPath(Canvas.Handle);
SetBKMode(Canvas.Handle,TRANSPARENT);
canvas.Font.Color := ClRed; //无效,因为是透明的。
Canvas.Font.Name := '宋体';
Canvas.Font.Size := 80;
Canvas.TextOut(0,0,'字体窗体');
//结束定义路径。所有绘制操作将在指定的设备场景的路径中生效
EndPath(Canvas.Handle);
//将当前选定的路径转换到指定的区域中
Rgn := PathToRegion(Canvas.Handle);
SetWindowRgn(Handle,Rgn,true);
end;