MFC高级控件的使用

列表控件

  1. 初始化

    设置窗口风格
    image

  2. 消息

    NM_CLICK 左键单击

    NM_DBCLICK 右键单击

    NM_RCLICK 右键单击

    NM_RDBCLICK 右键双击

    NM_RETURN 回车

  3. 操作函数

函数 说明
InsertColumn 插入一列
DeleteColumn 删除一列
InsertItem 插入一行
DeleteItem 删除一行
GetItemText 获取一个单元格得到文本
SetItemText 设置一个单元格的文本
GetItemData 获取单元格中的值
SetItemData 用int型数据设置单元格文本
GetItemCount 获取行数

添加一个类类型为CListCtrl的变量m_List

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//初始化列表控件的风格
m_List.SetExtendedStyle(
LVS_EX_FULLROWSELECT | /*整行选中*/
LVS_EX_GRIDLINES | /*网格*/
LVS_EX_CHECKBOXES /*节点的复选框*/
);
//插入列
m_List.InsertColumn(0,/*列号*/
L"姓名", /*列标题*/
0, /*对齐风格(第0列不能设置)*/
100/*列宽度*/
);
m_List.InsertColumn(1, L"性别", 0, 100);
m_List.InsertColumn(2, L"年龄", 0, 100);
//插入节点(只能设置第0列的文本)
m_List.InsertItem(0, L"小明");
m_List.SetItemText(0, 1, L"男");
m_List.SetItemText(0, 2, L"18");
//不在控件中显示
m_List.SetItemData(0, (DWORD_PTR)L"看不见我");

获取被点击的节点内容

类向导添加一个NM_CLICK的虚函数

1
2
3
4
5
6
7
8
9
10
CPoint pos;
GetCursorPos(&pos);
//通过变量调用ScreenToClient函数
m_List.ScreenToClient(&pos);
int nIndex = m_List.HitTest(pos);
if (nIndex != -1) {
CString buff = NULL;
buff = m_List.GetItemText(nIndex, 0);
MessageBox(buff);
}

获得节点的附加数据(SetItemData设置的值)

1
2
3
4
5
6
7
CPoint pos;
GetCursorPos(&pos);
m_List.ScreenToClient(&pos);
int nIndex = m_List.HitTest(pos);
CString buff;
buff.Format(L"%s", m_List.GetItemData(nIndex));
MessageBox(buff);

树控件

  1. 初始化(属性Has Button和Has Line)

  2. 消息(同列表控件)

  3. 函数

InsertItem 插入一项
DeleteAllItems 删除所有项
DeleteItem 删除某一项
SelectItem 选择某一项
GetItemText 获取某个节点的文本
GetNextSiblingItem 获取下个兄弟节点
GeiPrevSiblingItem 获取上个兄弟节点
GetParentItem 获取父节点
GetRootItem 获取根节点
GetSelectedItem 获取被选择的项

添加一个CTreeCtrl类型的变量m_Tree

1
2
3
4
5
6
7
8
9
10
11
12
//初始化
HTREEITEM hItem;
hItem = m_Tree.InsertItem(
L"根节点",/*节点文本*/
TVI_ROOT,/*父节点*/
TVI_LAST/*兄弟节点的位置*/
);
m_Tree.InsertItem(
L"子节点",
hItem,/*父节点*/
TVI_LAST
);

点击事件

1
2
3
4
5
6
7
8
CPoint pos;
GetCursorPos(&pos);
m_Tree.ScreenToClient(&pos);
HTREEITEM hItem = m_Tree.HitTest(pos);
if (hItem != NULL) {
CString buff = m_Tree.GetItemText(hItem);
MessageBox(buff);
}

选项卡控件

  1. 继承CTabCtrl类添加一个自己的新类CMyTabCtrl(类向导)
  2. 添加成员函数AddTab参数为title和pSubWnd
  3. 添加成员变量std::vector<CWnd*> m_SubWnd接收窗口
1
2
3
4
5
6
7
8
9
10
11
12
void CMyTabCtrl::AddTab(const CString & title, CWnd * pSubWnd)
{
//添加选项卡控件的标题栏
InsertItem(m_SubWnd.size(), title);
m_SubWnd.push_back(pSubWnd);
pSubWnd->SetParent(this);
//使子窗口大小适应客户区
CRect rc;
GetClientRect(rc);
rc.DeflateRect(1, 22, 3, 2);
pSubWnd->MoveWindow(rc);
}

在Dlg类中创建一个CMyTabCtrl类型的变量

创建子对话框,修改Style和Border,添加类CMyDialog

1
2
3
4
5
6
//Dlg类中的Init
CMyDialog* pMyDlg = new CMyDialog;
pMyDlg->Create(IDD_DIALOG1);
m_TabCtrl.AddTab(L"第一页", pMyDlg);

m_TabCtrl.m_SubWnd[0]->ShowWindow(SW_SHOW);

处理CMyTabCtrl类的=TCN_SELCHANGE消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void CMyTabCtrl::OnTcnSelchanging(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;

CRect rc;
GetClientRect(rc);
rc.DeflateRect(1, 22, 3, 2);
for (auto& wnd : m_SubWnd) {
wnd->MoveWindow(rc);
wnd->ShowWindow(SW_HIDE);
}
m_SubWnd[this->GetCurSel()]->ShowWindow(SW_SHOW);
}

封装CLIstCtrl控件

添加一个ListCtrl控件,修改属性View为Report

继承CListCtrl添加一个新类CMyListCtrl(类向导)

在CMyListCtrl类中添加两个成员变参函数

1
2
void InsertColumn(int nCount, ...);
void InsertItem(int nCount, const char* format, ...);
1
2
3
4
5
6
7
8
9
10
void CMyListCtrl::InsertColumn(int nCount, ...)
{
va_list vl;
va_start(vl, nCount);
for (int i = 0; i < nCount; i++) {
TCHAR* pArg = va_arg(vl, TCHAR*);
CListCtrl::InsertColumn(i, pArg, 0, 100);
}
va_end(vl);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//不完全
void CMyListCtrl::InsertItem(int nCount, const char * format, ...)
{
va_list vl;
va_start(vl, format);
char buff[100];
vsprintf_s(buff, format, vl);
while (*format != '\0') {
if (*format == '%') {
switch (*(format + 1))
{
case 'd':
{
int n = va_arg(vl, int);
CString buff;
buff.Format(L"%d", n);
CListCtrl::InsertItem(nCount, buff);
}
break;
case 's':
{
char* v = va_arg(vl, char*);
CString buff;
buff.Format(L"%s", v);
CListCtrl::InsertItem(nCount, buff);
}
break;
//以下省略
}
}
++format;
}
va_end(vl);
}

声明一个类类型为CMyListCtrl类型的成员变量m_MyListCtrl

在Dlg的Init中

1
2
m_ListCtrl.InsertColumn(3, L"姓名", L"性别", L"年龄");
m_ListCtrl.InsertItem(0, "%s", L"小明");