● 补充小知识:枚举类型的使用
每个控件(比如列表)都对应一个自己的唯一的变量
使用枚举类型可以将变量名与编号进行绑定,以后程序需要扩展的时候,只需要在定义枚举变量的位置重新修改编号就可以了,这样全局的所有变量的编号就都跟着修改了
由于列表这个数据结构在本项目中十分重要,所有需要放在一个每一个文件都能访问到的文件当中,比如"pcb.h"
示例1:默认是0 1 2 3 4 5这样和数组一样递增的
enum Day {Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
};int main() {// 使用枚举类型Day today = Wednesday;// 输出枚举常量的值std::cout << "Today is: " << today << std::endl;return 0;
}
示例2:也可以是乱序使用的
enum Color {Red = 1,Green = 2,Blue = 6
};
6、为列表控件添加条目
写代码的时候找不到对话框,如何转到资源视图?
为列表控件添加初始化函数,如果代码都写在OnInitDlg()函数里面,显得太过于臃肿了,于是我们考虑在CPCRemoteDlg类里面添加一个成员函数initList()用来初始化列表
在initList()函数中实现为列表添加条目
// 初始化对话框中的列表
int CPCRemoteDlg::initList()
{// TODO: 在此处添加实现代码.//为Online_List添加条目for (int i = 0; i < ONLINELIST_LEN; i++) {m_CList_Online.InsertColumn(i, g_Column_Data_Onlie[i].title, LVCFMT_CENTER, g_Column_Data_Onlie[i].nWidth);}//为MessageList添加条目for (int i = 0; i < MESSAGELIST_LEN; i++) {m_CList_Message.InsertColumn(i, g_Column_Data_Message[i].title, LVCFMT_CENTER, g_Column_Data_Message[i].nWidth);}return 0;
}
数据结构的定义:
2个枚举类型的列表定义在"pcb.h"文件当中:
enum
{ONLINELIST_IP = 0, //IP的列顺序ONLINELIST_ADDR, //地址ONLINELIST_COMPUTER_NAME, //计算机名/备注ONLINELIST_OS, //操作系统ONLINELIST_CPU, //CPUONLINELIST_VIDEO, //摄像头ONLINELIST_PING, //PINGONLINELIST_LEN //OnlineList的总长度
};enum
{MESSAGELIST_TYPE, //信息类型MESSAGELIST_TIME, //时间MESSAGELIST_INFO, //信息MESSAGELIST_LEN //MessageList的总长度
};
列表项定义在PCRemoteDlg.cpp文件当中:
typedef struct
{char* title; //列表的名称int nWidth; //列表的宽度
}COLUMNSTRUCT;COLUMNSTRUCT g_Column_Data_Onlie[] =
{{"IP", 148 },{"区域", 150 },{"计算机名/备注", 160 },{"操作系统", 128 },{"CPU", 80 },{"摄像头", 81 },{"PING", 81 }
};COLUMNSTRUCT g_Column_Data_Message[] =
{{"信息类型", 148 },{"时间", 100 },{"信息内容", 660 }
};
此时运行项目还是显示不出来条目,我们需要将2个列表的属性》视图:ICon 改为 Report:
然后运行起来就OK了:
注意:不要忘记在CPCRemoteDlg的initDlg函数里面调用😂😂😂
结果报C005错误
经排查是因为m_CList_Online错误地写成了m_CList_Message导致数组越界引发报错
修改为:
//为Online_List添加条目for (int i = 0; i < ONLINELIST_LEN; i++) {m_CList_Online.InsertColumn(i, g_Column_Data_Message[i].title, LVCFMT_CENTER, g_Column_Data_Message[i].nWidth);}
最终运行结果截图: