【LoadFileInfo()加载文件信息并将其显示在一个树控件和列表控件中】

LoadFileInfo() 加载文件信息 并将其显示在一个树控件和列表控件中

这段代码是一个C++的MFC程序,用于加载文件信息并将其显示在一个树控件和列表控件中。以下是详细解释:

void CRemoteClientDlg::LoadFileInfo()

这个函数是 CRemoteClientDlg 类的一个成员函数,用于加载文件信息并显示在对话框中的控件里。

CPoint ptMouse;
GetCursorPos(&ptMouse);
m_Tree.ScreenToClient(&ptMouse);
  • CPoint ptMouse;:定义一个 CPoint 对象,用于存储鼠标的当前位置。
  • GetCursorPos(&ptMouse);:获取当前鼠标的屏幕坐标位置。
  • m_Tree.ScreenToClient(&ptMouse);:将屏幕坐标转换为树控件的客户端坐标。
HTREEITEM hTreeSelected = m_Tree.HitTest(ptMouse, 0);
if (hTreeSelected == NULL)
    return;
  • HTREEITEM hTreeSelected = m_Tree.HitTest(ptMouse, 0);:通过 HitTest 函数,确定鼠标点击的树控件中的节点(项)。hTreeSelected 是点击项的句柄。
  • 如果 hTreeSelectedNULL,表示用户没有点击任何有效项,函数直接返回。
if (m_Tree.GetChildItem(hTreeSelected) == NULL)
    return;
  • if (m_Tree.GetChildItem(hTreeSelected) == NULL):检查所选项是否有子项。如果没有子项,函数返回。
DeleteTreeChildrenItem(hTreeSelected);
  • DeleteTreeChildrenItem(hTreeSelected);:删除所选项的所有子项。这是为了在加载新的文件信息前清除旧的子项。
m_List.DeleteAllItems();
  • m_List.DeleteAllItems();:清空列表控件中的所有项目。
CString strPath = GetPath(hTreeSelected);
int nCmd = SendCommandPacket(2, false, (BYTE*)(LPCTSTR)strPath, strPath.GetLength());
  • CString strPath = GetPath(hTreeSelected);:获取当前选中项对应的路径。
  • int nCmd = SendCommandPacket(2, false, (BYTE*)(LPCTSTR)strPath, strPath.GetLength());:发送一个命令包来请求获取选中路径下的文件信息。SendCommandPacket 函数的第一个参数 2 可能表示请求类型,false 表示某种标志位,第三个参数是路径的字节指针,第四个参数是路径长度。
PFILEINFO pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();
CClientSocket* pClient = CClientSocket::getInstance();
  • PFILEINFO pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();:通过 CClientSocket 单例对象获取返回的包数据,并将其解释为文件信息结构体 PFILEINFO
  • CClientSocket* pClient = CClientSocket::getInstance();:获取 CClientSocket 的单例对象指针。
int Count = 0;
while (pInfo->HasNext) {
  • int Count = 0;:初始化文件计数器。
  • while (pInfo->HasNext):进入一个循环,处理每个文件信息项,直到 pInfo->HasNextfalse
TRACE("[%s] isdir %d\r\n", pInfo->szFileName, pInfo->IsDirectory);
  • TRACE("[%s] isdir %d\r\n", pInfo->szFileName, pInfo->IsDirectory);:输出当前文件名及其是否为目录的调试信息。
if (pInfo->IsDirectory) {
    if (CString(pInfo->szFileName) == "." || (CString(pInfo->szFileName) == ".."))
    {
        int cmd = pClient->DealCommand();
        TRACE("ack:%d\r\n", cmd);
        if (cmd < 0)break;
        pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();
        continue;
    }
    HTREEITEM hTemp = m_Tree.InsertItem(pInfo->szFileName, hTreeSelected, TVI_LAST);
    m_Tree.InsertItem("", hTemp, TVI_LAST);
}
  • if (pInfo->IsDirectory):如果当前文件是一个目录。
  • if (CString(pInfo->szFileName) == "." || (CString(pInfo->szFileName) == "..")):如果目录名是 “.” 或 “…”,跳过处理(这些是当前目录和上级目录的表示)。
  • int cmd = pClient->DealCommand();:处理下一个命令包。
  • pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();:获取下一个文件信息项。
  • HTREEITEM hTemp = m_Tree.InsertItem(pInfo->szFileName, hTreeSelected, TVI_LAST);:在树控件中添加该目录项。
  • m_Tree.InsertItem("", hTemp, TVI_LAST);:在新添加的目录项下添加一个空白项,以表示该目录还有子目录或文件。
else {
    m_List.InsertItem(0, pInfo->szFileName);
}
  • else:如果当前项不是目录,而是文件。
  • m_List.InsertItem(0, pInfo->szFileName);:将文件名添加到列表控件中。
Count++;
int cmd = pClient->DealCommand();
if (cmd < 0)break;
pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();
  • Count++;:计数器加一。
  • int cmd = pClient->DealCommand();:处理下一个命令包。
  • if (cmd < 0)break;:如果处理命令返回负值,退出循环。
  • pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();:获取下一个文件信息项。
pClient->CloseSocket();
TRACE("Count = %d\r\n", Count);
  • pClient->CloseSocket();:关闭套接字连接。
  • TRACE("Count = %d\r\n", Count);:输出已处理文件的总数。

总结:这段代码的功能是处理用户在树控件中选择的目录项,然后通过网络请求获取该目录下的文件信息,并根据文件类型将信息分别显示在树控件和列表控件中。如果是目录项,将其添加到树控件中;如果是文件,将其添加到列表控件中。

void CRemoteClientDlg::LoadFileInfo()
{
	CPoint ptMouse;
	GetCursorPos(&ptMouse);
	m_Tree.ScreenToClient(&ptMouse);
	HTREEITEM hTreeSelected = m_Tree.HitTest(ptMouse, 0);
	if (hTreeSelected == NULL)
		return;
	if (m_Tree.GetChildItem(hTreeSelected) == NULL)
		return;
	DeleteTreeChildrenItem(hTreeSelected);
	m_List.DeleteAllItems();
	CString strPath = GetPath(hTreeSelected);
	int nCmd = SendCommandPacket(2, false, (BYTE*)(LPCTSTR)strPath, strPath.GetLength());
	PFILEINFO pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();
	CClientSocket* pClient = CClientSocket::getInstance();
	int Count = 0;
	while (pInfo->HasNext) {
		TRACE("[%s] isdir %d\r\n", pInfo->szFileName, pInfo->IsDirectory);
		if (pInfo->IsDirectory) {
			if (CString(pInfo->szFileName) == "." || (CString(pInfo->szFileName) == ".."))
			{
				int cmd = pClient->DealCommand();
				TRACE("ack:%d\r\n", cmd);
				if (cmd < 0)break;
				pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();
				continue;
			}
			HTREEITEM hTemp = m_Tree.InsertItem(pInfo->szFileName, hTreeSelected, TVI_LAST);
			m_Tree.InsertItem("", hTemp, TVI_LAST);
		}
		else {
			m_List.InsertItem(0, pInfo->szFileName);
		}
		Count++;
		int cmd = pClient->DealCommand();
		//TRACE("ack:%d\r\n", cmd);
		if (cmd < 0)break;
		pInfo = (PFILEINFO)CClientSocket::getInstance()->GetPacket().strData.c_str();
	}
	pClient->CloseSocket();
	TRACE("Count = %d\r\n", Count);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值