作者:朱金灿

来源: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();
}
}

效果图如下:

示例工程源码下载

在视图上创建ListCtrl的做法的更多相关文章

  1. SqlServer在视图上创建索引

    在视图上创建索引需要三个条件: 一.视图必须绑定到架构. 要做到这点,在 CREATE VIEW 语句中,必须加上 WITH SCHEMABINDING,如果是使用企业管理器,则在设计界面的空白处点击 ...

  2. SqlServer视图的创建与使用

    SqlServer系列之视图的创建与使用: 什么是视图? 视图的概述 在数据查询中,可以看到数据表设计过程中,考虑到数据的冗余度低.数据一致性等问题,通常对数据表的设计要满足范式的要求,因此也会造成一 ...

  3. ASP.NET Core 中文文档 第二章 指南(1)用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序

    原文:Your First ASP.NET Core Application on a Mac Using Visual Studio Code 作者:Daniel Roth.Steve Smith ...

  4. IntelliJ IDEA上创建maven Spring MVC项目

    IntelliJ IDEA上创建Maven Spring MVC项目 各软件版本 利用maven骨架建立一个webapp 建立相应的目录 配置Maven和SpringMVC 配置Maven的pom.x ...

  5. oracle 物化视图及创建索引

    物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询.这样对整体 ...

  6. Oracle物化视图的创建及使用

    oracle物化视图 一.oracle物化视图基本概念  物化视图首先需要创建物化视图日志,  oracle依据用户创建的物化视图日志来创建物化视图日志表,  物化视图日志表的名称为mlog$_后面跟 ...

  7. Oracle物化视图的创建及使用(一

    Oracle物化视图的创建及使用 http://blog.csdn.net/tegwy/article/details/8935058 先看简单创建语句: create   materialized  ...

  8. Mysql视图的创建及使用

    视图理解: 视图又叫虚表.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成. 视 ...

  9. window 上创建 .gitignore文件

    由于 git默认不上传空文件夹,如果需要上传空文件夹,那么需要这样上传空文件,官方给出这样的做法~~ (需要创建.gitignore文件) 在linux 上比较好操作了,这里说下在window 上 创 ...

随机推荐

  1. 【习题 6-1 UVA-673】Parentheses Balance

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 括号匹配. 栈模拟就好. 多种括号也是一样可以做的. [代码] #include <bits/stdc++.h> usi ...

  2. 基于zookeeper实现的分布式锁

    基于zookeeper实现的分布式锁 2011-01-27 • 技术 • 7 条评论 • jiacheo •14,941 阅读 A distributed lock base on zookeeper ...

  3. 洛谷 P2025 脑力大人之监听电话

    P2025 脑力大人之监听电话 题目背景 画外音: (声明:不要管前面那个,纯属意外,现已经重新编题,绝对原创) 上次海选,我们选出了参赛者中的20%参加本次比赛,现在我们将进行第二轮的筛选,这次的比 ...

  4. 函数的引用透明性(referential transparency)

    1. 基础 初学程序设计时,比较容易混淆的两个概念是数学函数(math function)和程序中使用的函数. 在数学函数中 y=f(x),一个输入值有固定的输出值.例如,无论计算多少次,sinπ 的 ...

  5. 学习redis--安装(二)

    安装前准备,我是在虚拟机中安装centos,然后安装redis. 安装 1.安装VMware,并安转centos系统 2.将redis的压缩包,上传到linux系统中(将下载到pc中的文件,拖到cen ...

  6. GMTC2019会后:做一场冷门的技术专场是什么体验

    上周四(6.20)GMTC2019大会的第一天,很荣幸作为「UI与图形渲染」专场出品人获得了与图形领域几位技术专家同场交流的机会. 图形技术在前端范畴内是一个相对小众的话题,虽然前端工程师几乎每天都在 ...

  7. Summary Day30

    1.内存管理 1.1 进程中的内存区域划分 代码区   仅仅读常理区    全局区    BSS     堆   栈 1.2 字符串存储形式之间的比較 字符指针,字符数组.字符动态内存 1.3 虚拟内 ...

  8. hadoop的关键进程 分类: A1_HADOOP 2015-06-06 11:37 52人阅读 评论(0) 收藏

    hadoop集群中主要进程有 master:   NameNode, ResourceManager, slaves:   DataNode, NodeManager,  RunJar, MRAppM ...

  9. php中的转义字符(用反斜杠\来输出,和C语言一样)

    php中的转义字符(用反斜杠\来输出,和C语言一样) 一.总结 1.引号中的变量:双引号会替换变量的值,而单引号会把它当做字符串输出. 2.引号中的转义字符:双引号将用变量的值(test)代替它的名称 ...

  10. js中json数据简单处理(JSON.parse()和js中嵌套html)

    js中json数据简单处理(JSON.parse()和js中嵌套html) 一.总结 1.html中嵌套js:<script>js代码</script> 2.js中嵌套html ...