有没有什么有效的方法可以通过发送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 发送到每一行,并将结果与当前数据进行比较。它看起来不合理,但它写得容易并且可以工作。