MFC中記錄使用者對列表控制元件(或列表檢視)列寬的調整
阿新 • • 發佈:2020-08-18
宣告成員變數
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); }