对象集合和ListBox行之间的一对一对应关系

时间:2013-05-01 00:42:30

标签: c++ winapi listbox

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

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

2 个答案:

答案 0 :(得分:1)

查看符合您要求的ListBox_FindItemData宏。

这会使用LB_FINDSTRING消息表明它可以匹配“匹配的长值”

  

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

答案 1 :(得分:1)

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