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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章