Bar*_*kut 0 c++ winapi listview
我在 C++ 中的 listview 有一个严重的问题。我创建一个这样的:
RECT rcl;
GetClientRect( hWnd, & rcl );
lvC = CreateWindowEx( 0, WC_LISTVIEW, NULL, WS_CHILD | WS_VISIBLE | LVS_REPORT |
LVS_EDITLABELS, 0, 0, rcl.right - rcl.left, 200 - rcl.top,
hWnd,( HMENU ) 1000, hInstance, NULL );
ListView_SetExtendedListViewStyle(lvChannels, LVS_EX_FULLROWSELECT);
LVCOLUMN lvc;
lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 0;
lvc.cx = 750;
lvc.pszText = (char*)"Name";
ListView_InsertColumn( lvC, 0, & lvc );
Run Code Online (Sandbox Code Playgroud)
并以这种方式插入项目:int row = 0;
for (const auto& c : cVec)
{
LVITEM lvi;
lvi.mask = LVIF_TEXT;
lvi.pszText = (LPSTR)c.name.c_str();
lvi.iItem = row;
lvi.iSubItem = 0;
ListView_InsertItem( lvC, & lvi );
row++;
}
Run Code Online (Sandbox Code Playgroud)
之后,我想在用户在此列表视图中选择一行时进行处理。我尝试过这样的事情:
case WM_NOTIFY:
{
switch(LOWORD(wParam))
{
case 1000:
if(((LPNMHDR)lParam)->code == NM_CLICK)
{
auto iSelect=SendMessage(lvC, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
if(iSelect==-1)
{
MessageBox(hWnd,"No Items in ListView",
"Error",MB_OK|MB_ICONINFORMATION);
break;
}
else
{
std::string t = "Selected item: " + std::to_string(iSelect);
MessageBox(hWnd, t.c_str(),
"Error",MB_OK|MB_ICONINFORMATION);
break;
}
}
break;
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我单击此列表视图时,我收到“ListView 中没有项目”,并且无法选择任何项目。我想强调的是,列表视图中有正确的项目,我可以滚动它,但是当我单击它时,它没有标记。预先感谢您的所有帮助!
问题是NM_CLICK在列表视图处理点击之前发送。当您收到通知时,该项目实际上尚未选择。
要查找的正确通知是LVN_ITEMCHANGED,只要项目的状态发生变化(包括其选择状态),就会发送该通知。
case WM_NOTIFY:
if (reinterpret_cast<LPNMHDR>(lParam)->code == LVN_ITEMCHANGED)
{
auto plv = reinterpret_cast<NMLISTVIEW*>(lParam);
if ((plv->uNewState & LVIS_SELECTED) != (plv->uOldState & LVIS_SELECTED))
{
// selection state of an item has changed
}
}
break;
Run Code Online (Sandbox Code Playgroud)