请问,我用CListCtrl显示数据,用Report风格,有3个列。我设置了Owner Data风格。在OnGetdispinfoList()函数中更新数据,可以成功。但是我想在每一行前加一个单选框,我用ListView_SetExtendedListViewStyle(hwnd,LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT|LVS_EX_SUBITEMIMAGES);设置,并用SetItemStatus函数更改状态,总是不成功,但是,在我不用Owner Data风格,用函数加数据时,就可以。请问,我想保留Owner Data风格,怎么加一个checkbox并设置其状态?
谢谢,急。

解决方案 »

  1.   

    http://www.codeproject.com/listctrl/listcheckbox.asp
    看看吧
      

  2.   

    CSDN光盘版,就是最早的那版里面有demo,现在手头没有,记得以前做这个的时候是CSDN+MSDN搞定的,你去查一下吧
      

  3.   

    BOOL CSpecifyDeptPage::SetCheckState(HTREEITEM hItem, BOOL fCheck,BOOL bDelay /* FALSE */)
    {
        static TVITEM tvItem;    tvItem.mask = TVIF_HANDLE | TVIF_STATE;
        tvItem.hItem = hItem;
        tvItem.stateMask = TVIS_STATEIMAGEMASK;    /*
        Since state images are one-based, 1 in this macro turns the check off, and 
        2 turns it on.
        */
        tvItem.state = INDEXTOSTATEIMAGEMASK((fCheck ? 2 : 1)); if (bDelay)
    ::PostMessage(m_deptTree.m_hWnd,TVM_SETITEM , 0L, (LPARAM)(&tvItem));
    else
    ::SendMessage(m_deptTree.m_hWnd,TVM_SETITEM , 0L, (LPARAM)(&tvItem));
    return TRUE;// return TreeView_SetItem(m_deptTree.m_hWnd, &tvItem);
    }
    BOOL CSpecifyDeptPage::GetCheckState(HTREEITEM hItem)
    {
        TVITEM tvItem;    // Prepare to receive the desired information.
        tvItem.mask = TVIF_HANDLE | TVIF_STATE;
        tvItem.hItem = hItem;
        tvItem.stateMask = TVIS_STATEIMAGEMASK;    // Request the information.
        TreeView_GetItem(m_deptTree.m_hWnd, &tvItem);    // Return zero if it's not checked, or nonzero otherwise.
        return ((BOOL)(tvItem.state >> 12) -1);
    }void CSpecifyDeptPage::OnClickDeptTree(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    // TODO: Add your control notification handler code here
    //NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    UNREFERENCED_PARAMETER(pNMHDR);
    HTREEITEM itemTree; UINT nFlags;
    CPoint curPoint;
    GetCursorPos(&curPoint);
    m_deptTree.ScreenToClient(&curPoint);
    itemTree= m_deptTree.HitTest(curPoint, &nFlags);
    if (itemTree!=NULL)
    m_deptTree.Select(itemTree,TVGN_CARET);
    if (m_bEditable == FALSE) {
    // avoid to change the check state
    SetCheckState(itemTree,GetCheckState(itemTree),TRUE);
    }
    *pResult = 0;
    }Command what is yours
    Conquer what is not