好吧,我正在做的是为我和我的 friend 们创建一个加密的聊天室。
我想进行私有(private)聊天,您可以在 ListView 中右键单击他们的名字并向他们发送消息。
目前我的结构包含所有“用户”信息,如姓名、登录时间和 ListView 编号。但是,当用户断开连接时,该 ListView 编号会变得不正确,因为它会将每个人都向下移动一个。
我如何能够从本质上将用户“绑定(bind)”到 ListView 项目?这样,无论有多少人登录/注销,当我点击他们的名字时,它都会向那个人发送 PM。 (我尝试使用 LVN_ITEMCHANGE,因为我认为 iItem 会改变,但它并没有改变我的经验)
**我的想法* 我的想法是在名为“token”的 ListView 项目中添加一个随机字符字段,这样当有人单击名称时,它会找到唯一的“token”并以这种方式执行。但也许他们是一种更简单的方法,所以这就是我问的原因。
最佳答案
您的数据结构不应该根本 跟踪 ListView 项目。这只是额外的数据。
您的 ListView 可以将每个列表项与一个数据结构相关联。 LVITEM
结构有一个 lParam
字段用于处理用户定义的值:
当您想向 ListView 添加新用户时,在使用
LVM_INSERTITEM
之前,动态分配您的数据结构并将该指针分配给LVITEM::lParam
字段消息。当您想要访问特定用户的数据时,使用
LVM_GETITEM
检索该列表项的LVITEM
消息,然后对其lParam
进行类型转换以访问您的数据结构。当您想删除用户时,只需使用
LVM_DELETEITEM
删除该列表项即可。消息,然后使用LVN_DELETEITEM
释放相关数据结构的通知。
或者,通过 LVS_OWNERDATA
在虚拟模式下使用 ListView窗口样式(参见 Virtual List-View Style 和 How to Use Virtual List-View Controls ),然后您根本不需要使用 LVITEM::lParam
字段。将你的数据结构存储在一个单独的数组/容器中,然后使用 LVN_GETDISPINFO
仅在需要数据时才向 ListView 提供显示数据的通知。当您从阵列/容器中添加/删除用户时,只需使用 LVM_SETITEMCOUNT
更新 ListView 的项目计数以匹配新数组/容器计数的消息。这样,ListView 项和容器项之间始终存在直接关系。让 LVN_GETDISPINFO
告诉您要访问哪个数组/容器项。
关于C++ Win32 - 跟踪私有(private)聊天的 ListView 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39481079/