2013-04-03 77 views
4

我使用minGW32編譯器。 我創建了複選框,這樣的一個ListView:winapi listview檢查項目C++

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的空白區域或者只需單擊任何項​​目時。但是我想只在複選框更改時才運行消息框。

+0

您可以用以前的狀態比較複選框的當前狀態,並只顯示消息框,如果它改變 –

回答

3
LPNMLISTVIEW pnmv = (LPNMLISTVIEW) lParam; 

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

由於它的工作原理,但我有一個問題,我在WINAPI編程拿什麼0x3000處很新,和我在哪裏可以找到其他選項? –

+1

@CarlMark:'0x3000 == 0x2000 | 0x1000' ...它掩蓋了'switch/case'內部檢查的位。否則,你會檢查超過這兩個最低有效位。 – 0xC0000022L

+1

http://msdn.microsoft.com/en-us/library/windows/desktop/bb774773(v=vs.85).aspx –

相關問題