0

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

宏指令:

#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 发送到每一行,并将结果与​​当前数据进行比较。它看起来不合理,但它写得容易并且可以工作。

4

2 回答 2

1

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

于 2013-05-01T02:06:33.637 回答
1

查看执行所需操作的ListBox_FindItemData宏。

这使用LB_FINDSTRING消息,表示它可以根据“匹配的长值”进行匹配

LB_FINDSTRING 尝试查找具有与 lParam 参数匹配的长值(作为 LB_ADDSTRING 或 LB_INSERTSTRING 消息的 lParam 参数提供)的项目。

于 2013-05-01T01:28:19.953 回答