1.参考gh0st的列表中的列名:
0 IP 1 所在区域 2 计算机名/备注 3 操作系统 4 CPU 5 摄像头 6 Ping
2.上一节我们为列表控件添加变量,我们来查看变量的类型:
CListCtrl 类 查看MSDN 找到int InsertColumn(
int nCol, //列的顺序
LPCTSTR lpszColumnHeading, //列的名字
int nFormat = LVCFMT_LEFT, //列对齐的方式 LVCFMT_LEFT, LVCFMT_RIGHT,LVCFMT_CENTER
int nWidth = -1, //列的宽度
int nSubItem = -1 //与之联系的子条目 默认为-1 我们不用写
);
3.有了这些我们可以现在就写入代码了,但请等一下我们来考虑一下以后的扩展问题,假如我们要加入新的列那会不会很麻烦,我们每一个列都写入了固定的顺序(0--6)没有考虑扩展,比如在CPU列的后面加入显示内存大小,那么加入的就是第5列,而第5列恰好是摄头,这样显示的数据就会混乱,解决这个问题的方式就是用枚举enum 写入列的顺序时不写入硬编码(0----6)而是写入枚举成员这样我们只需很小的改动就能达到目的。
4.因为这个列表比较重要所以要放到一个每一个文件都能访问到的文件很自然的就是stdafx.h
enum
{
ONLINELIST_IP=0, //IP的列顺序
ONLINELIST_ADDR, //地址
ONLINELIST_COMPUTER_NAME, //计算机名/备注
ONLINELIST_OS, //操作系统
ONLINELIST_CPU, //CPU
ONLINELIST_VIDEO, //摄像头
ONLINELIST_PING //PING
};
5.处理列表的代码应该统一放在一处,添加列表处理的代码InitList(),在主界面对话框中增加函数(如图),右键单击--》添加-------》添加函数,函数名为InitList。
6.写入加入列表列名的代码:
列表的名字与列表的宽度是同一一对应的关系,以后为了以后修改方便建立这样的一个结构体:
typedef struct
{
char *title; //列表的名称
int nWidth; //列表的宽度
}COLUMNSTRUCT;
COLUMNSTRUCT g_Column_Data[] =
{
{ "IP", 148 },
{ "区域", 150 },
{ "计算机名/备注", 160 },
{ "操作系统", 128 },
{ "CPU", 80 },
{ "摄像头", 81 },
{ "PING", 81 }
};
添加全局变量int g_Column_Count=7; //列表的个数
7.在initList中写入加入列表列名称的代码并解释:
for (int i = 0; i < g_Column_Count; i++)
{
m_CList_Online.InsertColumn(i, g_Column_Data[i].title,g_Column_Data[i].nWidth);
}
8在Oninitdlg中写入InitList(),
9.改变列表控件的属性 ICon 改为Report。
10.同样的方法改动日志消息的列表控件看操作
int g_Column_Count_Online=3; //列表的个数
COLUMNSTRUCT g_Column_Data_Message[] =
{
{"信息类型", 68 },
{"时间", 100 },
{"信息内容", 660 }
};
在initList中写入加入列表列名称的代码并解释:
for (int i = 0; i < g_Column_Count_Message; i++)
{
m_CList_Message.InsertColumn(i, g_Column_Data_Message[i].title,LVCFMT_CENTER,g_Column_Data_Message[i].nWidth);
}
11.改变列表控件的属性 ICon 改为Report。
本节完成后,运行后如下图: