1. 程式人生 > 實用技巧 >MFC中記錄使用者對列表控制元件(或列表檢視)列寬的調整

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