轉載請說明出處,謝謝~~: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