前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >duilib自绘

duilib自绘

作者头像
大菊观
发布2018-05-24 13:33:12
1.3K0
发布2018-05-24 13:33:12
举报

有时候我们在使用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显然不同的是不需要派生新控件啦。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年01月31日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档