c++ - 对象集合与ListBox行一一对应

标签 c++ winapi listbox

有没有什么有效的方法可以通过发送 LB_SETITEMDATA 消息,通过与该行相关联的数据在 WinAPI 中找到已排序 ListBox 的行? 我有客户端连接到我的服务器,需要将它们的 IP 放在排序的 ListBox 中,以便用户一方面可以单击一行并与当前客户端交互,另一方面,如果客户端断开连接,它的记录会从 ListBox 中删除。 我已通过 LB_SETITEMDATA 将行与 SOCKET 链接起来,以便通过单击选择客户端,但没有找到通过链接数据(而不是字符串)获取行的消息。 我找到了两个 macroses,其中一个的名字和我要找的一样,但在里面我没有发现它们之间有任何显着差异。实验表明,两个macroses 中没有一个或它的消息不起作用(仅通过显示的字符串搜索是正确的)。

宏:

#define ListBox_FindString(hwndCtl, indexStart, lpszFind) ((int)(DWORD)SNDMSG((hwndCtl), LB_FINDSTRING, (WPARAM)(int)(indexStart), (LPARAM)(LPCTSTR)(lpszFind)))
#define ListBox_FindItemData(hwndCtl, indexStart, data) ((int)(DWORD)SNDMSG((hwndCtl), LB_FINDSTRING, (WPARAM)(int)(indexStart), (LPARAM)(data)))

下一个代码在结果中显示 -1,而我期望的是 1。

g_hListBox = CreateWindowEx(WS_EX_CLIENTEDGE, "ListBox", "Clients", WS_CHILD|WS_VISIBLE|WS_VSCROLL|LBS_DISABLENOSCROLL|LBS_NOTIFY|LBS_SORT, 5, 40, 300, 500, g_hWnd,  (HMENU) LB_CLIENTS, hInstance, NULL);

    int a = SendMessage(g_hListBox, LB_ADDSTRING, 0, (LPARAM)"33333");
    SendMessage(g_hListBox, LB_SETITEMDATA, a, 6);
    int c = SendMessage(g_hListBox, LB_ADDSTRING, 0, (LPARAM)"11111"); 
    SendMessage(g_hListBox, LB_SETITEMDATA, c, 4);
    int b = SendMessage(g_hListBox, LB_ADDSTRING, 0, (LPARAM)"22222");
    SendMessage(g_hListBox, LB_SETITEMDATA, b, 5);

    char buf[15];
    int x = 5;
    MessageBox(g_hWnd,  itoa(ListBox_FindItemData(g_hListBox, -1, &x), buf, 10), "Function WSAStartup return",MB_OK);

现在每次我需要按数据定义索引时,我只需将 LB_GETITEMDATA 发送到每一行,并将结果与​​当前数据进行比较。看起来很不合理,但是写起来很简单,可以工作。

最佳答案

我强烈建议您改用虚拟 ListBox 或虚拟 ListView,将实际数据存储在您自己的列表/数组/任何需要的内容中,并根据需要进行排序。 ListBox/ListView 只是显示列表中的内容,数据实际上并未存储在 ListBox/ListView 本身中。这样,当您需要查找某些内容时,您可以在自己的存储中查找,而不是在 UI 中查找。这也提供了性能优势,并让您更好地控制数据管理、缓存等。

关于c++ - 对象集合与ListBox行一一对应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16311156/

相关文章:

c++ - 如何删除模板声明中的重复模板参数

c++ - 来自 Qt 的 Bizzare 错误

c++ - 以编程方式重新启动所有崩溃服务的服务程序

c# - 在 C# 中转换 ListBox.SelectedItems

c# - ASP.net 列表框 - 选择索引始终为 -1,即使使用 !ispostback

c++ - 有没有办法将 8bitX32 ymm 寄存器向右/向左移动 N 个位置(C++)

c++ - 如何使用 winapi 类?

c - 二进制模式下的 Windows 管道

.net - 如何关闭其他应用程序的套接字连接?

winforms - C# - 使用列表框添加/删除