VC++ ListCtrl Report使用

本文详细介绍了如何在VC++6.0中使用MFC创建基于对话框的应用程序,并通过具体步骤演示了如何初始化ListCtrl控件、设置其样式、插入数据以及添加消息响应等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1、在VC++ 6.0中新建基于对话框的MFC应用程序ListCtrl;

  2、在主对话框上添加一个List Control至合适的位置及大小;

  

  3、在对话框OnInitDialog中初始化ListCtrl,代码如下:

    // 设置ListCtrl的风格及扩展风格
    LONG lStyle;
    lStyle = GetWindowLong(m_ctlListCtrl.m_hWnd, GWL_STYLE);
    lStyle &= ~LVS_TYPEMASK; 
    lStyle |= LVS_REPORT; 
    SetWindowLong(m_ctlListCtrl.m_hWnd, GWL_STYLE, lStyle);
    
    DWORD dwStyle = m_ctlListCtrl.GetExtendedStyle();
    dwStyle |= LVS_EX_FULLROWSELECT;                                        //选中某行使整行高亮(LVS_REPORT)
    dwStyle |= LVS_EX_GRIDLINES;                                            //网格线(LVS_REPORT)
    dwStyle |= LVS_EX_CHECKBOXES;                                            //CheckBox
    m_ctlListCtrl.SetExtendedStyle(dwStyle); 

    // 向ListCtrl插入数据
    m_ctlListCtrl.InsertColumn( 0, _T("No."), LVCFMT_LEFT, 40);
    m_ctlListCtrl.InsertColumn( 1, _T("Name"), LVCFMT_LEFT, 120 );
    m_ctlListCtrl.InsertColumn( 2, _T("Address"), LVCFMT_LEFT, 170);
    m_ctlListCtrl.InsertColumn( 3, _T("Score"), LVCFMT_LEFT, 50);
    int nRowIndex = 0;
    m_ctlListCtrl.InsertItem(nRowIndex, _T("01"));
    m_ctlListCtrl.SetItemText(nRowIndex, 1, _T("Michael Jordan"));
    m_ctlListCtrl.SetItemText(nRowIndex, 2, _T("Brooklyn,New York "));
    m_ctlListCtrl.SetItemText(nRowIndex, 3, _T("99"));
    nRowIndex++;
    m_ctlListCtrl.InsertItem(nRowIndex, _T("02"));
    m_ctlListCtrl.SetItemText(nRowIndex, 1, _T("Lebron James"));
    m_ctlListCtrl.SetItemText(nRowIndex, 2, _T("Akron,Ohio"));
    m_ctlListCtrl.SetItemText(nRowIndex, 3, _T("98"));
    nRowIndex++;
    m_ctlListCtrl.InsertItem(nRowIndex, _T("03"));
    m_ctlListCtrl.SetItemText(nRowIndex, 1, _T("Kobe Bryant"));
    m_ctlListCtrl.SetItemText(nRowIndex, 2, _T("Philadelphia,Pennsylvania"));
    m_ctlListCtrl.SetItemText(nRowIndex, 3, _T("97"));
    nRowIndex++;
    m_ctlListCtrl.InsertItem(nRowIndex, _T("04"));
    m_ctlListCtrl.SetItemText(nRowIndex, 1, _T("James Harden"));
    m_ctlListCtrl.SetItemText(nRowIndex, 2, _T("Los Angeles,California"));
    m_ctlListCtrl.SetItemText(nRowIndex, 3, _T("96"));
    nRowIndex++;
    m_ctlListCtrl.InsertItem(nRowIndex, _T("05"));
    m_ctlListCtrl.SetItemText(nRowIndex, 1, _T("Russell Westbrook"));
    m_ctlListCtrl.SetItemText(nRowIndex, 2, _T("Long Beach,CA"));
    m_ctlListCtrl.SetItemText(nRowIndex, 3, _T("95"));

  4、添加消息响应

  // Generated message map functions
  //{{AFX_MSG(CListCtrlDlg)
  virtual BOOL OnInitDialog();
  afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
  afx_msg void OnPaint();
  afx_msg HCURSOR OnQueryDragIcon();
  afx_msg void OnClickListDemo(NMHDR* pNMHDR, LRESULT* pResult);
  afx_msg void OnCustomDrawListDemo(NMHDR* pNMHDR, LRESULT* pResult);
  afx_msg void OnItemChangedListDemo(NMHDR* pNMHDR, LRESULT* pResult);
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()



  BEGIN_MESSAGE_MAP(CListCtrlDlg, CDialog)
    //{{AFX_MSG_MAP(CListCtrlDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_NOTIFY(NM_CLICK, IDC_LIST_DEMO, OnClickListDemo)
    ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST_DEMO, OnCustomDrawListDemo)
    ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_DEMO, OnItemChangedListDemo)
    //}}AFX_MSG_MAP
  END_MESSAGE_MAP()



void
CListCtrlDlg::OnClickListDemo(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if(pNMListView->iItem != -1) { int i = pNMListView->iItem; int nCheckState = 0; if( m_ctlListCtrl.GetItemState(i, m_ctlListCtrl.GetCheck(i))) { nCheckState = 1; } CString strtemp; strtemp.Format(_T("Row = %d, Column = %d\nCheckState = %d"), pNMListView->iItem, pNMListView->iSubItem, nCheckState); AfxMessageBox(strtemp); } *pResult = 0; } void CListCtrlDlg::OnCustomDrawListDemo( NMHDR* pNMHDR, LRESULT* pResult ) { NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR); *pResult = 0; if(CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage) { *pResult = CDRF_NOTIFYITEMDRAW; } else if(CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage) { //奇数行 if(pLVCD->nmcd.dwItemSpec % 2) pLVCD->clrTextBk = RGB(255, 255, 128); //偶数行 else pLVCD->clrTextBk = RGB(128, 255, 255); //继续 *pResult = CDRF_DODEFAULT; } } void CListCtrlDlg::OnItemChangedListDemo(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here CString sTemp; if((pNMListView->uOldState & LVIS_FOCUSED) == LVIS_FOCUSED && (pNMListView->uNewState & LVIS_FOCUSED) == 0) { sTemp.Format(_T("%d losted focus"), pNMListView->iItem); } else if((pNMListView->uOldState & LVIS_FOCUSED) == 0 && (pNMListView->uNewState & LVIS_FOCUSED) == LVIS_FOCUSED) { sTemp.Format(_T("%d got focus"), pNMListView->iItem); } if((pNMListView->uOldState & LVIS_SELECTED) == LVIS_SELECTED && (pNMListView->uNewState & LVIS_SELECTED) == 0) { sTemp.Format(_T("%d losted selected"), pNMListView->iItem); } else if((pNMListView->uOldState & LVIS_SELECTED) == 0 && (pNMListView->uNewState & LVIS_SELECTED) == LVIS_SELECTED) { sTemp.Format(_T("%d got selected"), pNMListView->iItem); } if (!sTemp.IsEmpty()) { AfxMessageBox(sTemp); } *pResult = 0; }

  BOOL CListCtrlDlg::PreTranslateMessage(MSG* pMsg)
  {
    // Ctrl + A 全选
    if( (pMsg->hwnd == GetDlgItem(IDC_LIST_DEMO)->GetSafeHwnd()))
    {
      if(pMsg->message == WM_KEYDOWN)
      {
        switch (pMsg->wParam)
        {
        case 'A':
          if (::GetKeyState(VK_CONTROL) < 0)
          {
            for (int i=0;i < m_ctlListCtrl.GetItemCount();i++)
            {
              m_ctlListCtrl.SetItemState(i, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
            }
          }
          return TRUE;
        }
      }
    }
    return CDialog::PreTranslateMessage(pMsg);
  }

 

  5、编译运行

  

  参考:http://www.cppblog.com/finehai/archive/2009/09/17/96574.html

转载于:https://www.cnblogs.com/MakeView660/p/6840601.html

Grid++Report是一款C/S与B/S集成报表工具,功能全面易学易用。C/S开发适用于VB.NET,C#,VB,VC,Delphi,BCB,VFP,易语言等。B/S开发适用于ASP.NET,ASP,PHP,JSP等,支持所有WEB服务器。 Grid++Report6.0版主要新增功能 ★引擎方面 1、增加了一个自由表格部件,可以灵活定义各种自由表格,具有单元格合并功能。 2、部件框增加边距设置,边框增加内层与阴影,虚线边框。 3、文字显示增加段间距、首字缩进与两端分散对齐。 4、分组报表可以按某个统计值的大小对分组项进行排序 5、数据源除了OLE DB外,增加XML、JSON与普通文本数据。 6、在编程接口中增加了很多应用函数,如数据压缩、数字格式化、日期时间解析与格式化、打印机与纸型枚举、文件选择对话框等。 7、其它杂项功能,根据多年收集的用户需求来增加与改进功能,如分组相关系统变量、图像旋转显示等。 ★设计器: 1、设计面板具有缩放设计功能。 2、将关联属性归类为组,方便在设计时集中设置与查看。 3、对象浏览窗口与属性窗口可以隐藏,方便在设计很宽的报表时增大设计面板的区域。 4、设计面板大小跟随明细网格总列宽来改变宽度,方便设计大宽度明细网格报表。 5、部件框锁定功能,被锁定的部件框不允许进行可视化拖放。 6、自动在分组头尾中增加统计框,默认为合计函数,并设置相应的对齐列。 7、数据源连接串可以为 XML 或 JSON 数据源,且可以自动生成字段。设计报表时数据源可连接的类型有:各种数据库、XML或JSON文件、产生XML或JSON的网络URL、EXCEL文件、TEXT文件。 8、设计器增加数据提供事件接口,在设计报表时可以用给报表加载自定义数据源。 ★打印与打印预览: 1、横向分页时,在数据不多的情况下,分页直接显示在本页,而不是在下一页。 2、在模板中可以保存默认打印机名称。 3、分组尾支持每页重复打印。 4、如果部件框跨页多次显示了,在新页中再次输出其上下边框。 5、提供编程接口枚举出Windows系统中安装的打印机,以及指定打印机支持的所有纸张类型。 ★查询显示: 1、没有明细网格的报表,背景图可以显示出来。 2、明细数据不多时,表格不会显示下部空白。 ★数据导出: 1、在导出Excel时,能用代码设置页边距等参数 2、在运行时对外观属性的改变可以反映到Excel导出。 ★图表: 1、重新设计图表接口,让图表可视化设计与编程控制更清晰简单。 2、支持更多图表类型,如百分比柱状图、垂直排列的柱图。 3、一个图表中可以混和显示多种不同类型的图形,如一个序列为柱图,另一个序列为曲线图。 4、Y轴可以显示双坐标轴,方便实现双轴柱状图等。 5、图例可以在下方显示,可以多栏显示。 6、增加图表数据记录集,图表数据直接从记录集或XML数据源加载,而不需用代码来加载图表数据。 7、图表方面还有很多细节方面的改进与增强,加强图表功能是本新版本的重要方面。 ★交叉表 1、多数据列交叉表可以将同一列产生的交叉列排列在一起。 2、在合计列中可以排除掉一些列不进行合计。 3、纵向交叉项目列中可以定义统计框或综合文字框表达式,在合计列中关联的字段自动求和,在项目列中关联字段为复制首笔值。 ★子报表: 1、子报表无数据可以自动隐藏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值