在视图上创建ListCtrl的做法

作者:朱金灿

来源:http://blog.csdn.net/clever101

 

今天介绍下如何在一个视图上动态创建一个ListCtrl。

1.新建一个MFC的单文档工程,这里暂定名字为ListDemo。


2.在视图类上定义一个CListCtrl变量和保存各列宽度的数组

CListCtrl  m_List;
static int m_nColWidths[];// 用于保存列宽度

3.响应视图类的WM_CREATE和WM_SIZE两个消息,具体代码如下:

int CListDemoView::m_nColWidths[5] = {5,20,20,15,5};	// column width

void CListDemoView::InitListCtrl()
{

	// set column width according to window rect
	CRect rect;
	m_List.GetWindowRect(&rect);

	int w = rect.Width() - 2;

	TCHAR *	lpszHeaders[] = { _T("序号"),
		_T("姓名"),
		_T("学校"),
		_T("班别"),
		_T("年龄"),
		NULL };
	int i;
	int total_cx = 0;
	LV_COLUMN lvcolumn;
	memset(&lvcolumn, 0, sizeof(lvcolumn));

	w = w - ::GetSystemMetrics(SM_CXVSCROLL);	// width of vertical scroll bar

	// add columns
	for (i = 0; ; i++)
	{
		if (lpszHeaders[i] == NULL)
			break;

		lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
		lvcolumn.fmt = LVCFMT_LEFT;
		lvcolumn.pszText = lpszHeaders[i];
		lvcolumn.iSubItem = i;
		lvcolumn.cx = (lpszHeaders[i+1] == NULL) ? w - total_cx - 2 : (w * m_nColWidths[i]) / 64;
		total_cx += lvcolumn.cx;
		m_List.InsertColumn(i, &lvcolumn);
	}
	// 插入一行
	CString str = _T("");
	m_List.InsertItem(0,str);
}


// CListDemoView 消息处理程序
#define IDC_LIST_DIVISION               2000

int CListDemoView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	
	// 定义窗口风格
	DWORD dwStyle = LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | 
		WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP;

	CRect rect;
	GetClientRect(&rect);
    // 动态创建
	VERIFY(m_List.CreateEx(WS_EX_CLIENTEDGE,dwStyle,rect,this,IDC_LIST_DIVISION));
    // 设置字体
	CFont *pFont = GetFont();
	if (pFont)
		m_List.SetFont(pFont);
    // 设置扩展风格
	m_List.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
    // 初始化列表
	InitListCtrl();

	return 0;
}

void CListDemoView::OnSize(UINT nType, int cx, int cy)
{
	CView::OnSize(nType, cx, cy);

	
	if (::IsWindow(m_List.m_hWnd))
	{
		m_List.LockWindowUpdate();

		m_List.MoveWindow(0, 0, cx, cy);

		CRect rect;
		GetClientRect(&rect);

		int w = cx - 2 - ::GetSystemMetrics(SM_CXVSCROLL);
		int total_cx = 0;
		int nColNum = 5;

		//调整列的宽度
		for (int i = 0; i < nColNum; i++)
		{
			int colwidth = (i == 4) ? w - total_cx - 2 : (w * m_nColWidths[i]) / 64;
			total_cx += colwidth;
			m_List.SetColumnWidth(i,colwidth-2);
		}
		m_List.UnlockWindowUpdate();
	}
}

效果图如下:



示例工程源码下载




原文地址:https://www.cnblogs.com/lanzhi/p/6470350.html