Carl Mark
Carl Mark

Reputation: 371

winapi listview check item c++

I use minGW32 compiler. I created a ListView with checkbox something like this:

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;

And I would like to check when any checkbox is checked. for example. If I check any checkbox show me a messagebox:

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;

But this alwas happened. When I click an empty area of the ListView or when just click any item. But I would like to run the messagebox ONLY when the checkbox is changed.

Upvotes: 4

Views: 3365

Answers (1)

Lefteris E
Lefteris E

Reputation: 2814

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;
   }
}

Upvotes: 3

Related Questions