请教各位大大,怎么实现如下效果的窗口? |
尚未結案
|
whoawho
一般會員 發表:13 回覆:18 積分:6 註冊:2004-03-16 發送簡訊給我 |
|
Vicen
高階會員 發表:13 回覆:145 積分:151 註冊:2005-03-14 發送簡訊給我 |
方法一:在WINDOWS 2000以上平台,可以利用WINDOWS自带的透明特性,不写代码获得透明不规则窗口。 不用代码实现窗体和图像的双重透明,方法如下: 首先新建一个工程,然后放一个Image控件,并调入一个图片,将Autosize属性设定为True,将窗口的AutoSize、OldCreateOrder、TransparentColor也设定为True,再将窗口的TransparentColorValue设定为图片的背景色。最后把窗口的BorderStyle设置成BsNone,就是异形的透明窗口了。 方法二:这个方法适用与所有WINDOWS平台,包括9X系统。
//必须引用ExtCtrls单元; { 在窗口上放上你做好的图片。 将该函数放到 FormResize FormCreate 中即可。 } procedure SetformTransparent; var I: Integer; FullRgn, ClientRgn, ControlRgn: THandle; Margin, MarginX, MarginY, X, Y: Integer; W,H,S :Integer; bX,bY :Integer; c :TColor; begin Margin := (Width - ClientWidth) div 2; FullRgn := CreateRectRgn(0, 0, Width, Height); MarginX := Margin; MarginY := Height - ClientHeight - Margin; ClientRgn := CreateRectRgn(MarginX, MarginY, MarginX ClientWidth, MarginY ClientHeight); CombineRgn(FullRgn, FullRgn, ClientRgn, RGN_DIFF); DeleteObject(ClientRgn); for I:=0 to ControlCount-1 do begin X := MarginX Controls[I].Left; Y := MarginY Controls[I].Top; W:=Controls[I].Width; H:=Controls[I].Height; if controls[i] is timage then begin with controls[i] as tImage do begin c:=Picture.Bitmap.Canvas.Pixels[0,0]; for bX:=0 to Picture.Bitmap.Width-1 do begin for bY:=0 to Picture.Bitmap.Height-1 do begin if Picture.Bitmap.Canvas.Pixels[bX,bY]<>c then begin ControlRgn := CreateRectRgn(X bX, Y bY, X bX 1, Y bY 1); CombineRgn(FullRgn, FullRgn, ControlRgn, RGN_OR); DeleteObject(ControlRgn); end; end; end; end; end else if controls[i] is tShape then begin if W < H then S := W else S := H; if (Controls[i] as tshape).Shape in [stSquare, stRoundSquare, stCircle] then begin Inc(X, (W - S) div 2); Inc(Y, (H - S) div 2); W := S; H := S; end; Inc(W); Inc(H); Inc(S); case (controls[i] as tshape).Shape of stRectangle, stSquare: ControlRgn := CreateRectRgn(X, Y, X W, Y H); stRoundRect, stRoundSquare: ControlRgn := CreateRoundRectRgn(X, Y, X W, Y H, S div 4, S div 4); stCircle, stEllipse: ControlRgn:=CreateEllipticRgn(X, Y, X W, Y H); else ControlRgn := CreateRectRgn(X, Y, X W, Y H); end; CombineRgn(FullRgn, FullRgn, ControlRgn, RGN_OR); DeleteObject(ControlRgn); end else begin ControlRgn := CreateRectRgn(X, Y, X W, Y H); CombineRgn(FullRgn, FullRgn, ControlRgn, RGN_OR); DeleteObject(ControlRgn); end; end; SetWindowRgn(Handle, FullRgn, True); DeleteObject(FullRgn); end;还有就是用控件了,这种控件太多了,去网上搜索一下吧。 發表人 - Vicen 於 2005/04/12 12:05:21 |
whoawho
一般會員 發表:13 回覆:18 積分:6 註冊:2004-03-16 發送簡訊給我 |
|
whoawho
一般會員 發表:13 回覆:18 積分:6 註冊:2004-03-16 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |