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);
}