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);
    }
    
  • 相关阅读:
    网站测试
    shell102输出数组
    shell101变量
    shell100for无参数形式
    shell99函数中传数组
    shell98函数的参数
    将php中session存入redis中
    windows下安装redis客户端
    window下phpstudy开启redis扩展
    *ginx下开启phpredis扩展
  • 原文地址:https://www.cnblogs.com/fenggwsx/p/13522912.html
Copyright © 2011-2022 走看看