[CListCtrl]: Nach Scroll-Event, kann man keine Checkbox mehr anklicken



  • Hallo zusammen,

    ich habe ein CListCtrl mit Checkboxen in der ersten Spalte. Man kann die Checkboxen auch ganz normal anklicken bzw. an- oder abhaken. Das Problem ist jedoch, sobald ich in dem Fenster scrolle in dem mein CListCtrl sich befindet, kann man den Status der Checkboxen nicht mehr verändern.

    Hat jemand eine Idee, voran das liegen könnte???

    CListCtrl wird so afugebaut

    m_listCtrl.SetExtendedStyle(LVS_EX_CHECKBOXES|LVS_EX_GRIDLINES|LVS_EX_FLATSB|LVS_EX_FULLROWSELECT);
    

    Fange auch events ab

    BEGIN_MESSAGE_MAP(cDialogSubPage, CDialog)
        ON_NOTIFY(NM_CLICK, LV_TS_CTE_TESTCASES, OnLVClick)
        ON_NOTIFY(LVN_ITEMCHANGED, LV_TS_CTE_TESTCASES, OnLVChanged)
        ON_NOTIFY(NM_CUSTOMDRAW, LV_TS_CTE_TESTCASES, OnCustomdrawList)
    END_MESSAGE_MAP()
    

    Hab ich vielleicht irgendetwas vergessen? Muss ich die scrollevents abfangen??? oder sie expliziet für das CListCtrl erlauben???

    Ich weiß einfach nicht mehr weiter!

    Viele Grüße, Bianca


  • Mod

    D.h. Du rollst das Fenster in dem das CListCtrl drin ist, und nicht das CListCtrl?

    Wie machst Du das bitte?
    Setzt Du ein CFormView ein? Oder was?



  • Meine Andwendung besteht aus verschiedenen, jedes Tab ist von CDialog abgeleitet. In einem Tab hab ich ein CListCtrl drin, in dem ich scrolle... ich scrolle also schon das ClistCtrl selbst.

    Das CListCtrl hat momentan 25 items, um an die letzten zu kommen, scrolle ich im CListCtrl und danach kann ich die Checkboxen nicht mehr anklicken!

    Ich hoffe ich hab es verständlich erklärt.


  • Mod

    Keine. Ahnung. Da müsste ich Code sehen, oder ein Mini-Sample.



  • Das wären jetzt meine Funktionen, mit denen ich dei notifications abfange.

    void cDialogSubPageCTEConvert::OnLVClick
    (
        NMHDR       *i_pNMHDR,
        LRESULT     *i_pResult
    ) 
    { 
        NM_LISTVIEW *psNMListView = (NM_LISTVIEW*)i_pNMHDR;
        tInt nItem = psNMListView->iItem;
    
        DWORD pos = GetMessagePos();
        CPoint pt(LOWORD(pos), HIWORD(pos));
        ScreenToClient(&pt);
    
        *i_pResult = 0;
        m_lstMultipleSelect = GetSelectedTestCases();
    }
    
    void cDialogSubPageCTEConvert::OnLVChanged(NMHDR *pNMHDR, LRESULT *pResult)
    {
        NM_LISTVIEW *psNMListView = (NM_LISTVIEW*)pNMHDR;
        tInt nItem = psNMListView->iItem;
        tInt nOldState = psNMListView->uOldState;
        tInt nNewState = psNMListView->uNewState;
        tInt nSubItem = psNMListView->iSubItem;
        BOOL bLVActive;
        tBool bActive;
        cString strName;
    
        if (m_bClickSpace)
        {
            return;
        }
    
        if (nOldState < 100 || nNewState < 100)
        {
            return;
        }
    
        strName = m_lvTestcases.GetItemText(nItem, 0);
        bActive = m_poConfigFile->IsTestCaseActiveCTE(strName);
        bLVActive = m_lvTestcases.GetCheck(nItem);
        if (bLVActive == TRUE)
        {
            if  (bActive)
            {
                return;
            }
        }
        else if (bLVActive == FALSE)
        {
            if  (!bActive)
            {
                return;
            }
        }
    
        if (bLVActive == TRUE)
        {
            m_poConfigFile->SetTestCaseActiveCTE(strName, tTrue);
        }
        else
        {
            m_poConfigFile->SetTestCaseActiveCTE(strName, tFalse);
        }
    
        cStringList lstMultipleSelect = GetSelectedTestCases();
        tInt nCount = lstMultipleSelect.GetItemCount();
        if (nCount <= 1)
        {
            return;
        }
    
        tInt nPos;
        for (tInt nI = 0; nI < nCount; nI++)
        {
            nPos = lstMultipleSelect.Get(nI).AsInt();
            if (nPos != nItem)
            {
                strName = m_lvTestcases.GetItemText(nPos, 0);
                if (bLVActive == TRUE)
                {
                    m_poConfigFile->SetTestCaseActiveCTE(strName, tTrue);
                    m_lvTestcases.SetCheck(nPos, TRUE);
                    m_lvTestcases.Update(nPos);
                }
                else
                {
                    m_poConfigFile->SetTestCaseActiveCTE(strName, tFalse);
                    m_lvTestcases.SetCheck(nPos, FALSE);
                    m_lvTestcases.Update(nPos);
                }
            }
        }
    }
    
    void cDialogSubPageCTEConvert::OnCustomdrawList(NMHDR* pNMHDR, LRESULT* pResult)
    {
        NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
    
        // Take the default processing unless we set this to something else below.
        *pResult = 0;
    
        // First thing - check the draw stage. If it's the control's prepaint
        // stage, then tell Windows we want messages for every item.
        if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
        {
            *pResult = CDRF_NOTIFYITEMDRAW;
        }
        else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
        {
            // This is the prepaint stage for an item. Here's where we set the
            // item's text color. Our return value will tell Windows to draw the
            // item itself, but it will use the new color we set here.
            // We'll cycle the colors through red, green, and light blue.
            COLORREF crText = RGB(255,0,0);
            CString strText;
            cFilename strResultPath;
            cFilename strTestCase;
            tInt nItem = (tInt)pLVCD->nmcd.dwItemSpec;
    
            m_edtResultPath.GetWindowText(strText);
            strResultPath = (cFilename)strText;
            strResultPath.AppendTrailingSlash();
            strTestCase = (cFilename)m_lvTestcases.GetItemText(nItem, 0);
            strTestCase = m_poConfigFile->GetResultFileNameCte(strTestCase);
            strTestCase = strResultPath + strTestCase;
            if (cFileSystem::Exists(strTestCase))
            {
                pLVCD->clrText = crText;
            }               
    
            // Tell Windows to paint the control itself.
            *pResult = CDRF_DODEFAULT;
        }
    }
    

    Reicht das, oder brauchst du mehr??


  • Mod

    Also diesen Code verstehe ich nicht.

    Suspekt kommt mir allein schon der State Check auf <100 vor.

    Wird kein Breakpoint mehr angelaufen.



  • Ich weiß es leider auch nicht... hab das nicht programmiert, aber muss das nun leider wieder in Ordnung bringen!

    Sobald ich jedoch scrolle kommt keine notifaction mehr durch. Also keine dieser funktionen wird danach noch aufgerufen.


  • Mod

    Auch nicht der Custom-Draw?



  • Das schon, aber da wird ja nicht der state geändert...


Anmelden zum Antworten