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 对象。

其它重要的功能,可以参考以下网址:

http://blog.csdn.net/zwgdft/article/details/7565331

-----------------------------------

时间: 2024-08-02 11:28:48

C++ 关于MFC List Control 控件的使用事项 原创的相关文章

基于wince的MFC Tab Control控件的使用

1,先建立一个对话框MFC应用程序,然后在工具箱里面把Tab Control控件放到对话框中的合适位置上. 再在对话框类中,声明一个CTabCtrl变量: CTabCtrl m_tab; 变量m_tab用来与对话框中的Tab Control控件交互,为此要在DoDataExchange函数中加入DDX_Control语句: 1 //{{AFX_DATA_MAP(CTABDlg) 2 DDX_Control(pDX, IDC_TAB, m_tab); 3 //}}AFX_DATA_MAP IDC_

MFC List Control控件添加单元格编辑和单元格下拉列表项以适用于数据库相关操作

作为现代的软件,往往是连着数据库的,而连着和用户方便地操作之间,还有着界面这道坎.MFC是Windows上比较好开发用户界面的框架,然而其自带的控件中没有对于数据库表格支持较好的控件,而使用网上提到的 DataGrid 等控件在本人的win8.1+VS2013平台上老出现找不到控件或者头文件的问题,搞的烦死人.最后想到 List Control 控件只要稍作修改,加上单元格编辑和单元格下拉列表,其实就能和数据库进行良好的对接,一百度,果然有人已经做了这件事,实在是太让人感动了!       

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

mfc Picture Control 控件属性

知识点: Picture Control 控件属性 CStatic类 图片控件 图片控件使用 一.图片控件属性 Picture Control 属性: Type:Frame //框架 Type:Etched Horz水平蚀刻线条 Type:Etched Vert垂真蚀刻线条 Type:Rectangle实心矩形 Type:Bitmap位图 Type:Icon 图标 Type:Enhanced Metafile 增强图元 支持wmf格式图片 Type:Owner Draw 自绘图 Color:颜色

OpenCV 通过 MFC 的 Picture Control 控件操作图像

如果希望对显示在MFC Picture Control 控件里的图像进行操作,比如画线画点之类的,可以利用 OpenCV 结合 MFC 本身的鼠标响应函数来实现. 如何将图像显示到 Picture Control 控件不谈,本文是采用的这篇博客所介绍的方法实现的. 点击打开链接 给对话框添加 WM_LBUTTONDOWN 鼠标左键点击消息,在消息响应函数中添加如下代码: void CMFCOpenCVShowDlg::OnLButtonDown(UINT nFlags, CPoint point

MFC编程 | tab control控件的使用

因为课程需要,会用到MFC编程,所以讲一些经验总结下,以便日后使用查询. // tab control控件的使用 // 建立一个Cluster窗口,通过tab可以切换成C-Means和Fuzzy C-Means窗口 1.插入对话框((ID:IDD_DIG_CLUSTER),删去默认生成的控件“OK”和“Cancel”后,插入一个tab control控件(ID:IDC_TAB).通过类向导,给此对话框定义一个类CCluster,给tab控件定义变量m_tab. 2.插入另外两个对话框作为C-Me

通过编写串口助手工具学习MFC过程&mdash;&mdash;(七)添加Tab Control控件

通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个串口助手再次熟悉一下MFC,并做了一下记录,以便方便以后查阅.做的过程中多是遇到问题直接百度和谷歌搜索来的,所以很多都是不求甚解,知其然不知其所以然.另外做此工具只是为了熟悉了解,许多功能还没有完善!(开发工具VS2008) (七)添加Tab Control控件 要在对话框里添加标签页,点击标签页上

MFC Month Calendar Control 控件使用

在上层软件编程中,往往须要提供一个月历控件让用户选择对应日期或者用此月历控件来强调特定的一天. MFC的 Month Calendar Control 控件自系统升级到 Windows 7 之后,对于日期控件所能做的操作变少了,不能对指定的日期的背景颜色进行更改.在网上查了非常久之后发现是操作系统画图风格的关系. 在这样的情况下. 仅仅能通过加粗特定日期的字体粗细来凸显该日期的不同(至少本人仅仅想到这个办法). 首先拉入 Month Calendar Control 控件,为控件加入一个变量叫做

OpenCV 2.2版本以上显示图片到 MFC 的 Picture Control 控件中

OpenCV 2.2 以及后面的版本取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序员无法调用里面的显示函数来将图片显示到 MFC 的 Picture Control 控件中.为此,网上很多人表示只要将那两个文件人为的提取出来然后放到工程里面就解决问题了,也提供了两个文件的下载,但是这麻烦不说,还会导致一些奇奇怪怪的报错(至少本人是这样的,很崩溃!).所以在了解了一些gdi绘图之后结合网上的代码写了如下的函数,只需调用就可以将OpenCV的图片显示在上面