关于CListCtrl 实际项目中的一些简单使用

来源:互联网 发布:仿优酷php视频网站源码 编辑:程序博客网 时间:2024/06/17 12:28

只是一些简单的使用技巧整理

1.CListCtrl初始化

CListCtrl m_List;

 LONG lStyle;
 lStyle = GetWindowLong(m_List.m_hWnd, GWL_STYLE);//获取当前窗口style

 lStyle |= LVS_REPORT; //报表风格

//LVS_EX_GRIDLINES 只能选中一行

 SetWindowLong(m_List.m_hWnd, GWL_STYLE, lStyle);//设置风格
 DWORD dwStyle = m_List.GetExtendedStyle();
 dwStyle |= LVS_EX_FULLROWSELECT;//设置高亮扩展风格

 dwStyle |= LVS_EX_GRIDLINES;//网格风格
 dwStyle |= LVS_EX_CHECKBOXES;//checkbox风格
 m_List.SetExtendedStyle(dwStyle); //设置

 m_List.InsertColumn(1,"CustomerID",LVCFMT_LEFT,80);//设置列的标题

 m_List.InsertItem(0,"Item3");//设置行标题

 m_List.SetItemText( 0, 1, "---" );//设置子项目具体内容

2.获得指定的行号列号

3种方法:

①在OnClickList等消息中

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

m_nRow = pNMListView->iItem;//点击的行号

m_nCol = pNMListView->iSubItem;//点击的列号

②int n = m_List.GetSelectionMark;//获得行号

③ m_Pos = m_List.GetFirstSelectedItemPosition();
  m_nRow = m_List.GetNextSelectedItem(m_Pos);

这3种方法主要不同就是第3种只能获得选中的行号 对checkbox无响应

3.子项目可编辑

例如双击项目可编辑项目的内容

原理就是创建一个编辑框 双击项目的时候将编辑框覆盖子项目 然后当编辑框失去焦点时,将编辑框的内容更新到CListCtrl中

在双击消息中

CEdit m_Edit;

CRect rc;  

m_List.GetSubItemRect(pNMListView->iItem, pNMListView->iSubItem,

LVIR_LABEL ,rc);//获取子项目矩形的大小

   m_Edit.SetParent(&m_List);
   m_List.GetItemText(pNMListView->iItem, pNMListView->iSubItem,ch,128);//获得项目中的内容

   m_Edit.SetWindowText(ch);//将内容显示到编辑框

   m_Edit.ShowWindow(SW_SHOW);//显示编辑框

  m_Edit.SetRect(&rc); //设置编辑框大小
   m_Edit.MoveWindow(&rc);//移动编辑框
  m_Edit.SetFocus();//设置焦点

  m_Edit.CreateSolidCaret(1,rc.Height()-2);//创建光标

   m_Edit.ShowCaret();//显示光标

    m_Edit.SetSel(-1);//使光标移到最后

在OnkillFocus中

 CString str;
 m_Edit.GetWindowText(str);//获得内容

 m_List.SetItemText(m_nRow,m_nCol,str);//更新到项目中

 m_Edit.ShowWindow(SW_HIDE);//隐藏编辑框

这么做有一个缺点就是编辑框和项目位置有偏移,具体原因不是特别清楚 不过手动编辑编辑一下CRect就行了

项目中的按钮 ip编辑都是同样原理

4.点击上下按钮移动子项目

这个是向上的

     // 假如有1行有4个 获取原来的内容
  CString str1, str2, str3,str4;
  str1 = m_List.GetItemText(m_nRow, 0);
  str2 = m_List.GetItemText(m_nRow, 1);
  str3 = m_List.GetItemText(m_nRow, 2);
  str4 = m_List.GetItemText(m_nRow, 3);
  // 删除选中行

  m_List.DeleteItem(m_nRow);
 
  // 将内容插入到上一行上面 

  tempItem = m_List.InsertItem(m_nRow-1, _T(str1));
  m_List.SetItemText(tempItem, 1, _T(str2));
  m_List.SetItemText(tempItem, 2, _T(str3));
  m_List.SetItemText(tempItem, 3, _T(str4));
  m_nRow--; 
  //使项目高亮

  UINT flag = LVIS_SELECTED|LVIS_FOCUSED;
  m_List.SetItemState(m_nRow,flag,flag);

向下移动原理相同 不过需要修改两处位置信息

4.右键项目弹出菜单

在OnContextMenu中

CMenu menu;
   menu.LoadMenu (IDR_MENU1);//加载菜单资源
   CMenu* pContextMenu = menu.GetSubMenu (0);
   pContextMenu->EnableMenuItem(ID_DELETE,

MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);设置菜单 不可用 变灰
  pContextMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON |
            TPM_RIGHTBUTTON, point.x, point.y, AfxGetMainWnd ());//弹出菜单

判断是否点击到checkbox上

 CPoint checkPoint = point;
 m_List.ScreenToClient(&checkPoint); 
 UINT nFlag;
 int nItem=m_List.HitTest(checkPoint, &nFlag);
  if(nFlag==LVHT_ONITEMSTATEICON)
 {
  bClicked = TRUE;
 }

获得标题行的位置

 CHeaderCtrl* pHead =m_List.GetHeaderCtrl();
 CRect rectHeader;
 pHead->GetWindowRect(&rectHeader);

5.在对话框中响应ClistCtrl滚动条消息

 在ClistCtrl的OnH/VScroll中

 ::SendMessage(GetParent()->m_hWnd, WM_H/VSCROLL,nSBCode, NULL);

然后在对话框中响应相应的函数就行了

 6.OnItemChanged

切换选中项需要调用3次该函数。可以在pNmListView中的uNewState查看

原创粉丝点击