【问题标题】:winapi listview check item c++winapi listview 检查项 c++
【发布时间】:2013-04-03 12:14:02
【问题描述】:

我使用 minGW32 编译器。 我创建了一个带有复选框的 ListView,如下所示:

HWND hListView = CreateWindowExW(0, WC_LISTVIEWW, L"",
    WS_VISIBLE | WS_CHILD | WS_TABSTOP | LVS_REPORT | LVS_EDITLABELS,
    10,10,500,500, hwnd, (HMENU)ID_LISTVIEW, GetModuleHandle(NULL), NULL);
    SendMessage(hListView, WM_SETFONT, (WPARAM) font, TRUE);

ListView_SetExtendedListViewStyle(hListView, LVS_EX_CHECKBOXES |  LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP | LVS_EX_GRIDLINES/*LVSCW_AUTOSIZE_USEHEADER*/);

lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH  | LVCF_FMT;
lvc.fmt  = LVCFMT_LEFT;

我想检查一下何时选中了任何复选框。例如。如果我选中任何复选框,则显示一个消息框:

I use this WM_NOTIFY:
case WM_NOTIFY:
 {
  switch (LOWORD(wParam))
  {
   case ID_LISTVIEW:
   {
   switch (((LPNMHDR) lParam)->code)
   {
    case LVN_ITEMCHANGED :
    MessageBoxW( NULL, (LPCWSTR)lpMsgBuf, L"Error", MB_OK | MB_ICONERROR ); 
    }
    break; 
   }
  break;
  }
  break;
 }
 break;

但这总是发生。当我单击 ListView 的空白区域或单击任何项​​目时。但我只想在复选框更改时运行消息框。

【问题讨论】:

  • 您可以将复选框的当前状态与之前的状态进行比较,并且仅在更改时才显示消息框

标签: c++ winapi listview


【解决方案1】:
LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam; 

if(pnmv->uChanged & LVIF_STATE) // item state has been changed
{
   switch(pnmv->uNewState & LVIS_STATEIMAGEMASK)
   {
   case INDEXTOSTATEIMAGEMASK(2):
      // pnmv->iItem was checked
      break;
   case INDEXTOSTATEIMAGEMASK(1):
      //pnmv->iItem was unchecked
      break;
   }
}

【讨论】:

  • 谢谢它的工作,但我有一个问题我在winapi编程中很新,什么是0x3000,我在哪里可以找到其他选项?
  • @CarlMark: 0x3000 == 0x2000 | 0x1000 ...它掩盖了switch/case内部检查的位。否则,您需要检查的不仅仅是这两个最低有效位。
  • @LefterisE 你能帮忙解答这个问题吗?
  • 我编辑了答案以删除硬编码值。我找不到合适的文档,但我将常量 0x2000 映射到宏 INDEXTOSTATEIMAGEMASK(2)。我从谷歌搜索得到的值 0x2000 和修改是基于msdn.microsoft.com/en-us/library/windows/desktop/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
相关资源
最近更新 更多