如何创建不规则的button、image等控件?请指教(100分)

  • 主题发起人 主题发起人 Blue_Ice
  • 开始时间 开始时间
B

Blue_Ice

Unregistered / Unconfirmed
GUEST, unregistred user!
论坛中已经探讨过如何创建不规则的窗体了,现在我想问的是如何在窗体中创建不规
则的控件,诸如button、image等。对于窗体,可以用SetWindowRgn将定义好的不规则区域
赋给窗体,但对于Image这样的空间该如何做呢?或者有什么好的控件可以推荐?望各位大
侠不吝赐教
 
事实上针对控件的不规则设计和不规则的窗口原理是一样的。甚至更简单一些,建议你读一下
delphi中VCL目录里的源程序,了解一下控件的派生和继承关系。尝试从学做不规则的TLABEL开始。
它比较简单一些。
下面是bbkxjy写的一个控件,很简单清晰:
一个无用的椭圆 Panel:
unit Panel1;
interface
uses
Windows, Messages, Classes, Controls, ExtCtrls, Graphics;
type
TPanel1 = class(TPanel)
private
FHRgn: HRGN;
procedure WMSize(var Msg: TWMSize); message WM_SIZE;
protected
procedure CreateWnd; override;
procedure DestroyWnd; override;
procedure Paint; override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TPanel1]);
end;

{ TPanel1 }

procedure TPanel1.CreateWnd;
begin
inherited;
FHRgn := CreateEllipticRgn(ClientRect.Left, ClientRect.Top,
ClientRect.Right, ClientRect.Bottom);
SetWindowRgn(Handle, FHRgn, True);
end;

procedure TPanel1.DestroyWnd;
begin
inherited;
DeleteObject(FHRgn);
end;

procedure TPanel1.Paint;
var
SavedBrushStyle : TBrushStyle;
SavedBrushColor: TColor;
begin
SavedBrushStyle := Canvas.Brush.Style;
SavedBrushColor := Canvas.Brush.Color;
try
Canvas.Brush.Style := bsCross;
Canvas.Brush.Color := clGreen;
Canvas.Ellipse(ClientRect);
finally
Canvas.Brush.Style := SavedBrushStyle;
Canvas.Brush.Color := SavedBrushColor;
end;
end;

procedure TPanel1.WMSize(var Msg: TWMSize);
begin
inherited;
DeleteObject(FHRgn);
FHRgn := CreateEllipticRgn(ClientRect.Left, ClientRect.Top,
ClientRect.Right, ClientRect.Bottom);
SetWindowRgn(Handle, FHRgn, True);
end;
end.
 
可以把Control当Window
用SetWindowRgn之类的试试
 
多谢两位大虾,不过我还是没能解决问题,烦请再作指教。
xiaoyu_online提供的代码我已仔细读过,也照您所说,研读了VCL中的源代码,但还是
未得要领。bbkxjy的例子中,将Panel的形状设为椭圆形靠的是Canvas.Ellipse(ClientRect);
但Cavas也只定义了椭圆这类基本规则的形状,我想实现的效果是读入一幅bmp图,将图
中除透明色以外的部分作为TImage控件的形状,这样的不规则形状肯定更加多变和复杂。不难
根据读入的bmp图定义一个HRGN变量,但如何用这个变量来设定控件的形状呢?在创建不规则
窗体时只要调用Function SetWindowRgn就可以了,但对于TImage该怎么做呢?
MrMengyi建议将Control当Window来用,恕小弟愚笨,能不能说得具体点?
 
首先纠正个问题:将Panel的形状设为椭圆形不是靠的Canvas.Ellipse(ClientRect);
而是依靠的SetWindowRgn()函数。Canvas.Ellipse(ClientRect)只是填充Panel的Canvas。
你说的这种不规则最简单的方法就是将TIMGAE的“透明”属性设置为“真”
另外一种复杂的方法是使用:CreatePolygonRgn() Combinergn() 两个API函数进行设计。
具体的做法在电脑爱好者杂志(2000年21期)上有过这样一篇文章可以看看,叫:“如何在C++BUILDER中制作不
规则窗体”。虽然是BCB的源程序,但原理是一样的。
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部