DuiLib學習筆記(二) 擴展CScrollbar屬性
Duilib的滾動條滑塊默認最小值為滾動條的高度(HScrollbar)或者寬度(VScrollbar)。並且這個值默認為16。當采用系統樣式的滾動條,或者 Troy的源碼(https://github.com/qdtroy/DuiLib_Ultimate )自帶的樣式時,是沒有問題的,因為這兩種樣式默認高(寬)度都是16,當滑塊最小時,也有16*16,背景圖片(九宮格式)不會出拉伸BUG。但是,當自定義背景圖片時,如果圖片本身大小超過16*16,則會出現重影,本圖中滾動條寬度設置為12,滑塊背景圖片為40*12。corner=”0,6,0,24”。或者滑塊變得很小
,本圖中滾動條寬度設置為12,滑塊背景圖片為40*12。corner=”0,6,0,6”。
查看源碼可以發現
m_rcThumb.top = rc.top; m_rcThumb.bottom = rc.top + m_cxyFixed.cy; if( m_nRange > 0 ) { int cxThumb = cx * (rc.right - rc.left) / (m_nRange + rc.right - rc.left); if( cxThumb < m_cxyFixed.cy ) cxThumb = m_cxyFixed.cy; m_rcThumb.left = m_nScrollPos * (cx - cxThumb) / m_nRange + m_rcButton1.right; m_rcThumb.right = m_rcThumb.left + cxThumb; if( m_rcThumb.right > m_rcButton2.left ) { m_rcThumb.left = m_rcButton2.left - cxThumb; m_rcThumb.right = m_rcButton2.left; } } else { m_rcThumb.left = m_rcButton1.right; m_rcThumb.right = m_rcButton2.left; }
,當滑塊變得很小時,源碼只是簡單的設置滑塊的寬度為m_cxyFixed.cy,即滾動條高度(HScrollbar)。因此,我們可以給它加一個屬性ThumbMinSize,即設置一個滑塊最小值,來替換m_cxyFixed.cy。
具體代碼如下:
頭文件UIScrollbar.h
protected: int m_nThumbMinSize; public: int GetThumbMinSize(); void SetThumbMinSize();
實現文件UIScrollbar.cpp
//構造函數里面初始化m_nThumbMinSize值為DEFAULT_SCROLLBAR_SIZE ,即16
CScrollBarUI::CScrollBarUI():……
{
m_nThumbMinSize = DEFAULT_SCROLLBAR_SIZE;
}
void CScrollBarUI::SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue) { ....... //源碼 else if (_tcsicmp(pstrName, _T("thumbminsize")) == 0) SetThumbMinSize(_ttoi(pstrValue)); } int CScrollBarUI::GetThumbMinSize() { return m_nThumbMinSize; } void CScrollBarUI::SetThumbMinSize(int nSize) { m_nThumbMinSize = nSize; Invalidate(); } void CScrollBarUI::SetPos(RECT rc, bool bNeedInvalidate) { …… //源碼 m_rcThumb.top = rc.top; m_rcThumb.bottom = rc.top + m_cxyFixed.cy; if( m_nRange > 0 ) { int cxThumb = cx * (rc.right - rc.left) / (m_nRange + rc.right - rc.left); /*這兒有改動,源碼設置的滑塊最小值為 滾動條的高度(HScrollbar)*/ if (cxThumb < m_nThumbMinSize) { if (m_nThumbMinSize < m_cxyFixed.cy) { cxThumb = m_cxyFixed.cy; } else cxThumb = m_nThumbMinSize; } m_rcThumb.left = m_nScrollPos * (cx - cxThumb) / m_nRange + m_rcButton1.right; m_rcThumb.right = m_rcThumb.left + cxThumb; if( m_rcThumb.right > m_rcButton2.left ) { m_rcThumb.left = m_rcButton2.left - cxThumb; m_rcThumb.right = m_rcButton2.left; } } …… //源碼 //另外,下面的豎向滾動條也一樣 }
完美實現!!!