zoukankan      html  css  js  c++  java
  • VC编程技术点滴(六)使用ListControl控件显示数据表

    一、在Windows应用程序中添加ListControl控件的几种方法

        1、在对话框中添加控件

        创建对话框应用程序,在资源视图中添加对话框。如下图所示,在控件工具条中选择ListControl控件添加到对话框中,并调整控件尺寸。在 ListControl控件的属性页中设置控件样式(Styles)和扩展样式等。为了显示详细数据信息,可以设置控件的显示风格为报表视图 (Report)。

    VC编程技术点滴(六)使用ListControl控件显示数据表

        为了在对话框中使用控件,需要在ClassWizard中为对话框类添加控件成员变量,如下图所示:

     VC编程技术点滴(六)使用ListControl控件显示数据表

        执行以上操作后,系统自动添加了一个ClistControl对象,并与ListControl控件资源关联,相关代码如下:

        // ListDialogDlg.h : header file

        ......

        public:

           CListCtrl m_cListCtrl;

        ......

        // ListDialogDlg.cpp : implementation file

        ......

        void CListDialogDlg::DoDataExchange(CDataExchange* pDX)
        {
           CDialog::DoDataExchange(pDX);
           //{{AFX_DATA_MAP(CListDialogDlg)
           DDX_Control(pDX, IDC_LIST_CTRL, m_cListCtrl);
           //}}AFX_DATA_MAP
        }

        ......

        因为本例只为演示在对话框中添加ListControl控件,所以只在对话框初始化消息函数中添加了以下显示控件的示例代码(代码含义请参照MSDN文献):

        BOOL CListDialogDlg::OnInitDialog()
        {
           CDialog::OnInitDialog();

           ......

           // TODO: Add extra initialization here
           DWORD exstyle = m_cListCtrl.GetExtendedStyle();
           m_cListCtrl.SetExtendedStyle(exstyle | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES |

               LVS_EX_CHECKBOXES | WS_EX_STATICEDGE );

           CRect rect;
           m_cListCtrl.GetClientRect(&rect);
           int nColInterval = rect.Width()/5;

           m_cListCtrl.InsertColumn(0, _T("Item Name"), LVCFMT_LEFT, nColInterval*3);
           m_cListCtrl.InsertColumn(1, _T("Value"), LVCFMT_LEFT, nColInterval);
           m_cListCtrl.InsertColumn(2, _T("Time"), LVCFMT_LEFT, rect.Width()-4*nColInterval);

           m_cListCtrl.InsertItem(0,"name");
           m_cListCtrl.SetItemText(0,1,"value");
           m_cListCtrl.SetItemText(0,2,"time");

           ......
     
           return TRUE;  // return TRUE  unless you set the focus to a control

        }

        2、在单文档视图中自行添加ListControl控件

        创建单文档应用程序,如下图所示为视图类添加CListCtrl对象成员变量:

    VC编程技术点滴(六)使用ListControl控件显示数据表

        如下图所示,在资源视图中打开String Table资源,在右键菜单中选择new string,为将要创建的ListControl控件添加资源编号:

    VC编程技术点滴(六)使用ListControl控件显示数据表

        为创建和显示控件,在视图的初始化消息函数中添加如下代码:

        void CAddListView::OnInitialUpdate()
        {
           CView::OnInitialUpdate(); 
           // TODO: Add your specialized code here and/or call the base class
           m_cListCtrl.Create( LVS_REPORT,CRect(0,0,800,600),this,IDC_LISTCTRL);
           m_cListCtrl.ModifyStyle(0,LVS_REPORT|LVS_SHOWSELALWAYS|LVS_SORTASCENDING);
           //m_cListCtrl.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE,0,

              LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES);
           m_cListCtrl.ShowWindow(SW_SHOW);

           CRect rect;
           m_cListCtrl.GetClientRect(&rect);
           int nColInterval = rect.Width()/5;

           m_cListCtrl.InsertColumn(0, _T("Item Name"), LVCFMT_LEFT, nColInterval*3);
           m_cListCtrl.InsertColumn(1, _T("Value"), LVCFMT_LEFT, nColInterval);
           m_cListCtrl.InsertColumn(2, _T("Time"), LVCFMT_LEFT, rect.Width()-4*nColInterval);

           m_cListCtrl.InsertItem(0,"name");
           m_cListCtrl.SetItemText(0,1,"value");
           m_cListCtrl.SetItemText(0,2,"time");
        }

        3、在ListView视图中显示ListControl控件

        创建单文档应用程序,如下图所示,在选择窗口视图类型时,选择CListView视图:

    VC编程技术点滴(六)使用ListControl控件显示数据表
     

        在视图类的初始化消息函数中添加如下显示控件的代码:

        void CTestlistView::OnInitialUpdate()
        {
            CListView::OnInitialUpdate();
            CDC* dc = GetDC();
            TEXTMETRIC tm;
            dc->GetTextMetrics(&tm);
            GetListCtrl().ModifyStyle(0,LVS_REPORT|LVS_SHOWSELALWAYS|LVS_SORTASCENDING);
            GetListCtrl().SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE,0,

                 LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES|LVS_EX_TRACKSELECT);
            GetListCtrl().InsertColumn(0,"Name",LVCFMT_LEFT,30*tm.tmAveCharWidth,0);
            GetListCtrl().InsertColumn(1,"Comment",LVCFMT_LEFT,70*tm.tmAveCharWidth,1);

            // TODO: You may populate your ListView with items by directly accessing
            //  its list control through a call to GetListCtrl().
        }

    二、为ListControl控件添加消息处理函数

        1、关于ListControl控件消息

        在ListControl控件中有以下消息(通知)可以发送:NM_CLICK、NM_DBLCLK、NM_RCLICK、LVN_COLUMNCLICK、HDN_ITEMCLICK等。

        其中HDN_ITEMCLICK是List Control的子控件ListCtrl发给它的Parent(CListCtrl)的;LVN_COLUMNCLICK是HeaderCtrl发给它的 Parent的。所以在Dialog里面,试图通过ClassWizard产生的ON_NOTIFY 宏:ON_NOTIFY(HDN_ITEMCLICK, IDC_LIST_CTRL,OnItemClick),来接收HDN_ITEMCLICK消息是无法成功的。要解决这个问题,可以从CListCtrl 派生一个新的类,并在CListCtrl派生类中处理HDN_ITEMCLICK消息。注意消息映射的时候,Header的控件ID是0,类似如下消息映 射宏代码:
        ON_NOTIFY(HDN_ITEMCLICK, 0, OnItemClick)
        另外,可以使用NM_CLICK、NM_RCLICK等消息,以NM打头的消息是可以在Dialog里处理的。

        2、关于ListControl控件的行选择

        要在控件中选择行,需要设置控件的扩展属性LVS_EX_FULLROWSELECT。右键或左键都可以选择行,而且,List Control控件默认可以一次选择(使用Ctrl键)多行,被选择的行默认以蓝色背景显示。

        3、为ListControl控件添加NM_CLICK消息

        以前面创建的对话框应用程序为例,在ClassWizard中选择List Control控件,在对话框类中添加NM_CLICK消息处理函数。如下图所示:

    VC编程技术点滴(六)使用ListControl控件显示数据表

        系统自动添加的消息映射与消息处理函数代码如下:

        // ListDialogDlg.h : header file

        protected:

           ......

           afx_msg void OnClickListCtrl(NMHDR* pNMHDR, LRESULT* pResult);

        ......

        // ListDialogDlg.cpp : implementation file

        BEGIN_MESSAGE_MAP(CListDialogDlg, CDialog)
            //{{AFX_MSG_MAP(CListDialogDlg)

            ......
            ON_NOTIFY(NM_CLICK, IDC_LIST_CTRL, OnClickListCtrl)
            //}}AFX_MSG_MAP
        END_MESSAGE_MAP()

        void CListDialogDlg::OnClickListCtrl(NMHDR* pNMHDR, LRESULT* pResult)
        {
           // TODO: Add your control notification handler code here
            NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
           CString str;
           str.Format(_T("Item index: %d,SubItem:%d"), pNMListView->iItem,

                pNMListView->iSubItem);
           MessageBox(str);
           *pResult = 0;
        }

        其中黑体部分代码为自行添加的测试代码,主要为了获取选择的行编号与列编号,有了行编号和就可以使用m_cListCtrl.GetItemText(选 择的行编号,某一列的列编号)获取某行某字段的值(如数据库表表示字段的值),可以定义一个对话框类成员变量存储该值,用于菜单或按钮命令,如修改记录、 显示备注型(或图片型)字段内容、删除记录等。

        4、添加NM_RCLICK消息和右键菜单

        与NM_CLICK类似,添加NM_RCLICK消息处理函数。如下图所示创建菜单资源:

    VC编程技术点滴(六)使用ListControl控件显示数据表

        在NM_RCLICK消息处理函数中添加如下显示右键菜单的代码:

        void CListDialogDlg::OnRclickListCtrl(NMHDR* pNMHDR, LRESULT* pResult)
        {
           // TODO: Add your control notification handler code here
           //CPoint point;
           //::GetCursorPos(&point);//::可以提示全局函数和当前类成员函数
            DWORD dwPos = GetMessagePos();
           CPoint point( LOWORD(dwPos), HIWORD(dwPos) );   
           CMenu menu;
           VERIFY( menu.LoadMenu( IDR_MENU1 ) );
           //IDR_MENU1是新建菜单ID
           CMenu* popup = menu.GetSubMenu(0);
           //ASSERT( popup != NULL );
           popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,

                 this );//TPM_RIGHTBUTTON使右键点击菜单也起作用   

           *pResult = 0;
        }

        在ClassWizard中为菜单项ID_DELETE添加删除命令消息处理函数。以下是测试代码:

        void CListDialogDlg::OnDelete()
        {
           // TODO: Add your command handler code here
           int iItemSel = m_cListCtrl.GetNextItem(-1, LVIS_SELECTED);
           CString str="";
           while(iItemSel != -1)
           {
              //m_cListCtrl.DeleteItem(iItemSel);//delete selected item in the list control
              str=str+m_cListCtrl.GetItemText(iItemSel,0);//利用该方法可以获取数据记录编号列
              iItemSel = m_cListCtrl.GetNextItem(iItemSel, LVIS_SELECTED);        
          
           MessageBox(str);
        }

        代码中的循环是为了处理同时选择了多行的情况。可以在代码中添加根据选择的行编号iItemSel获得数据记录编号的代码,在控件中删除行的同时,删除数据库表中的相应记录。

     

     

       

    参考文献

    关于CListCtrl的Header Notify消息

         http://blog.donews.com/coogle/archive/2006/09/26/1047266.aspx 

    Tutorial 31: Listview Control  http://www.chinaitpower.com/A/2001-12-08/7225.html 

    Using the List Control  http://www.codeproject.com/KB/list/listctrldemo.aspx

    教材:《Visual C++MFC编程实例》 

  • 相关阅读:
    信息检索重点句子分析部分
    信息检索重点关键字
    信息检索问答部分
    信息检索重点句子分析部分
    信息检索重点句子分析部分
    信息检索重点句子分析部分
    信息检索问答部分
    信息检索问答部分
    信息检索问答部分
    2007年中国羽毛球大师赛直播时间表
  • 原文地址:https://www.cnblogs.com/luoshupeng/p/2146178.html
Copyright © 2011-2022 走看看