界面变化:
添加一个group box
Windows 窗体 GroupBox 控件用于为其他控件提供可识别的分组。 通常,可使用分组框按功能细分窗体。
在groupbox 里面添加了tree control,list control、一个按钮(获取文件信息)
list control
属性:改为小图标
完善了网络通信:
封装了一个SendCommandPacket(int nCmd, BYTE* pData, size_t nLength)接口
int CRemoteClientDlg::SendCommandPacket(int nCmd, BYTE* pData, size_t nLength) { // 把控件的值赋给成员变量 UpdateData(); CClientSocket* pClient = CClientSocket::getInstance(); bool ret = pClient->InitSocket(m_server_address, atoi((LPCTSTR)m_server_port)); if (!ret) { AfxMessageBox("网络初始化失败"); return -1; } CPacket packet(nCmd, pData, nLength); pClient->Send(packet); int cmd = pClient->DealCommand(); TRACE("ack:%d\r\n", cmd); pClient->CloseSocket(); return cmd; }
获取驱动信息功能实现
InsertItem函数:
hParent:父项的句柄。
如果这个成员的值是TVI_ROOT或NULL,这项将被作为树形控件的根插入。 hInsertAfter:插入的新项之后的项的句柄。或是下列值之一: TVI_FIRST: 在列表的开始插入项 TVI_LAST: 在列表的最后插入项 TVI_ROOT: 作为一个根项添加 TVI_SORT: 以字母顺序插入项
void CRemoteClientDlg::OnBnClickedButFileinfo() { // 发送命令并返回第一个packet // 如果由后续数据需要调用DealCommand来获取(这时recv函数不会阻塞,可以直接从缓冲区里面解析packet,解析一个就返回),可以循环调用 int ret = SendCommandPacket(1); if (ret == -1) { AfxMessageBox(_T("命令处理失败")); return; } // 防止反复点击按钮,如果之前的数据不删除,就会越来越多 m_tree.DeleteAllItems(); CClientSocket* pclient = CClientSocket::getInstance(); std::string drivers = pclient->GetPacket().strData; std::string tmp; for (int i = 0; i < drivers.size(); i++) { if (drivers[i] != ',' && drivers[i] != ' ') { tmp = drivers[i]; tmp += ":"; // 加到根目录下,以追加的方式添加 // InsertItem 在树视图控件中插入新项 m_tree.InsertItem(tmp.c_str(), TVI_ROOT, TVI_LAST); } } }