MFC学习笔记之:ListCtrl控件使用详解

1、            ListCtrl添加左键单击(NM_CLICK)函数(这个很重要)

2、            ListCtrl风格设置(一般是网格)

一般listctrl默认view风格为report,一般在OnInitDialog函数中:

              LONG m_lStyle;

          m_lStyle = GetWindowLong( m_list.m_hWnd , GWL_STYLE);//获取当前窗口style

          m_lStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl

          m_lStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl

         //m_lStyle |= LVS_SHOWSELALWAYS;//一直选中item

     m_list.SetExtendedStyle( m_lStyle );//设置扩展风格

3、            插入数据

一般在OnInitDialog函数中:

//m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );

          //插入列

          m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );

          int nRow = m_list.InsertItem(0, "11");//插入行

          m_list.InsertItem(1,"12");

          m_list.SetItemText(nRow, 1, "jacky");//设置数据

     m_list.SetItemText(nRow+1, 1, "James");

4、            得到listctrl中所有行的checkbox的状态

OnNMClickList1函数中:

方法一:

              m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);

          CString str;

          for(int i=0; i<m_list.GetItemCount(); i++)

          {

              if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))

              {

                   str.Format(_T("%d行的checkbox为选中状态"), i+1);

                   AfxMessageBox(str);

              }

}

方法二:

               POSITION pos = m_list.GetFirstSelectedItemPosition();

              CString str;

              if (pos == NULL)

              TRACE0("No items were selected!/n");

              else

              {

                   while (pos)

                   {

                       int nItem = m_list.GetNextSelectedItem(pos);

                       str.Format(_T("选中了第%d"), nItem+1);

                       AfxMessageBox(str);

                   }

     }

5、            删除所有列(即清空)

while ( m_list.DeleteColumn (0))

6、            得到单击的listctrl的行列号

     // 方法一:

     DWORD dwPos = GetMessagePos(); //返回表示屏幕坐标下光标位置的长整数值

     CPoint point( LOWORD(dwPos), HIWORD(dwPos) );

     m_list.ScreenToClient(&point); //把屏幕上指定点的屏幕坐标转换成用户坐标

     LVHITTESTINFO lvinfo;

     lvinfo.pt = point;

     lvinfo.flags = LVHT_ABOVE;

     int nItem = m_list.SubItemHitTest(&lvinfo);

     if(nItem != -1)

     {

         CString strtemp;

         strtemp.Format("单击的是第%d行第%d", lvinfo.iItem, lvinfo.iSubItem);

         AfxMessageBox(strtemp);

     }

     // 方法二:

     NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

     if(pNMListView->iItem != -1)

     {

         CString strtemp;

         strtemp.Format("单击的是第%d行第%d", pNMListView->iItem, pNMListView->iSubItem);

         AfxMessageBox(strtemp);

     }

7、            右键点击listctrlitem弹出菜单

在资源里画菜单

添加listctrl控件的NM_RCLICK消息相应函数

//右键单击的函数

void CListCtrlDlg::OnNMRclickList1(NMHDR *pNMHDR, LRESULT *pResult)

{

     NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

     if(pNMListView->iItem != -1)

     {

         DWORD dwPos = GetMessagePos(); //返回表示屏幕坐标下光标位置的长整数值

         CPoint point( LOWORD(dwPos), HIWORD(dwPos) );

         CMenu menu;

         VERIFY( menu.LoadMenu( IDR_MENU1 ) );

         CMenu* popup = menu.GetSubMenu(0); //取得被指定菜单激活的下拉式菜单或子菜单的句柄

         ASSERT( popup != NULL );

         popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x, point.y, this ); //在指定位置显示快捷菜单,并跟踪菜单项的选择

     }

     *pResult = 0;

}

你可能感兴趣的:(MFC学习笔记)