CustomDraw CHeaderCtrl



  • Ich habe eine eigene Klasse von CHeaderCtrl abgeleitet, bei der ich CustomDraw (nicht OwnerDraw) nutzen möchte, um nur den Text der Spalten anders darzustellen. Ziel: Text mehrzeilig und anders eingefärbt.
    Im DrawStage für CDDS_ITEMPREPAINT mach ich folgendes:

    case CDDS_ITEMPREPAINT:
    {
    	CDC *pDC= CDC::FromHandle(pNMCD->hdc);
    	HDITEM item;
    	TCHAR szText[256] = _T("");
    	item.mask |= HDI_TEXT;
    	item.pszText = szText;
    	item.cchTextMax = 255;
    	GetItem((int)pNMCD->dwItemSpec, &item);
    	CSize size = pDC->GetTextExtent(item.pszText);
    
    	CRect rect(pNMCD->rc);
    	pDC->DrawText(item.pszText, -1, rect, DT_CENTER | DT_VCENTER | DT_END_ELLIPSIS);
    	*pResult = CDRF_SKIPDEFAULT;
    	break;
    }
    

    Der Text wird damit mehrzeilig ausgegeben (bei \n), was auch gut funktioniert. Leider wird der Hintergrund gar nicht gezeichnet, weil ich ja CDRF_SKIPDEFAULT zurückgebe. Wie kann ich erreichen, dass der Hintergrund und auch alles andere wie gewohnt gezeichnet wird, nur der Text wie oben beschrieben.


  • Mod

    Wird CDDS_ITEMPREERASE vorher gesendet?
    Wenn ja, wie behandelst Du es?



  • CDDS_ITEMPREERASE wird nicht gesendet.
    Ich bekomme CDDS_PREPAINT und dann für jede Spalte CDDS_ITEMPREPAINT.

    Auf CDDS_PREPAINT reagiere ich wie folgt:

    *pResult = CDRF_NOTIFYITEMDRAW;
    

    Kann es sein, dass das CustomDraw für HeaderCtrl nicht ganz so funktioniert, wie beispielsweise bei einem CListCtrl? Ich meine hier die Abfolge der Nachrichten und DrawingStages... Beispiele fürs HeaderCtrl findet man ja auch nirgends.


  • Mod

    Ja! Die Controls haben alle ein eigenes Verhalten... Leider! Mit dem Header-Control habe ich es bisher noch nicht gemacht.

    Multiline im Header Control geht auch IMHO ohne CustomDraw...



  • Multiline im Header Control geht auch IMHO ohne CustomDraw...

    Dass die Spaltenhöhe größer wird geht auch ohne CustomDraw. Hab ich mit der HDM_LAYOUT-Message gemacht. Allerdings ignoriert das Header-Control Steuerzeichen wie \n beim Zeichnen des Textes. Alle Anleitungen im Internet verwenden hier Ownerdrawn, was mir aber viel zu viel Overhead für diese Kleinigkeit ist.


  • Mod

    Du hast recht!
    Ich benutze konsequent MFCNext und die BCG Library. Hier kann ich direkt in das Malen der einzelnen Elemente im Header Control eingreifen. Ich habe das verwechselt.



  • Leider kann ich das FeaturePack in diesem Projekt nicht verwenden, weil ich mit der MFC Version aus 2005 linken muss. Danke für deine Hilfe, aber mir wird wohl nichts anderes übrigbleiben als zu basteln und zu testen.


Anmelden zum Antworten