• 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

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

  • 相关阅读:
    牛客小白月赛29 种树 题解(思维)
    E
    D
    方格取数(number) 题解(dp)
    csust T1097 “是时候表演真正的技术了” 题解(虚点跑最短路)
    poj 2352 Stars
    poj 3321 Apple Tree
    poj 3067 Japan
    poj 1195 Mobile phones
    poj 2155 Matrix
  • 原文地址:https://www.cnblogs.com/lujin49/p/4563162.html
Copyright © 2020-2023  润新知