C++ 关于MFC List Control 控件的总结

1\在开发项目时,使用到了 listcontrol 控件,就一些问题,做一下备注,以备以后使用

(1)  给list项目 删除所有的项目  DeleteAllItems();

(2) 给list项目 添加一个列 .InsertColumn(0, _T("编号"));

(3)给list a项目 设置列的宽度 .SetColumnWidth(0, 50);

(4) 在添加项目之前 可以使用 .SetRedraw(false); 来禁止 重画,这样可以提高效率.当添加完成后,可以 使用 .SetRedraw(true);  重新启用重画

(5) 添加项目:  m_List_IpList.InsertItem(3, _T("4"), 3);

第1个参数是 行数,  如果放在第0行,就写为0 .这里的号必须是一个合理的号,不合理的号,会出现错误

第2个参数是 行的标题

第3个参数是 对应的  显示图标 号,后面会讲到,如果不使用,就设置为 -1

(6)对于非 report项目来讲,第 (5)条就可以了,但是对于 Report 样式,还需要添加一些其它列的信息,可以使用   SetItemText(0, 1, _T("192.168.1.4"));  来添加其它的内容

(7)  可以使用 SetItemData() 来在对应的行中,保存一些重要的数据信息.用于程序处理

(8) 关于行高的调整  调整行高的方法有多个,但是建议使用Cimagelist 来调节

设置CListCtrl的行高没有函数接口,可以通过自绘来实现,但是比较麻烦。有一个比较简单的方法是通过使用一个空白的图像将行撑起来,使其高度发生变化。示例如下:

例如:

CImageList m_image;
m_image.Create(1,24,ILC_COLOR32,1,0);
m_listInfo.SetImageList(&m_image, LVSIL_SMALL);

(9 )  对于字体的设置,我们可以使用SetFont函数来实现。以修改CListView的字体为例,在OnInitialUpdate函数中插入列之前调用SetFontSelf函数(该函数自定义,如下示例所示)。首先创建一个字体,然后调用SetFont进行设置。需要注意的是,在退出时需要delete 掉创建的字体,避免内存泄露。

//设置字体和大小
void CMyListView::SetFontSelf(int nHeight, LPCTSTR lpszFacename)
{
  //先删除原有字体
  if(m_font != NULL)
    delete m_font;
  m_font = new CFont;
  //创建字体
  m_font->CreateFont(
    nHeight,          // nHeight
    0,             // nWidth
    0,             // nEscapement
    0,             // nOrientation
    FW_NORMAL,         // nWeight
    FALSE,           // bItalic
    FALSE,           // bUnderline
    0,             // cStrikeOut
    ANSI_CHARSET,       // nCharSet
    OUT_DEFAULT_PRECIS,    // nOutPrecision
    CLIP_DEFAULT_PRECIS,    // nClipPrecision
    DEFAULT_QUALITY,      // nQuality
    DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
    lpszFacename);       // lpszFacename

  //设置字体
  CListCtrl &theCtrl = GetListCtrl();    //获取控制权,引用变量
  theCtrl.SetFont(m_font, TRUE);
}

(10) 点击表头时进行归类排序

系统通过发送LVM_SORTITEMS消息来处理归类问题,在该消息的处理函数中需要调用一个回调函数,这个回调函数需要我们来设计,以完成不同的归类方法。回调函数原型如下:
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)

针对上述回调函数,有以下几点需要搞清楚:

① 对于参数lparam1和lparam2,分别为CListCtrl的两行数据,是用于比较的对象。通过CListCtrl的成员函数SetItemData来设置,该函数原型:

int SetItemData(int nIndex,  DWORD_PTR dwItemData )

其第一个参数为行号,第二个参数指明了该行对应的参数。参数dwItemData 通常设为一行参数的数组,如: pData[2][2] = {{1, 3},{2, 3}}; 每次使用pData[i]作为dwItemData。

② 对于参数lParamSort,用于指明列项,即第几列。该参数和回调函数一同通过CListCtrl的成员函数SortItems来设置,其函数原型为:

BOOL SortItems( PFNLVCOMPARE pfnCompare,DWORD_PTR dwData )

参数 pfnCompare 为回调函数入口地址, 参数dwData 为列项。

③ SetItemData在初始插入数据时进行调用来设置,SortItems则在点击列表头时响应的消息处理函数中进行设置。

示例如下:

//初始化列表视图控件
BOOL CDataAnalysis::InitListCtl()
{
  //其他处理,包括设置风格,插入列等等
  //插入行
  for(int i=0; i<LineNum; i++)
  {
    //要将char*转换为wchar_t*
    mbstowcs_s(&converted, wStr, 30, m_analysis[i].Date, _TRUNCATE);
    m_listAnalysis.InsertItem(i, wStr);                //日期
    mbstowcs_s(&converted, wStr, 30, m_analysis[i].Time, _TRUNCATE);
    m_listAnalysis.SetItemText(i, 1, wStr);              //时间
    mbstowcs_s(&converted, wStr, 30, m_analysis[i].ID, _TRUNCATE);
    m_listAnalysis.SetItemText(i, 2, wStr);              //ID
    m_listAnalysis.SetItemText(i, 3, m_analysis[i].lpszEvent);    //事件

    //设置回调函数的参数
    m_listAnalysis.SetItemData(i, (LPARAM)(m_analysis+i));
  }

  return TRUE;
}
void CDataAnalysis::OnHdnItemclickAnalysisList(NMHDR *pNMHDR, LRESULT *pResult)
{
  LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);
  // TODO: Add your control notification handler code here

  //设置回调函数的参数和入口地址
  m_listAnalysis.SortItems(SortFunc, phdr->iItem);

  *pResult = 0;
}
//排序的回调函数
int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
  int result;    //返回值

  //两行的参数,用于比较
  ANALYSISFORMAT* pAnalysis1 = (ANALYSISFORMAT*)lParam1;
  ANALYSISFORMAT* pAnalysis2 = (ANALYSISFORMAT*)lParam2;

  //排序
  switch(lParamSort)
  {
  case 0:    //日期
    result = strcmp(pAnalysis1->Date, pAnalysis2->Date);
    break;
  case 1:    //时间
    result = strcmp(pAnalysis1->Time, pAnalysis2->Time);
    break;
  case 2:    //ID
    result = strcmp(pAnalysis1->ID, pAnalysis2->ID);
    break;
  case 3:    //事件
    result = wcscmp(pAnalysis1->lpszEvent, pAnalysis2->lpszEvent);
    break;
  default:
    break;
  }

  return result;
}

关于如何使用图标的方法

需要首先将 list control 控件绑定一个 imagelist 项目

方法如下

CImageList m_image;
m_image.Create(IDB_IP_BITMAP, 16, 1, RGB(255, 255, 0));
m_List_IpList.SetImageList(&m_image, LVSIL_SMALL);
m_image.Detach();   //这一句话 非常的重要,如果没有这句话, 图标不会显示

前两句的意思就是 建立一个 CImagelist 项目

其中 第二句 在VB6.0上 可能不存在, 在 VS2012中 可以使用

就是直接加载 位图资源到 图象列表

在将图象列表绑定到需要显示的项目后, 要执行一次 Detach() 函数

目的:     调用此功能分离图像列表从 CImageList 对象。

以上所述就是本文的全部内容了,希望大家能够喜欢。

(0)

相关推荐

  • c++ STL容器总结之:vertor与list的应用

    STL提供六大组件,彼此可以组合套用 1.容器(containers):各种数据结构,如vertor,list,deque,set,map.从实现的角度来看,STL容器是一种class template 2.算法(algorithms):各种算法如sort,search,copy,earse.STL算法是一种 function template. 3.迭代器(iterators):扮演容器与算法之间的胶合剂,是所谓的"泛型指针".所有STL容器都有自己的专属的迭代器. 4.仿函数(fu

  • C++ 使用模板实现一个List的实例

    C ++使用模板写的一个List template<class T> class List { private: struct Node { T data; Node *next; }; //head Node *head; //size int length; //process Node *p; //temp Node *q; public: List() { head = NULL; length = 0; p = NULL; } void add(T t) { if(head == N

  • C++ 简单实现MFC ListControl 点击列头排序

    说明: SetItemData可以为每一行绑定一个DWORD类型的变量.用GetItemData可以获得这个变量. 举个例子,假设CListCtrl中你需要显示某个数据表中的记录,该表有个流水号主键ID,一般这个ID值本身没有什么意义,用户也不需要看,因此在CListCtrl的可见列中,你不需要显示.但往往做具体查询等操作时,你又需要用这个ID来完成.这时,用SetItemData将其绑定到每一行,将非常方便,用户操作哪一行,则用GetItemData可以得到对应记录的ID,直接用来做操作,很爽

  • C++中 STL list详解及简单实例

    C++中 STL list详解 1.List: 内部实现是一个双向链表,可以高效的进行插入删除,但不能够进行随机访问 2..示例程序: #include "stdafx.h" #include <iostream> #include <list> #include <iterator> #include <algorithm> using namespace std; const int num[5] = {1,3,2,4,5}; boo

  • 关于C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)

    由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,提出了指针参数来解决问题. 如printf()函数,其原型为:int   printf(   const   char*   format,   ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法:   printf( "%d ",i);   printf( "%s "

  • C++语言 STL容器list总结

    在使用std::list<>链表时,难免会对数据进行添加删除操作.而遍历链表则有两种方式:通过索引访问,象数组一样处理:通过std::list<>::iterator链表遍历器进行访问 STL 中的list 就是一 双向链表,可高效地进行插入删除元素. list不支持随机访问.所以没有 at(pos)和operator[]. list 对象list1, list2 分别有元素list1(1,2,3),list2(4,5,6) .list< int>::iterator

  • C++实现的泛型List类分享

    额,不要说我三心二意:一边在看.NET和CLR的原理.一边在看JavaScript.一边在看Java:有时看算法有时看Unity.Hibernate:有时看Hadoop有时看Redis:现在又开始看C++了. 以前觉得无论什么语言嘛,其实都差不多,核心思想基本一致.现在又不这么想了,其实语言的选择对软件的性能.可靠性.开发成本之类的关系很大,所以觉得还是要多接触一些比较核心的东西--那么自然是C++了.以前在学校学的C++完全是酱油,太水了基本没啥用,用来用去和C差不多,所以现在要自己学啦. 废

  • C++ STL list 遍历删除出错解决方案

    C++ STL list 遍历删除崩溃 错误用法一 下面这种用法会在for的地方崩溃,分析 第一次for循环的时候 it=0,当t.erase(it)执行完成之后 it就变成了 -17891602 表明it不能再作为迭代器进行运算,自然会报错. #include <map> #include <list> using namespace std; typedef std::list<int > TESTLIST; int _tmain(int argc, _TCHAR*

  • 基于C++ list中erase与remove函数的使用详解

    erase的作用是,使作为参数的迭代器失效,并返回指向该迭代器下一参数的迭代器.如下: 复制代码 代码如下: list ParticleSystem;list::iterator pointer;if(pointer->dead == true){   pointer = ParticleSystem.erase(pointer);} 有一段关于错误使用erase的程序 复制代码 代码如下: using namespace std;int main(){  std::listtest_list;

  • C++中MFC Tab Control控件的使用详解

    1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置ID为IDC_TABTEST 在More Styles里勾上Bottom. 调速尺寸使其布满整个对话框, 我这边Tab Control的尺寸最后为164X203. 在ClassWizard为其添加变量, 变量名为m_tab. 类型为CTabCtrl. 3. 在对话框的初始化函数OnInitDialog

  • C++ 关于MFC List Control 控件的总结

    1\在开发项目时,使用到了 listcontrol 控件,就一些问题,做一下备注,以备以后使用 (1)  给list项目 删除所有的项目  DeleteAllItems(); (2) 给list项目 添加一个列 .InsertColumn(0, _T("编号")); (3)给list a项目 设置列的宽度 .SetColumnWidth(0, 50); (4) 在添加项目之前 可以使用 .SetRedraw(false); 来禁止 重画,这样可以提高效率.当添加完成后,可以 使用 .S

  • VS2010/MFC编程(常用控件:树形控件Tree Control控件创建h和实例)

    前面一节讲了树形控件Tree Control的简介.通知消息以及相关数据结构,本节继续讲下半部分,包括树形控件的创建.CTreeCtrl类的主要成员函数和应用实例. 树形控件的创建 MFC为树形控件提供了CTreeCtrl类,它封装了树形控件的所有操作. 树形控件的创建也是有两种方式,一种是在对话框模板中直接拖入Tree Control控件创建,另一种就是通过CTreeCtrl类的Create成员函数创建.下面主要讲后者. CTreeCtrl类的Create成员函数的原型如下: virtual

  • VC中Tab control控件的用法详细解析

    1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置ID为IDC_TABTEST 在More Styles里勾上Bottom. 调速尺寸使其布满整个对话框, 我这边Tab Control的尺寸最后为164X203. 在ClassWizard为其添加变量, 变量名为m_tab. 类型为CTabCtrl. 3. 在对话框的初始化函数OnInitDialog

  • MFC之ComboBox控件用法实例教程

    本文以实例形式较为详细的讲述了MFC中ComboBox控件的用法.分享给大家供大家参考之用.具体方法如下: 一.ComboBox简介: ComboBox控件是由一个文本输入控件和一个下拉菜单组成的.用户可以从一个预先定义的列表里选择一个选项,同时也可以直接在文本框里面输入文本. 从工具栏中拖一个Combo Box控件.右击添加变量,变量名为cbBox. 二.用法: 1.为控件添加选项,指定默认选项 cbBox.AddString(_T("one")); cbBox.AddString(

  • VC List Control控件如何删除选中的记录实例详解

    VC List Control控件如何删除选中的记录实例详解 实例代码: OnButtonDelete() { POSITION pos = m_list.GetFirstSelectedItemPosition(); int idx = m_list.GetNextSelectedItem(pos); while (idx != -1){ LVITEM lvi; lvi.iItem = idx; lvi.iSubItem = 0; lvi.mask = LVIF_IMAGE; if (m_li

  • C++ Custom Control控件向父窗体发送对应的消息

    向父窗体发送消息 ,这里只讲发送 WM_NOTIFY  消息, 其它消息是相同的 在 控件中的某个函数中 设置发送消息的程序 首先定义一个WM_NOTIFY消息的专用结构. NMHDR nm; nm.code = 123456; // 这里是消息的区别代码 nm.hwndFrom = m_hWnd;//这是控件的HWND句柄 nm.idFrom = GetDlgCtrlID();//这是得到的对话框的ID CWnd* pWnd; pWnd = GetParent(); //得到父窗体 窗口 if

  • WinForm实现移除控件某个事件的方法

    本文实例讲述了WinForm实现移除控件某个事件的方法,供大家参考借鉴一下.具体功能代码如下: 主要功能部分代码如下: /// <summary> /// 移除控件某个事件 /// </summary> /// <param name="control">控件</param> /// <param name="eventName">需要移除的控件名称eg:EventClick</param> p

  • C#利用控件拖拽技术制作拼图游戏

    主要实现的功能: 1.程序附带多张拼图随机拼图. 2.可手动添加拼图. 3.游戏成功判断. 4.30秒超时判断. Puzzle.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms

  • C# WinForm实现窗体上控件自由拖动功能示例

    本文实例讲述了C# WinForm实现窗体上控件自由拖动功能.分享给大家供大家参考,具体如下: 说明:首先在窗体上放一个PictrueBox控件,命名为pb1,拖动完整代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; usin

随机推荐