作者:朱金灿
来源: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(); } }
效果图如下: