透明皮肤控件设计系列(五):透明控件

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));

效果如下:

nc15

详细代码点这里下载。

Pngimage for Delphi7点这里下载。

 

分类:界面设计

11 Comments 发表评论

  • Delphier说道:

    受益良多啊!期待楼主继续更新。非常感谢!!

  • 支持楼主大侠说道:

    支持楼主大侠,好厉害啊,呵呵!!!

  • 支持楼主大侠说道:

    楼主大侠能不能讲讲窗体边缘阴影的实现?

    谢谢啊

    • admin说道:

      有几种方法。例如:显示的窗体部分比实际窗体小一点,剩余部分做阴影;又例如做一个阴影窗口放在原窗口后面。这些代码网上有很多,感兴趣的话可以搜索看看。

  • Tag说道:

    顶!支持! 一定要写下去呀

  • delphier说道:

    有个问题一直搞不太明白,下载的源程序:当xFramWidth这个值设定为1时,只显示了左边框,右边框和下边框不显示不知道是什么原因

  • delphier说道:

    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时会报错。不知道是何原因。因为一般登陆窗口都是这样子创建的。

  • admin说道:

    这些文章都是基础教程,真正写成控件的时候需要处理的。
    如果你非要直接使用,可以加一个变量,例如: m_bAppExit:Boolean;

    窗口释放的时候:
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    m_bAppExit:=True;

    画的时候:
    procedure TForm1.DrawTitle;
    begin
    if m_bAppExit then Exit;

    出错是因为窗口摧毁了,而这个过程还没有结束(比如说点关闭按钮退出导致Modal返回)

  • Delphi说道:

    DrawThemeParentBackground这个函数也是拷贝主窗体背景做为控件背景的,在这里能不能使用这个函数呢?

发表评论

(required)

(required), (Hidden)

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.


日历

2023年 9月
 123
45678910
11121314151617
18192021222324
252627282930  

近期文章