只是一些简单的使用技巧整理
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查看