如何像有的软件那样制作一个不规则窗体?(100分)

  • 主题发起人 主题发起人 xjlaokai2000
  • 开始时间 开始时间
X

xjlaokai2000

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一篇文章中看到这样一段代码:
procedure TForm1.FormCreate(Sender: TObject); 
 var 
 hd:HRGN;
  begin 
 hd:=CreateRoundRectRgn(0,0,Width,height,50,50); 
 SetWindowRgn(handle,hd,true); 
 end;
为什么我编译时就出现illegal character in input file:''
提示错误在 hd:HRGN;处
 
N多这样的控件!去搜索引擎找找!
 
直接网页中拷贝的吧。:),你肯定是把网页中的非打印字符也粘帖进去了。
删掉就行了。或者你在拷贝一次:
procedure TForm1.FormCreate(Sender: TObject);
var
; hd:HRGN;
begin
; hd:=CreateRoundRectRgn(0,0,Width,height,50,50);
; SetWindowRgn(handle,hd,true);
end;

我帮你删过了。
 
找控件呀
http://www.csdn.net/dev/Delphi/vcl/form/index.htm
 
基本上不规则窗体,比如说你想做一个跟位图一样的窗体,
它的原理就是,通过对位图的每一个像素进行分析,
如果它的颜色不是位图里面你想去掉的背景色,
那么我们就把它通过CombineRgn加到窗体的Rgn.
然后SetWindowRgn(handle,hd,true);
我估计那些桌面精灵就是这么做的(个人观点).
我刚刚做了一个做一个透明位图窗体的例子.
如果你要留一个Email我发给你.
 
bubble你好,
请给我发一份。谢谢。
 
是给你发一份,你没有信箱啊???
我怎么发.faint.
用控件也可以,不过还是自己写多学一些基本知识.
 
给你个透明窗体的例子,看看就知道了
主要是用CreateRectRgn和CombineRgn

procedure TForm1.DoInvisible;//将窗体透明化
var
; AControl : TControl;
; A, Margin, X, Y, CtlX, CtlY : Integer;
begin
; //边界宽度,即不透明边界的宽度
; 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 );

; //将窗体中所有非客户区域(除窗体边界)的部分透明
; //RGN_DIFF表示在第二个FullRgn中,去掉ClientRgn大小的部分将结果显示在第一个FullRgn里
; CombineRgn( FullRgn, FullRgn, ClientRgn, RGN_DIFF );

; //对窗体上的各个控件作处理,RGN_OR
; 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);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
; //释放创建的资源
; DeleteObject(ClientRgn);
; DeleteObject(FullRgn);
; DeleteObject(CtlRgn);
end;

procedure TForm1.DoVisible;
begin
; //恢复原来的显示
; FullRgn := CreateRectRgn(0, 0, Width, Height);
; CombineRgn(FullRgn, FullRgn, FullRgn, RGN_COPY);
; SetWindowRgn(Handle, FullRgn, TRUE);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
; DoInvisible
end;
 
不规则窗体,再举个例子:
procedure TForm1.Button1Click(Sender: TObject);
var
r1,r2,r3,r4,r5: hrgn;
begin
; r1 := createellipticrgn(0,0,round(clientwidth / 2),clientheight);
; r2 := createellipticrgn(round(clientwidth / 2),0,clientwidth,clientheight);
; r3 := createellipticrgn(round(clientwidth / 4 ),round(clientheight / 4 *3),round(clientwidth / 4 *3),clientheight);
; r4 := createrectrgn(0,0,0,0);
; r5 := createrectrgn(0,0,0,0);
; combinergn(r4,r2,r1,rgn_or);
; combinergn(r5,r4,r3,rgn_or);

; setwindowrgn(handle,r5,true);
; deleteobject(r1);
; deleteobject(r2);
; deleteobject(r3);
; deleteobject(r4);
; deleteobject(r5);
end;
 
你照着我的一个例子来试试,窗体宽260,高270.实现类似于橢圓的窗口,还有边线.
procedure TFrmAbout.FormCreate(Sender: TObject);
var hr:THandle;
begin
; hr:=CreateRoundRectRgn(0,21,Width,Height,80,80); ;//定義橢圓窗口
; SetWindowRgn(handle,hr,true);
end;

procedure TFrmAbout.DrawFormLine;
var
; dc : hDc;
; Pen : hPen;
; OldPen : hPen;
; OldBrush : hBrush;
begin
; dc := GetWindowDC(Handle);
; Pen := CreatePen(PS_SOLID, 8, RGB(0, 0, 255));
; OldPen := SelectObject(dc, Pen);
; OldBrush := SelectObject(dc, GetStockObject(NULL_BRUSH));
; Self.Refresh;
; RoundRect(dc,0,21,Width,Height,80,80); ;//©w¸q¾ò¶êµ¡¤f
; SelectObject(dc, OldBrush);
; SelectObject(dc, OldPen);
; DeleteObject(Pen);
; ReleaseDC(Handle, Canvas.Handle);
end;

procedure WMNCPaint(var Msg : TWMNCPaint); message WM_NCPAINT;
procedure TFrmAbout.WMNCPaint(var Msg: TWMNCPaint);
begin
; DrawFormLine;
end;
 
界面花俏有什么用?!
 
http://2ccc.com/documentview.php?documentid=6
 
to datoncg:界面花俏有什么用?!
给自己看舒服,给别人看,为了包装。卖东西包装是最重要的!![^]
 
coolform

可以自己看看源代码
 
把 hd:HRGN; 改为: hd:HWND; 怀: hd: Thandle;
 在hd:=CreateRoundRectRgn(0,0,Width,height,50,50);
前加: hd := GetDC(0); 
试试;
 
我用不断变化的不规则窗体做了一个桌面宠物程序。
欢迎光临 http://guanbh.top263.net看看程序效果。
 
http://2ccc.com/documentview.php?documentid=6
 
多人接受答案了。
 
后退
顶部