zoukankan      html  css  js  c++  java
  • 在视图上创建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();
    	}
    }
    

    效果图如下:



    示例工程源码下载




  • 相关阅读:
    OC准备知识
    文件操作
    双向链表
    单链表(Single Linked List)
    动态分配内存补充 realloc
    git心得一
    git的工作原理
    git:团队开发的流程
    git操作流程
    js:有关属性
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470350.html
Copyright © 2011-2022 走看看