做一个窗体,中间有一个椭圆型透明部分,如何做,急!(50分)

  • 主题发起人 主题发起人 yxg20803
  • 开始时间 开始时间
Y

yxg20803

Unregistered / Unconfirmed
GUEST, unregistred user!
以下代码可以根据一个BMP图片绘制一个任意形状的窗体,不仅是椭圆形。
BMP图片可以随便用PhotoShop或者画笔画一个。
CreateRegion函数稍做修改,就可以不要BMP图片。

---------------------------------------------------------------------------
function Tform1.CreateRegion(wMask:TBitmap;wColor:TColor;hControl:THandle): HRGN;
var
dc, dc_c: HDC;
rgn: HRGN;
x, y: integer;
coord: TPoint;
line: boolean;
color: TColor;
begin
dc := GetWindowDC(hControl); //取得窗口的DC
dc_c := CreateCompatibleDC(dc);
SelectObject(dc_c, wMask.Handle);
BeginPath(dc);//开始绘制
for x:=0 to wMask.Width-1 do //设定窗体的大小和形状
begin
line := false;
for y:=0 to wMask.Height-1 do
begin
color := GetPixel(dc_c, x, y);
if not (color = wColor) then
begin
if not line then
begin
line := true;
coord.x := x;
coord.y := y;
end;
end;
if (color = wColor) or (y=wMask.Height-1) then
begin
if line then
begin
line := false;
MoveToEx(dc, coord.x, coord.y, nil);
LineTo(dc, coord.x, y);
LineTo(dc, coord.x + 1, y);
LineTo(dc, coord.x + 1, coord.y);
CloseFigure(dc);
end;
end;
end;
end;
EndPath(dc);//结束绘制
rgn := PathToRegion(dc);
ReleaseDC(hControl, dc); //释放DC
Result := rgn;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
w1:TBitmap;
w2:TColor;
rgn: HRGN;
begin
w1:=TBitmap.Create;
w1.Assign(image1.Picture.Bitmap);//取得图片对象
w2:=w1.Canvas.Pixels[0,0];
rgn := CreateRegion(w1,w2,Handle);//生成窗体区域
if rgn<>0 then
begin
SetWindowRgn(Handle, rgn, true);//设定窗体形状
end;
w1.Free;
end;
 
怎么修改
对图象编程不懂
 
那就直接用Windows附件的画图画一个椭圆,存成bmp吧^^
 
干脆重写了一遍,这回应该符合您的要求了.
------------------------------------------
procedure TForm1.btn1Click(Sender: TObject);
var
rectForm: TRect;
rgnForm: HRGN;
rgnTuoYuan: HRGN;
rgnFinal: HRGN;
begin
{作窗体初始矩形区域}
rectForm := ClientRect;
rgnForm := CreateRectRgnIndirect(rectForm);

{作椭圆区域}
rgnTuoYuan := CreateEllipticRgn(
rectForm.left + 10,
rectForm.top + 10,
rectForm.right - 10,
rectForm.bottom - 10);

{打孔,注意XOR}
CombineRgn(rgnForm, rgnForm, rgnTuoYuan, RGN_XOR);

{把区域套到窗体上}
SetWindowRgn(Form1.Handle, rgnForm, True);
end;
 
多人接受答案了。
 
后退
顶部