duilib 修复 容器控件 rightbordersize和bottombordersize属性显示错误的bug

Posted Redrain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了duilib 修复 容器控件 rightbordersize和bottombordersize属性显示错误的bug相关的知识,希望对你有一定的参考价值。

转载请说明出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/45560943


        DuiLib的容器控件可以用bordersize统一指定边框宽度,也可以用rightbordersize、bottombordersize等属性单独指定某一个边框的宽度。但是rightbordersize、bottombordersize属性显示时存在问题,当给他们设置边框为1的时候是无法显示的,只有设置为2时才会显示。


        跟踪源码后发现是在CContainerUI的DoPaint函数里,存在问题:


	void CContainerUI::DoPaint(HDC hDC, const RECT& rcPaint)
	
		RECT rcTemp =  0 ;
		if( !::IntersectRect(&rcTemp, &rcPaint, &m_rcItem) ) return;

		CRenderClip clip;
		CRenderClip::GenerateClip(hDC, rcTemp, clip);
		CControlUI::DoPaint(hDC, rcPaint);
		//省略其余代码
	


          代码里的rcTemp是CContainerUI绘制的范围,边框最终会由CControlUI::DoPaint这句代码来绘制,在这之前调用了剪裁区域的函数给DC设置了剪裁区域,而GenerateClip的内部调用了CreateRectRgnIndirect函数,CreateRectRgnIndirect函数设置剪裁区域时会忽略掉右侧和底部的一像素,所以导致了这个问题。


         修复代码很简单,提前给rcTemp的右侧和底部增加一像素:



	void CContainerUI::DoPaint(HDC hDC, const RECT& rcPaint)
	
		RECT rcTemp =  0 ;
		if( !::IntersectRect(&rcTemp, &rcPaint, &m_rcItem) ) return;

		++rcTemp.right;
		++rcTemp.bottom;
		CRenderClip clip;
		CRenderClip::GenerateClip(hDC, rcTemp, clip);
		CControlUI::DoPaint(hDC, rcPaint);
		//省略其余代码
	




总结:



      bug的修复代码已经提交到我自己的Duilib库。

      我的Duilib库代码下载地址:点击打开链接



  Redrain  2015.5.7

以上是关于duilib 修复 容器控件 rightbordersize和bottombordersize属性显示错误的bug的主要内容,如果未能解决你的问题,请参考以下文章

duilib 修复CTreeViewUI控件动态添加子控件时,对是否显示判断不足的bug

duilib 修复Text控件无法设置宽度的bug,增加自动加算宽度的属性

duilib List控件,横向滚动时列表项不移动或者移动错位的bug的修复

duilib 修复combo控件打开下拉菜单后不会自动定位到上次选择的位置上的bug

开机提示丢失duilib_d.dll如何修复

使用Duilib开发Windows软件——控件