zoukankan      html  css  js  c++  java
  • 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);
    }
    
  • 相关阅读:
    几种常用的曲线
    0188. Best Time to Buy and Sell Stock IV (H)
    0074. Search a 2D Matrix (M)
    0189. Rotate Array (E)
    0148. Sort List (M)
    0859. Buddy Strings (E)
    0316. Remove Duplicate Letters (M)
    0452. Minimum Number of Arrows to Burst Balloons (M)
    0449. Serialize and Deserialize BST (M)
    0704. Binary Search (E)
  • 原文地址:https://www.cnblogs.com/fenggwsx/p/13522912.html
Copyright © 2011-2022 走看看