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仅在重新启动后解决了问题