MFC实现智能水平滚动条,重写滚动条方法
第一步、首先创建添加一个新类 这里以我的项目为例: 右键点击=》类向导 添加一个新类:CDJListBox,基类为:CListBox 接下来VS就会自动帮你生成2个文件:DJListBox.h 和 DJListBox.cpp 我们在DJListBox.h头文件里面添加: 注意看图添加位置
int AddString( LPCTSTR lpszItem ); int m_nMaxWidth;
在DJListBox.cpp文件里添加定义:
int CDJListBox::AddString(LPCTSTR lpszItem)
{
int nRet = CListBox::AddString(lpszItem);
SCROLLINFO scrollInfo;
memset(&scrollInfo, 0, sizeof(SCROLLINFO));
scrollInfo.cbSize = sizeof(SCROLLINFO);
scrollInfo.fMask = SIF_ALL;
GetScrollInfo(SB_VERT, &scrollInfo, SIF_ALL);
int nScrollWidth = 0;
if(GetCount() > 1 && ((int)scrollInfo.nMax >= (int)scrollInfo.nPage))
{
nScrollWidth = GetSystemMetrics(SM_CXVSCROLL);
}
SIZE sSize;
CClientDC myDC(this);
CFont* pListBoxFont = GetFont();
if(pListBoxFont != NULL)
{
CFont* pOldFont =myDC.SelectObject(pListBoxFont);
GetTextExtentPoint32(myDC.m_hDC, lpszItem, strlen(lpszItem), &sSize);
m_nMaxWidth = max(m_nMaxWidth, (int)sSize.cx);
SetHorizontalExtent(m_nMaxWidth + 3);
myDC.SelectObject(pOldFont);
}
return nRet;
}
然后还需要你给需要添加水平滚动条的控件设置成员变量 选择“添加变量”直接添加即可。 然后找到这个变量声明的地方: 将类名CDJListBox 替换原来的类 CListBox; 接下来即完成了,现在来看效果吧
