透明皮肤控件设计系列(五):透明控件
11 Comments 2013-08-11 admin
现在我们有了透明窗口,那么所有控件也应该是透明的。
控件透明,原理其实很简单,就是把父控件的图像复制到自己上面即可。例如,常用的方法是给父控件发送背景重画的消息,同时把自己的DC传递过去:
SendMessage(Parent.Handle, WM_ERASEBKGND, DC, 0);
TCtrl(Parent).PaintControls(DC, nil);
这种方法对于非自己设计的皮肤窗口也有效,但缺点是会因为父窗口重画造成闪烁。
现在因为透明窗口也是我们自己制作的,所以方法就简单多了:根据自己的坐标位置,直接从图片拷贝即可。以CheckBox为例,代码段如下:
Buffer := TBitMap.Create;
Buffer.Width := Width;
Buffer.Height := Height;
//复制底部图片
Buffer.Canvas.Brush.Color:=Form1.m_BackColor;
Buffer.Canvas.FillRect(ClientRect);
Buffer.Canvas.CopyRect(ClientRect,Form1.m_BackBMP.Canvas,Rect(Left+xFramWidth,Top+xTitleHeight,Left+xFramWidth+Width,Top+xTitleHeight+Height));
效果如下:
详细代码点这里下载。
Pngimage for Delphi7点这里下载。
分类:界面设计
11 Comments 发表评论
受益良多啊!期待楼主继续更新。非常感谢!!
有空的时候就写写吧。谢谢支持。
支持楼主大侠,好厉害啊,呵呵!!!
楼主大侠能不能讲讲窗体边缘阴影的实现?
谢谢啊
有几种方法。例如:显示的窗体部分比实际窗体小一点,剩余部分做阴影;又例如做一个阴影窗口放在原窗口后面。这些代码网上有很多,感兴趣的话可以搜索看看。
顶!支持! 一定要写下去呀
有个问题一直搞不太明白,下载的源程序:当xFramWidth这个值设定为1时,只显示了左边框,右边框和下边框不显示不知道是什么原因
你再换成颜色的试试看效果。
program Project1;
uses
Forms,
Controls,
Unit1 in ‘Unit1.pas’ {Form1},
u_BmpUnit in ‘u_BmpUnit.pas’;
{$R *.res}
begin
Application.Initialize;
Form1 := TForm1.Create(Application);
if Form1.ShowModal = mrok then
begin
Application.Run;
end
else Application.Terminate;
end.
博主的这个文章这样创建的窗口在关闭FORM1时会报错。不知道是何原因。因为一般登陆窗口都是这样子创建的。
这些文章都是基础教程,真正写成控件的时候需要处理的。
如果你非要直接使用,可以加一个变量,例如: m_bAppExit:Boolean;
窗口释放的时候:
procedure TForm1.FormDestroy(Sender: TObject);
begin
m_bAppExit:=True;
画的时候:
procedure TForm1.DrawTitle;
begin
if m_bAppExit then Exit;
出错是因为窗口摧毁了,而这个过程还没有结束(比如说点关闭按钮退出导致Modal返回)
DrawThemeParentBackground这个函数也是拷贝主窗体背景做为控件背景的,在这里能不能使用这个函数呢?
发表评论
XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
TrackBack URL | RSS feed for comments on this post.