CListCtrl - mit Spalten, wie Spaltenresize verhindern?



  • Hallo!

    Wie kann ich bei einem CListCtrl, der Spalten hat, es verhindern, dass der User die Spaltenbreite mit der Maus verändern kann? (Während der Laufzeit)

    THX

    [ Dieser Beitrag wurde am 04.04.2002 um 17:12 Uhr von PanicMan editiert. ]



  • ja, das wollte ich auch schon immer wissen, hab bisher auch noch nix gefunden, aber vllt meldet sich ja wer images/smiles/icon_smile.gif



  • Jo, mit Hilfe von ein paar Vorschlägen habe ich es gelöst.

    Man leite eine Klasse von CListCtrl ab und bau einen WM_NOTIFY-Handler ein:

    BOOL CMyListCtrl::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
    {
        // TODO: Add your specialized code here and/or call the base class
    
        int idCtrl = (int) wParam;
    
        NMHEADER* pnmh = (NMHEADER*) lParam;
    
        if( pnmh->hdr.code == HDN_BEGINTRACKW ) { // Abfangen des Resize
    
            *pResult = TRUE;
            return TRUE;
        }
        return CListCtrl::OnNotify(wParam, lParam, pResult);
    }
    

    So, wenn ich jetzt noch gelöst habe wie man die vertikalen Linien hineinbekommt, kommt das auch noch rein.



  • OK, und hier die OnPaint Funktion, damit die vertikalen SpaltenLinien gezeichnet werden, muß auch in die abgeleitete Klasse rein :

    void CMyListCtrl::OnPaint() 
    {
        // First let the control do its default drawing.
        const MSG *msg = GetCurrentMessage();
        DefWindowProc( msg->message, msg->wParam, msg->lParam );
    
        // Draw the lines only for LVS_REPORT mode
        if( (GetStyle() & LVS_TYPEMASK) == LVS_REPORT )
        {
            // Get the number of columns
            CClientDC dc(this );
            CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
            int nColumnCount = pHeader->GetItemCount();
    
            // The bottom of the header corresponds to the top of the line 
            RECT rect;
            pHeader->GetClientRect( &rect );
            int top = rect.bottom;
    
            // Now get the client rect so we know the line length and
            // when to stop
            GetClientRect( &rect );
    
            // The border of the column is offset by the horz scroll
            int borderx = 0 - GetScrollPos( SB_HORZ );
    
            CPen       *pOldPen;
            CPen        pen;
            CGdiObject *pOldBrush;
            pen.CreatePen( PS_SOLID, 0, RGB(200,200,200)); //RGB Farbwert
            pOldPen  =dc.SelectObject(&pen);
            pOldBrush=dc.SelectStockObject(NULL_BRUSH);
    
            for( int i = 0; i < nColumnCount; i++ )
            {
                // Get the next border
                borderx += GetColumnWidth( i );
    
                // if next border is outside client area, break out
                if( borderx >= rect.right ) break;
    
                // Draw the line.
                dc.MoveTo( borderx-1, top);
                dc.LineTo( borderx-1, rect.bottom );
            }
            dc.SelectObject(pOldPen);
            dc.SelectObject(pOldBrush);
    
        }
        // Do not call CListCtrl::OnPaint() for painting messages
    }
    

    PS an dEUs images/smiles/icon_wink.gif : das screit doch nach einem eintrag in die FAQ, oder? images/smiles/icon_biggrin.gif



  • Aber dann muß auch der Titel ein bissel abgeändert werden.



  • Warum? In was denn?



  • ich krieg das irgendwie net ganz auf die reihe...
    wenn ich des alles so ache wie du gesagt hast, gibt es zwar keine fehlermeldungen, aber die spalten kann ich immer noch verändern...
    (hab list control in einer dialogfeldbasierten anwendung)

    es kann natürlich sein, dass ich beim ableiten einer klasse von clistctrl nen fehler gemacht hab....
    ich versteh net ganz, wie ich dann meiner Liste (genauer gesagt der ListID: IDC_LIST) auch die klasse "zuweisen" kann, damit auch klar ist welche liste gemeint ist images/smiles/icon_confused.gif
    bin halt noch n anfänger images/smiles/icon_wink.gif



  • du legst für dein ListCtrl ganz normal ne membervariable vom Typ CListCtrl an und änderst das dann manuell in der headerdatei in den klassennamen deiner abgeleiteten klasse ...


Anmelden zum Antworten