hur.cn - 华软网

 热门搜索

自绘的ListBox , 如何添加滚动条

  作者:未知    来源:网络    更新时间:2011/9/30
ListBox 控件是有 属性可以选的 ,选了 水平滚动条。。

但是  这个ListBox是自绘的,所以,字体很大。。。。

结果惊奇的发现, 看不到滚动条。。



对于自绘的ListBox 怎样加滚动条
---华软 网友回答---
CListBox::SetHorizontalExtent()
MSDN上例子代码~
---华软网友回复---
多谢,可以结贴了
---华软网友回复---
在你的ListBox边上加个滚动条控件 然后填写处理事件
---华软网友回复---
你提供的这个函数,是可以用的, 但是如果再添加个功能

智能的水平滚动条,该怎么办?



网上看了一些例子, 思路就是

覆盖CListBox::AddString ,

在AddString 中塞入一下代码

CDC *pDC = this->GetDC();
if ( NULL == pDC )
{
   return;
}

int nCount = this->GetCount();
if ( nCount < 1 )
{
   this->SetHorizontalExtent( 0 );
   return;
}

int nMaxExtent = 0;
CString szText;
for ( int i = 0; i < nCount; ++i )
{
   this->GetText( i, szText );
   CSize &cs = pDC->GetTextExtent( szText );
   if ( cs.cx > nMaxExtent )
   {
    nMaxExtent = cs.cx;
   }
}

this->SetHorizontalExtent( nMaxExtent );



我发现时不管用的, 因为 我不是把以上代码放在AddString中,而是放在DrawItem中。。。。

之所以放在那里,是因为 ,  


我既要重绘, 又要实现智能滚动


我的完整代码为:
C++">
void CMyListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{



    RECT rcItem;//项矩形
    ::CopyRect(&rcItem, &lpDrawItemStruct->rcItem);//拷贝矩形
    HDC hDC = lpDrawItemStruct->hDC;//项HDC

CDC* pDC=CDC::FromHandle(hDC);  //句柄转换为指针
    
    

    if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
        (lpDrawItemStruct->itemState & ODS_SELECTED))
    {
        ::SetTextColor(hDC, ::GetSysColor(COLOR_BTNHILIGHT));//高亮文本
        ::SetBkColor(hDC, ::GetSysColor(COLOR_HIGHLIGHT));//高亮文字背景
        ::FillRect(hDC, &rcItem, ::GetSysColorBrush(COLOR_HIGHLIGHT));//用高亮色填充项矩形
        ::DrawFocusRect(hDC, &rcItem);//画焦点矩形
        //选中项的显示代码,如果有需要显示非文本的代码放于此
    }

    else
    {
        HBRUSH hbrBkOld ;


int value=GetItemData(lpDrawItemStruct->itemID);

switch( value)

{
case 0:

hbrBkOld = ::CreateSolidBrush(RGB(255,23,2));//旧画笔
        ::FillRect(hDC, &rcItem, hbrBkOld);
        ::DeleteObject(hbrBkOld);
      
break;

case 1:
hbrBkOld= ::CreateSolidBrush(RGB(55,3,2));//旧画笔

::FillRect(hDC, &rcItem, hbrBkOld);
        ::DeleteObject(hbrBkOld);
        break;


case 2:
hbrBkOld = ::CreateSolidBrush(RGB(25,223,129));//旧画笔

::FillRect(hDC, &rcItem, hbrBkOld);
        ::DeleteObject(hbrBkOld);
break;
}  //end swtich
}  //end else
   

/////////////////////////////////////////////////////////

if ( NULL == pDC )
{
return;
}

int nCount = this->GetCount();
if ( nCount < 1 )
{
this->SetHorizontalExtent( 0 );
return;
}

int nMaxExtent = 0;
CString szText;
for ( int i = 0; i < nCount; ++i )
{
this->GetText( i, szText );
CSize &cs = pDC->GetTextExtent( szText );
if ( cs.cx > nMaxExtent )
{
nMaxExtent = cs.cx;
}
}

this->SetHorizontalExtent( nMaxExtent );



   pDC->DrawText(data[lpDrawItemStruct->itemID],&rcItem,DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_WORD_ELLIPSIS );
//不管选中不选中都显示的代码,显示文本的代码放于此    
//回复先前的HDC





}





引用 1 楼 visualeleven 的回复:
CListBox::SetHorizontalExtent()
MSDN上例子代码~

---华软网友回复---
我看过不少 关于智能水平滚动条条的文章, 

他们的做法都是在覆盖AddString函数,,

但是这种方法只能对于 非自绘型的。。。自绘的不管用

原因是: 对于自绘的,可以借助这个函数,来获得文本,
this->GetText( i, szText );

然后

CSize &cs = pDC->GetTextExtent( szText );

if ( cs.cx > nMaxExtent )
{
nMaxExtent = cs.cx;
}

最终无法做到 智能水平, 究其原因在于GetText作怪,它根本无法正确获得自绘的文本内容


     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。