Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » CListCtrl-Item benutzerdefiniert zeichnen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
15.02.2006, 13:15 Uhr
~blub
Gast


Hallo,

ich hab ein für MFC (bzw. für mich) schier unlösbares Problem....:

Ich habe eine CListCtrl und hab dafür eine eigene Klasse von CListCtrl. Ich will die Items benutzerdefiniert zeichnen (insbesondere soll jedes Item von der Höhe her etwas größer sein und die Textfarbe soll grün sein)....

So, wie mache ich denn das???

Ich habe in meine Klasse die Mehtoden OnItemDraw() und OnMeasureItem() überschrieben....ABER: das Framework springt überhaupt NIE in diese Methoden...keine Ahnung, wieso überhaupt Items in der ListCtrl gezeichnet werden....auf jeden Fall hopst das Framework nie in meine überschriebenen Methoden...folglich kann ich ja auch keinen Einfluß auf die Gestaltung der Items nehmen....

WEISS JEMAND WORAN DAS LIEGT????

Ich hab dann mal versucht, die DrawItem-Nachricht selbst zu verschicken...die kommt an...aber ich habe absolut keinen Schimmer, wie ich dann die LPDRAWITEMSTRUCT sinnvoll vor dem SendMessage zusammen kann....Kann mir mal da einer ein KONKRETES Beispiel geben??

HAT VIELLEICHT IRGENDJEMAND DAS SCHON MAL GEMACHT??--DAS WÜRDE MIR ECHT WEITERHELFEN!!!!

DANKE
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.02.2006, 13:58 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi, les mal in der MSDN Das Kapitel dazu, da gibts sogar ein komplettes Beispiel.

Ansonsten, bei dem ListCtrl OwnerDraw anmachen. kann sein das es da mehrere möglichkeiten gibt, wenn ja, ausprobieren
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.02.2006, 15:45 Uhr
mmc20
puss in boots


hi, also wenns nur um farben geht... da hab ich mal (vor langer, langer zeit) was "gebastelt"

C++:
/////////////////////////////////////////////////////////////////////////////
// XListCtrl.h

class XListCtrl : public CListCtrl
{
// Konstruktion
public:
    XListCtrl();

private:
    struct MEMBERS {
        COLORREF crText1, crText2, crTextBk1, crTextBk2;
    } m;

// Überschreibungen
    // Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen
    //{{AFX_VIRTUAL(XListCtrl)
    //}}AFX_VIRTUAL

// Implementierung
public:
    void SetTextColors(COLORREF col1, COLORREF col2);
    void SetBkColors(COLORREF col1, COLORREF col2);
    virtual ~XListCtrl();

    // Generierte Nachrichtenzuordnungsfunktionen
protected:
    //{{AFX_MSG(XListCtrl)
    afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////




C++:
/////////////////////////////////////////////////////////////////////////////
// XListCtrl.cpp

XListCtrl::XListCtrl()
{
    m.crText1 = m.crText2 = 0x000000;
    m.crTextBk1 = m.crTextBk2 = 0xFFFFFF;
}

XListCtrl::~XListCtrl()
{
}

BEGIN_MESSAGE_MAP(XListCtrl, CListCtrl)
    //{{AFX_MSG_MAP(XListCtrl)
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Behandlungsroutinen für Nachrichten XListCtrl

void XListCtrl::SetBkColors(COLORREF col1, COLORREF col2)
{
    m.crTextBk1 = col1;
    m.crTextBk2 = col2;
}

void XListCtrl::SetTextColors(COLORREF col1, COLORREF col2)
{
    m.crText1 = col1;
    m.crText2 = col2;
}

void XListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
    LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;

    if (lplvcd->nmcd.dwDrawStage == CDDS_PREPAINT) {
        *pResult = CDRF_NOTIFYITEMDRAW;
    } else
        if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) {
            *pResult = CDRF_NOTIFYSUBITEMDRAW;
            if ( (lplvcd->nmcd.dwItemSpec & 0x1) == 0 ) {
                lplvcd->clrText = m.crText1;
                lplvcd->clrTextBk = m.crTextBk1;
            } else {
                lplvcd->clrText = m.crText2;
                lplvcd->clrTextBk = m.crTextBk2;
            }
        } else
            if (lplvcd->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM)) {
                *pResult = CDRF_DODEFAULT;
            }
}

damit kannste jeder zweiten zeile eine andere farbe+hintergrundfarbe geben

Dieser Post wurde am 15.02.2006 um 15:47 Uhr von mmc20 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.02.2006, 19:58 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


nicht nur jeder 2ten zeile (mit entsprechender modifikation natürlich)
--
class God : public ChuckNorris { };

Dieser Post wurde am 15.02.2006 um 19:59 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.02.2006, 12:04 Uhr
~blub
Gast



Zitat von FloSoft:
hi, les mal in der MSDN Das Kapitel dazu, da gibts sogar ein komplettes Beispiel.

Ansonsten, bei dem ListCtrl OwnerDraw anmachen. kann sein das es da mehrere möglichkeiten gibt, wenn ja, ausprobieren


hast du da zufällig n Link zu???
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.02.2006, 12:09 Uhr
~blub
Gast


Hey,

danke für das konkrete Beispiel, aber bei mir im Resourceneditor hat die CListCtrl kein Ereignis NM_CUSTOMDRAW oder dergleichen....vielleicht sollte ich auch erwähnen, dass ich WindowsCE benutze...also mit VisualStudio Embedded 4.0 programmiere....

Und zweitens: was müsste man tun, damit die ListItems größer werden??....Da ich einen Touchscreen haben, müssen die einfach n bissl größer sein, als normal...

Besten Dank....



Zitat von mmc20:
hi, also wenns nur um farben geht... da hab ich mal (vor langer, langer zeit) was "gebastelt"

C++:
/////////////////////////////////////////////////////////////////////////////
// XListCtrl.h

class XListCtrl : public CListCtrl
{
// Konstruktion
public:
    XListCtrl();

private:
    struct MEMBERS {
        COLORREF crText1, crText2, crTextBk1, crTextBk2;
    } m;

// Überschreibungen
    // Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen
    //{{AFX_VIRTUAL(XListCtrl)
    //}}AFX_VIRTUAL

// Implementierung
public:
    void SetTextColors(COLORREF col1, COLORREF col2);
    void SetBkColors(COLORREF col1, COLORREF col2);
    virtual ~XListCtrl();

    // Generierte Nachrichtenzuordnungsfunktionen
protected:
    //{{AFX_MSG(XListCtrl)
    afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////




C++:
/////////////////////////////////////////////////////////////////////////////
// XListCtrl.cpp

XListCtrl::XListCtrl()
{
    m.crText1 = m.crText2 = 0x000000;
    m.crTextBk1 = m.crTextBk2 = 0xFFFFFF;
}

XListCtrl::~XListCtrl()
{
}

BEGIN_MESSAGE_MAP(XListCtrl, CListCtrl)
    //{{AFX_MSG_MAP(XListCtrl)
    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// Behandlungsroutinen für Nachrichten XListCtrl

void XListCtrl::SetBkColors(COLORREF col1, COLORREF col2)
{
    m.crTextBk1 = col1;
    m.crTextBk2 = col2;
}

void XListCtrl::SetTextColors(COLORREF col1, COLORREF col2)
{
    m.crText1 = col1;
    m.crText2 = col2;
}

void XListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
    LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;

    if (lplvcd->nmcd.dwDrawStage == CDDS_PREPAINT) {
        *pResult = CDRF_NOTIFYITEMDRAW;
    } else
        if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) {
            *pResult = CDRF_NOTIFYSUBITEMDRAW;
            if ( (lplvcd->nmcd.dwItemSpec & 0x1) == 0 ) {
                lplvcd->clrText = m.crText1;
                lplvcd->clrTextBk = m.crTextBk1;
            } else {
                lplvcd->clrText = m.crText2;
                lplvcd->clrTextBk = m.crTextBk2;
            }
        } else
            if (lplvcd->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM)) {
                *pResult = CDRF_DODEFAULT;
            }
}

damit kannste jeder zweiten zeile eine andere farbe+hintergrundfarbe geben
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
22.02.2006, 11:39 Uhr
mmc20
puss in boots



Zitat von ~blub:
...aber bei mir im Resourceneditor hat die CListCtrl kein Ereignis NM_CUSTOMDRAW oder dergleichen...

bei mir auch nicht, desshalb hab ich dir ja die komplette klasse gepostet, da man das "per hand" eintragen muss.

das du mit CE arbeitest dürfte eigentlich kein problem sein, diese nachricht müsste auch CE kennen. ( trotzdem wär's besser wenn man sowas schon im ersten post erwähnt )

die items etwas höher machen... mh, am einfachsten legst du dir nen icon/bitmap an (zb. 50px hoch 2px breit) und benutzt das als imglist für das clistctrl, und nun fügst jedem item halt das 50pixel hohe und 1(oder2)pixel breite icon hinzu... fertig.
iss jetzt zwar nicht die eleganteste lösung, aber besser als jedes item selbst zu zeichnen.

Dieser Post wurde am 22.02.2006 um 11:49 Uhr von mmc20 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.02.2006, 10:16 Uhr
~blub
Gast


Hi mmmc20,

Danke für die erneute nachricht - ich werde das in den nächsten Tagen mal ausprobieren...

Das mit den Icons is ne gute idee, da ich eh Icons für die ListItems verwende...

Noch mal zu der CUSTOMDRAW-Nachricht....verstehe ich dich richtig, dass das ne rein userdefinierte Nachricht ist, die ich selber mit #define anlegen muß und z.b. auch NM_IRGENDWAS nennen könnte, oder ist das schon ne vordefinierte Windowsnachricht...??

Bis dann und besten Dank.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
23.02.2006, 13:45 Uhr
xXx
Devil


das ist ne vordefinierte... müsste zumindest
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
24.02.2006, 15:05 Uhr
~blub
Gast



Zitat von xXx:
das ist ne vordefinierte... müsste zumindest



Achja, ganz wichtig....WIE muß ich denn diese Nachricht genau absenden???....Ich meine irgendwo muß ich ja dann in meinem Programm mal sowas machen, wie

getListCtrl().SendMessage(NM_CUSTOMDRAW, lParam, wParam)

Wo kommt diese pNMHDR-Struktur rein und vor allen Dingen, wie initialisiere ich diese Struktur richtig....ich hatte nämlich schon mal versucht, eine WM_DRAWITEM-Nachricht zu senden, und da mußte auch irgrendso eine Struktur richtig initialisiert werden, was meinermeinung nach gar nicht so einfach ist, wenn man das noch nie gemacht hat....

....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: