duilib自绘

有时候我们在使用duilib的同时,可能想自己在窗体上绘制一些图形、线条等等,但是发现绘制不上去。emmm,不用烦恼,其实是绘制上去然后又被duilib自身的绘制机制给擦掉了应该。

那么正确的绘制姿势呢?

方法1:从CControlUI派生一个子类,然后直接重写DoPaint接口,在里面绘制即可。这样有1个限制,duilib默认是后添加的控件Z序高,而实际绘制全部控件的时候,Z序高的控件在上层。因此如果这个控件的Z序比较低,是有可能被其他控件盖住的,这个要看具体的布局了。

方法2:从CControlUI派生一个子类,然后直接重写DoPostPaint接口。然后调用PaintManager的AddPostPaint接口将这个控件指针加入的m_aPostPaintControls数组即可。此时在全部控件绘制完毕后,会触发DoPostPaint接口的调用,在里面绘制即可。这种方法与1的不同之处在于,仍然保留了原先控件的绘制。并且是在所有控件绘制之后绘制的,因此它的绘制好像是在最上层的,不会由于控件的Z序等导致绘制被其他控件覆盖。redrain大佬有一篇控件拖拽的文章有利用,感兴趣的可以看看。

方法3:类似方法2,不过不用派生了,可以直接将根控件(通过PaintManager的GetRoot()接口可以获得,或者自己留存)通过PaintManager的AddPostPaint加入到m_aPostPaintControls里面。然后定义一个bool OnPostPaint(void* param){};然后给根控件通过pRoot->OnPostPaint += MakeDelegate(this,&CXXXX::OnPostPaint);这样,在全部控件绘制完毕后,会触发OnPostPaint的调用,在这里绘制即可。(我自己没亲测,但是楼主感觉这样没毛病,有需要的可以自己测试下)这样与方法2显然不同的是不需要派生新控件啦。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • duilib中获取的控件的位置或者大小不对的可能的原因

    大菊观
  • duilib创建自定义控件

    大菊观
  • duilib中将xml封装为控件简单示例(简单自定义控件,封装几个基本控件合为1个自定义控件)

    大菊观
  • Android Hierarchy Viewer

    Android的SDK工具包中,有很多十分有用的工具,可以帮助程序员开发和测试Android应用程序,大大提高其工作效率。其中的一款叫Hierachy View...

    阳光岛主
  • Qt编写自定义控件61-通用移动

    通用移动类,目标就是为了实现放入任意的控件以后,支持鼠标拖动,在容器中或者父类中拖动,这个应用场景非常多,比如在地图上放置的设备,需要用户自行按下拖动到指定的合...

    feiyangqingyun
  • IE6查看ActiveX控件是否已经安装以及版本号

    最近经常要处理控件问题,ie6+可以直接Internet选项,程序中看到已经安装的控件以及版本号等信息,万恶的ie6确看到不到控件的具体版本信息。

    西门呀在吹雪
  • C# C/S控件库HZHControls使用指南

    HZHControls是一个基于.Net Framework4.0,扁平化的、漂亮的、开源的C/S控件库,这是官网的介绍,也就是作者专门开发的一套可以在C/S客...

    zls365
  • Qt编写控件属性设计器8-网络采集

    上一篇文章已经打通了数据源之一的串口采集,这次要说的是网络采集,网络通信目前用的最多的是三种,TCP/UDP/HTTP,其中tcp通信又包括了客户端服务端两种,...

    feiyangqingyun
  • Blend基础-布局控件

    布局 什么是布局? Panels控件(其实就是容器控件) 对内部的子控件提供了自动布局功能 可以在容器控件内继续添加容器控件(一个复杂的界面往往是多种容器控件...

    用户1172164
  • 动态加载控件

    参考文章:http://blog.csdn.net/yicko/archive/2005/04/16/349740.aspx 1、加载的是普通的控件,不是用户控...

    用户1075292

扫码关注云+社区

领取腾讯云代金券