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; 接下来即完成了,现在来看效果吧

经验分享 程序员 微信小程序 职场和发展