如何在ListBox中添加鼠标双击功能

3
对于这段代码:https://www.dreamincode.net/forums/topic/163804-microsoft-working-with-listboxes-part-i/ 它会显示列表并循环得很好。
可悲的是,我的导师从未完成他的代码。 计划是在名称上添加双击检测。如何实现?
        case WM_COMMAND:
        {

            return 0;
        }

像这样吗?11是这个子窗口,其中包含名称。

        case WM_COMMAND:
        {
            if (LOWORD(wparam) == 11) {
                if ((message) == LBN_DBLCLK) {
                    cout << "double click" << endl;
                }
            }
            return 0;
        }

不起作用。
2个回答

2

首先,根据文档:

参数

wParam

LOWORD 包含列表框的标识符。HIWORD 指定通知代码。

lParam

指向列表框的句柄。

备注

此通知代码仅由具有 LBS_NOTIFY 样式的列表框发送。

因此,在第一步中,您需要添加此样式并使用 HIWORD(wParam) 来确定是否双击列表。

然后,如果您需要获取列表的元素,则不应将 LB_GETCURSEL 发送到 window_handle,而应该将其发送到 This->listbox_handle,即列表框的窗口句柄。然后,您可以通过发送 LB_GETTEXT 获取文本内容。

以下是代码:

case WM_COMMAND:
{
    if (HIWORD(wparam) == LBN_DBLCLK) {
        TCHAR temp[100]{};
        int index = SendMessageW(This->listbox_handle, LB_GETCURSEL, 0, 0L);
        SendMessageW(This->listbox_handle, LB_GETTEXT, index, (LPARAM)temp);
        MessageBox(window_handle, temp, L"test", 0);
    }
    return 0;
}

而且这对我有效:

enter image description here


1

Try replacing:

if ((message) == LBN_DBLCLK)

使用:

if (HIWORD (wParam) == LBN_DBLCLK)

文档 在这里


是的,我确实也做到了这一点,但是不得不添加LBS_NOTIFY以使子窗口消息传递过来。 - ayes l
好的(通常由资源编辑器设置,但我看到你没有使用它)。那么你现在遇到什么问题?你尝试过在case WM_COMMAND后面的行上设置断点并检查wParam吗? - Paul Sanders
我对某种方式找出被点击的文本很感兴趣。在Windows Visual Studio 2019上看了一下对话框编辑器。我可以在那里构建,但是如何将其导出到我的代码中呢? - ayes l
1
@ayesl LBN_DBLCLK无法提供该信息。您需要处理LBN_SELCHANGE,或者发送LB_GETCURSEL来获取相关信息。 - Remy Lebeau
每次我点击列表时,它都返回0。请看这段代码:cout << SendMessageW(window_handle, LB_GETCURSEL, 0, 0L) << endl; - ayes l
你确定你把消息发送到了正确的窗口吗?你需要把它发送到列表框,而不是对话框。请查看GetDlgItem,或者使用在WM_COMMAND消息中传递的lParam值。 - Paul Sanders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接