DuiLib學習筆記(二) 擴展CScrollbar屬性


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;
        }
    }
    ……    //源碼

    //另外,下面的豎向滾動條也一樣
}

修改后

完美實現!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM