有没有什么有效的方法可以通过发送ListBox消息来找到WinAPI中排序后的LB_SETITEMDATA所在的行?我有客户端连接到我的服务器,并需要把他们的if在排序的ListBox,以便用户可以点击一行,并与当前客户端交互一方面,如果客户端断开其记录从ListBox删除另一方面。我已经通过LB_SETITEMDATA使用套接字链接了行,用于通过单击选择客户端,但没有通过链接数据(而不是通过字符串)获取行的查找消息。我找到了两个宏,其中一个的名字和我要找的很像,但在里面我没有发现它们之间有任何显著的区别。实验表明,两个宏或其消息中没有一个不起作用(仅按显示的字符串搜索是正确的)。
宏集:
#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发送到每一行,并将结果与当前数据进行比较。它看起来不合理,但它写起来很容易,而且可以工作。
发布于 2013-05-01 09:28:20
看看执行所需操作的ListBox_FindItemData宏。
它使用的LB_FINDSTRING消息表示可以根据“匹配的长值”进行匹配。
LB_FINDSTRING尝试查找具有与lParam参数匹配的长值(作为LB_ADDSTRING或LB_INSERTSTRING消息的lParam参数提供)的项目。
发布于 2013-05-01 10:06:34
我强烈建议您切换到虚拟ListBox或虚拟ListView,根据需要将实际数据存储在您自己的列表/数组/任何需要的地方,以您想要的方式排序。ListBox/ListView只是显示列表中的内容,数据实际上并不存储在ListBox/ListView本身中。这样,当您需要查找某些内容时,您可以查看您自己的存储,而不是UI。这还提供了性能优势,并使您能够更好地控制数据管理、缓存等。
https://stackoverflow.com/questions/16311156
复制相似问题