MFC中记录用户对列表控件(或列表视图)列宽的调整

声明成员变量

class CMyCtrl/CMyView :
	public CListCtrl/CListView
{
...
public:
	CMyCtrl/CMyView(); // 构造函数
protected:
	const int m_nMinWidth = 80; // 最小列宽(如果不需要设置最小列宽可省略)
	const int m_nMaxWidth = 320; // 最大列宽(如果不需要设置最大列宽可省略)
	const int m_nDefaultColumnWidth[4]; // 默认列宽
	int m_nColumnWidth[4]; // 实际列宽
...
}

初始化成员变量

CMyCtrl/CMyView::CMyCtrl/CMyView()
	: m_nDefaultColumnWidth{ 120,120,90,90 } // 初始化为默认列宽
	, m_nColumnWidth{ 0 } // 初始化为0,用于检测是否从读取到列宽
{
	int* pData = NULL;
	UINT n = 0;
	theApp.GetProfileBinary(_T("Record"), _T("MyListCtrlColumnWidth/MyListViewColumnWidth"), (LPBYTE*)&pData, &n);
	n = n * sizeof(BYTE) / sizeof(int); // n由字节长度变为元素个数
	if (n > _countof(m_nColumnWidth)) // 防止下标越界
		n = _countof(m_nColumnWidth);
	for (UINT i = 0; i < n; ++i) // 统一使用UINT,防止有符号与无符号比较
		m_nColumnWidth[i] = pData[i];
	delete[] pData; // 释放内存
	for (int i = 0; i < _countof(m_nColumnWidth); ++i) // 将没有被设置的列的列宽设为默认列宽
		if (m_nColumnWidth[i] == 0)
			m_nColumnWidth[i] = m_nDefaultColumnWidth[i];
}

修改插入列时的代码

int CMyCtrl/CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CListCtrl/CListView::OnCreate(lpCreateStruct) == -1)
		return -1;
	/*GetListCtrl().*/SetExtendedStyle(GetListCtrl().GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_DOUBLEBUFFER); // 设置扩展样式
	/*GetListCtrl().*/InsertColumn(0, _T("column1"), LVCFMT_LEFT, m_nColumnWidth[0]); // 列宽使用 m_nColumnWidth[index]
	/*GetListCtrl().*/InsertColumn(1, _T("column2"), LVCFMT_LEFT, m_nColumnWidth[1]);
	/*GetListCtrl().*/InsertColumn(2, _T("column3"), LVCFMT_LEFT, m_nColumnWidth[2]);
	/*GetListCtrl().*/InsertColumn(3, _T("column4"), LVCFMT_LEFT, m_nColumnWidth[3]);
	return 0;
}

重写虚函数OnNotify

如果需要设置最小和最大列宽,启用预留代码,具体可参考MFC中设置列表控件(或列表视图)的最小和最大列宽

BOOL CMyCtrl/CMyView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
	HD_NOTIFY* pHDN = (HD_NOTIFY*)lParam;
	switch (pHDN->hdr.code)
	{
	// 预留代码,需要设置最小和最大列宽时启用下列代码
	//case HDN_ITEMCHANGINGA:
	//case HDN_ITEMCHANGINGW:
	//	if (pHDN->pitem->cxy < m_nMinWidth) // 最小列宽
	//		pHDN->pitem->cxy = m_nMinWidth;
	//	else if (pHDN->pitem->cxy > m_nMaxWidth) // 最大列宽
	//		pHDN->pitem->cxy = m_nMaxWidth;
	//	break;
	case HDN_ENDTRACK:
		// 预留代码,需要设置最小和最大列宽时启用下列代码
		//if (pHDN->pitem->cxy < m_nMinWidth) // 最小列宽
		//	pHDN->pitem->cxy = m_nMinWidth;
		//else if (pHDN->pitem->cxy > m_nMaxWidth) // 最大列宽
		//	pHDN->pitem->cxy = m_nMaxWidth;
		m_nColumnWidth[pHDN->iItem] = pHDN->pitem->cxy;
		theApp.WriteProfileBinary(_T("Record"), _T("MyListCtrlColumnWidth/MyListViewColumnWidth"), (LPBYTE)m_nColumnWidth, sizeof(m_nColumnWidth));
		break;
	default:
		break;
	}
	return CListCtrl/CListView::OnNotify(wParam, lParam, pResult);
}
原文地址:https://www.cnblogs.com/fenggwsx/p/13522912.html