Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 列表框选择事件(LBN_SELCHANGE和LBN_DBLCLK)未触发_C++_Winapi - Fatal编程技术网

C++ 列表框选择事件(LBN_SELCHANGE和LBN_DBLCLK)未触发

C++ 列表框选择事件(LBN_SELCHANGE和LBN_DBLCLK)未触发,c++,winapi,C++,Winapi,我正在创建一个列表框控件,如下所示: HWND hAvailable = CreateWindowEx(WS_EX_CLIENTEDGE, L"Listbox", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | LBS_DISABLENOSCROLL | LBS_SORT, 0, 0, 0, 0, hWnd, (HMENU)IDC_AVAILABLELIST, hInst, NULL); LRESULT CALLBACK W

我正在创建一个列表框控件,如下所示:

HWND hAvailable = CreateWindowEx(WS_EX_CLIENTEDGE, L"Listbox", NULL,
    WS_CHILD | WS_VISIBLE | WS_VSCROLL |
    LBS_DISABLENOSCROLL | LBS_SORT,
    0, 0, 0, 0, hWnd, (HMENU)IDC_AVAILABLELIST,
    hInst, NULL);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
int wmId, wmEvent;

switch (message) {
case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);

    switch (wmId) {
    case IDC_AVAILABLELIST:
        // We get here, with LBN_SETFOCUS and LBN_KILLFOCUS
        if (wmEvent == LBN_SELCHANGE || wmEvent == LBN_DBLCLK) {
            // Never gets here!
        }

    [ ... ]
在WM_命令下,监听回调函数中的事件,如下所示:

HWND hAvailable = CreateWindowEx(WS_EX_CLIENTEDGE, L"Listbox", NULL,
    WS_CHILD | WS_VISIBLE | WS_VSCROLL |
    LBS_DISABLENOSCROLL | LBS_SORT,
    0, 0, 0, 0, hWnd, (HMENU)IDC_AVAILABLELIST,
    hInst, NULL);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
int wmId, wmEvent;

switch (message) {
case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);

    switch (wmId) {
    case IDC_AVAILABLELIST:
        // We get here, with LBN_SETFOCUS and LBN_KILLFOCUS
        if (wmEvent == LBN_SELCHANGE || wmEvent == LBN_DBLCLK) {
            // Never gets here!
        }

    [ ... ]
问题是,当我更改选择时,我可以看到正在选择的新项目,但我没有收到相应的事件


当我选择一个项目时,我会得到一个LBN_SETFOCUS事件,然后是一个LBN_KILLFOCUS事件。使用
int idx=SendMessage(hAvailable,LB_GETCURSEL,0,0)获取当前选定索引的任何尝试返回-1,即使事实上选择了某个项目。

如果您阅读了和的文档,它们都会说:

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

文件说明:

LBS_通知
每当用户单击列表框项目()、双击项目()或取消选择()时,使列表框向父窗口发送通知代码

您没有在ListBox控件上启用该样式


至于
LB_GETCURSEL
,当没有选择时,它返回
LB_ERR
(-1)。

如果您阅读了和的文档,它们都会说:

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

文件说明:

LBS_通知
每当用户单击列表框项目()、双击项目()或取消选择()时,使列表框向父窗口发送通知代码

您没有在ListBox控件上启用该样式


至于
LB_GETCURSEL
,当没有选择时,它返回
LB_ERR
(-1)。

我也有同样的问题。这是真的。LBS_NOTIFY需要采用该样式


这个问题非常奇怪的是,昨天我的代码不需要LBS_通知,但今天它需要。太奇怪了,对吧!我正在使用Visual Studio 2019。另外,添加LBS_NOTIFY只在重新启动后解决了问题。

我也遇到了同样的问题。这是真的。LBS_NOTIFY需要采用该样式

这个问题非常奇怪的是,昨天我的代码不需要LBS_通知,但今天它需要。太奇怪了,对吧!我正在使用Visual Studio 2019。此外,添加LBS_NOTIFY仅在重新启动后解决了问题