[C++/Win32]TreeView item van kleur laten veranderen

Pagina: 1
Acties:
  • 118 views sinds 30-01-2008
  • Reageer

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 27-04 15:03
Goedenavond,

Ik heb een Win32-applicatie gemaakt mbv C++. Hier zit ook een treeview in en wat ik nu wil is bepaalde treeview-items van kleur laten veranderen.

Ik heb me echt platge-Google-d, ge-MSND-ed, ge-GOT, maar ik kan niets vinden wat mijn probleem oplost/help..

Wel heb ik dit gevonden:
code:
1
TreeView_SetTextColor(HWND, LPARAM)
maar die geeft de hele treeview dezelfde kleur, niet alleen het meegegeven item..

Wie kan mij helpen? Alvast bedankt! :)

  • BRAINLESS01
  • Registratie: April 2003
  • Laatst online: 06-05 22:31
Je studeert niet toevallig Informatica op het Windesheim in Zwolle? ;)

Waar je op moet zoeken is Owner Drawn ListView (of ListBox, dat weet ik niet meer). Ja, jij zoekt een TreeView en dat is dit niet, maar de code is praktisch hetzelfde en in de MSDN editie van 1998 stond een voorbeeld voor ListViews. In de nieuwere edities is het volgens mij verwijderd, omdat Microsoft liever ziet dat je .NET of MFC ofzo gebruikt.

Ik kan me voorstellen dat je deze versie niet meer hebt, maar als je inderdaad op Windesheim studeert heet de vakdocent wel een kopietje voor je liggen. Als ik me niet vergis is de deadline heel binnenkort dus misschien kun je beter zorgen dat de rest van je applicatie perfect is en hierbij aangeven dat je te weinig tijd had O-)

  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 27-04 15:03
_BRAINLESS schreef op donderdag 02 juni 2005 @ 22:08:
Je studeert niet toevallig Informatica op het Windesheim in Zwolle? ;)

Waar je op moet zoeken is Owner Drawn ListView (of ListBox, dat weet ik niet meer). Ja, jij zoekt een TreeView en dat is dit niet, maar de code is praktisch hetzelfde en in de MSDN editie van 1998 stond een voorbeeld voor ListViews. In de nieuwere edities is het volgens mij verwijderd, omdat Microsoft liever ziet dat je .NET of MFC ofzo gebruikt.

Ik kan me voorstellen dat je deze versie niet meer hebt, maar als je inderdaad op Windesheim studeert heet de vakdocent wel een kopietje voor je liggen. Als ik me niet vergis is de deadline heel binnenkort dus misschien kun je beter zorgen dat de rest van je applicatie perfect is en hierbij aangeven dat je te weinig tijd had O-)
Hoe raad je het zo :p

Onze deadline is volgende week, maar daarna hebben we nog 1/2 weken.. en de rest van de applicatie werkt goed geneog :p

Bedankt in ieder geval, ik zal even zoeken :D

  • BRAINLESS01
  • Registratie: April 2003
  • Laatst online: 06-05 22:31
Loop dan even langs bij Jan van Reijn (4e verdieping, linkerkant van het gebouw als je voor de lift staat), hij heeft die cdtjes liggen... ;)

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
Hmmm... Ik dacht dat het wel mogelijk moest zijn, maar nav dit artikel blijkt het niet mogelijk te zijn maar geven ze wel een workaround.

offtopic:
Hey, als je idd op Windesheim studeert ben je zeker met het PSP programmaatje bezig? Ikzelf ben net afgelopen februari afgestudeerd :)


edit:

Wij hadden het toentertijd opgelost met verschillende kleuren icoontjes. Is veel makkelijker te implementeren!

[ Voor 15% gewijzigd door riezebosch op 02-06-2005 22:13 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • aaajeetee
  • Registratie: Augustus 2002
  • Laatst online: 27-04 15:03
Idd dat PSP-ding ja..
Wij hebben gevraagd naar die iccontjes, maar het moest óf kleuren, óf icoontjes samen met kleuren.. dusja :D

  • BRAINLESS01
  • Registratie: April 2003
  • Laatst online: 06-05 22:31
riezebosch schreef op donderdag 02 juni 2005 @ 22:11:
Hmmm... Ik dacht dat het wel mogelijk moest zijn, maar nav dit artikel blijkt het niet mogelijk te zijn maar geven ze wel een workaround.
[/edit]
Dat wat ze in het artikel gebruiken is toch MFC? In ieder geval, dat mogen ze niet gebruiken (zo ver ik weet), omdat je alles zelf moet doen ofzo. Ik weet dat het wel mogelijk is, omdat ik het vorig jaar ook gemaakt heb. We waren toen het enige groepje met kleurtjes, dus als je het niet hebt is dat geen probleem. Van de andere kant, ik weet dat er dit jaar minstens 2 groepjes zijn die weten hoe het moet... ;) O-)

  • neevedr
  • Registratie: November 2002
  • Laatst online: 08:19

neevedr

Dat was ik niet!

Dan is dit waarschijnlijk jouw code:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
LRESULT CTreeView::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    LPNMTVCUSTOMDRAW pTVCD = 0;
    LPTREEVIEWITEM tv_info = 0;
    CInfo * pkItem = 0;
    bool bItemSelected = false;

    LPNMTREEVIEW pnm = (LPNMTREEVIEW)lParam;

    switch (pnm->hdr.code)
    {
        case NM_CUSTOMDRAW:
            pTVCD = (LPNMTVCUSTOMDRAW)lParam;

            if(pTVCD->nmcd.dwDrawStage == CDDS_PREPAINT)
            {
                // Request prepaint notifications for each item.
                return CDRF_NOTIFYITEMDRAW;
            }

            if(pTVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
            {
                if ((pTVCD->nmcd.uItemState & CDIS_SELECTED) == CDIS_SELECTED)
                {
                    bItemSelected = true;
                }
                else
                {
                    bItemSelected = false;
                }

                if (tv_info = (LPTREEVIEWITEM)pTVCD->nmcd.lItemlParam)
                {
                    pkItem = m_pkMainWindow->GetParent()->GetProject(tv_info->ProjectID);

                    if(!pkItem)
                    {
                        return CDRF_DODEFAULT;
                    }

                    if (tv_info->ActivityID > -1)
                    {
                        // This is an activity
                        pkItem = ((CProject*)pkItem)->GetActivity(tv_info->ActivityID);

                        if (!pkItem)
                        {
                            return CDRF_DODEFAULT;
                        }
                    } // else: this is a project, but we've already got that
    
                    // skip this check if GetDeadline is 0
                    if (pkItem->GetDeadline() && pkItem->GetDeadline() < GetCurrentTime())
                    {
                        // This project is over its deadline.
                        
                        if (!bItemSelected)
                        {
                            // Set text color to RED
                            pTVCD->clrText = RGB(255, 0, 0);
                        }
                        else
                        {
                            // Set background color to RED
                            pTVCD->clrTextBk = RGB(255, 0, 0);
                        }
                    }
                    
                    if (pkItem->GetStatus() == Beeindigd || pkItem->GetStatus() == Geblokkeerd)
                    {
                        if (!bItemSelected)
                        {
                            // Set text color to BLUE
                            pTVCD->clrText = RGB(0, 0, 255);
                        }
                        else
                        {
                            // Set background color to BLUE
                            pTVCD->clrTextBk = RGB(0, 0, 255);
                        }
                    }
                }

                return CDRF_DODEFAULT;
            }
            break;
        
        case TVN_SELCHANGED:
            if(((LPNMHDR) lParam)->idFrom != ID_TREEVIEW)
                break;

            if (!m_pkMainWindow)
                return 0;

            pkItem = m_pkMainWindow->GetTreeView()->GetSelectedObject();

            if (pkItem)
                m_pkMainWindow->TreeViewObjectSelected(pkItem);
            
            break;

        default:
            break;
    }

    return 0;
}

Heb er zelf vorig jaar ook naar gezocht, maar dit is niet te vinden online. Succes verder met het project. Om de kleurtjes in de listview te krijgen werkt op een soort gelijke manier.

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
_BRAINLESS schreef op donderdag 02 juni 2005 @ 22:19:
[...]

Dat wat ze in het artikel gebruiken is toch MFC? In ieder geval, dat mogen ze niet gebruiken (zo ver ik weet), omdat je alles zelf moet doen ofzo. Ik weet dat het wel mogelijk is, omdat ik het vorig jaar ook gemaakt heb. We waren toen het enige groepje met kleurtjes, dus als je het niet hebt is dat geen probleem. Van de andere kant, ik weet dat er dit jaar minstens 2 groepjes zijn die weten hoe het moet... ;) O-)
Net of MFC zo moeilijk te converteren is naar Win32. Het blijft tenslotte maar een wrapper :P

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • BoomSmurf
  • Registratie: Maart 2003
  • Laatst online: 13-06-2025

BoomSmurf

Am-Ende!

Ik ken maar een weinig C++ en ook niet veel van het GUI deel van de Win32 API, maar voor vrijwel elke common control is de procedure ongeveer zo:

- Zorg dat je control ownerdrawn is
- Vang het draw event van elke item af (niet wm_paint)
- Stel daarin je preferenties voor het DC in (hier dus de tekstkleur)
- Roep de standaardprocedure aan voor het tekenen van het item (of teken het zelf)

  • Miezie
  • Registratie: Januari 2002
  • Laatst online: 05-05 09:55

Miezie

Niet te moeilijk doen...

_BRAINLESS schreef op donderdag 02 juni 2005 @ 22:19:
[...]

Dat wat ze in het artikel gebruiken is toch MFC? In ieder geval, dat mogen ze niet gebruiken (zo ver ik weet), omdat je alles zelf moet doen ofzo. Ik weet dat het wel mogelijk is, omdat ik het vorig jaar ook gemaakt heb. We waren toen het enige groepje met kleurtjes, dus als je het niet hebt is dat geen probleem. Van de andere kant, ik weet dat er dit jaar minstens 2 groepjes zijn die weten hoe het moet... ;) O-)
ej kerel,

Het gaat ons wel lukken, moet je alleen me wel ff aanwijzen waar in de source je kleurtjes stonden O-) aangezien het zowel in de applicatie van jullie (na compilen) niet werkt en ik het ook niet kan vinden :'(

off-topic: één van de groepen is wle heel duf bezig }:O

KISS | Huis: A++++ | Zon: SolarEdge 10k Homehub, 13kWp, 19,4kWh accu’s, One Pro EV Charger | MV: DucoBox Focus | Warmtepomp: ME Ecodan SW75YAA met EHST20D | Tuin: natuurinclusief | Auto: Audi Q4 etron


  • BRAINLESS01
  • Registratie: April 2003
  • Laatst online: 06-05 22:31
neevedr schreef op donderdag 02 juni 2005 @ 22:39:
Dan is dit waarschijnlijk jouw code:
C++:
1
...

Heb er zelf vorig jaar ook naar gezocht, maar dit is niet te vinden online. Succes verder met het project. Om de kleurtjes in de listview te krijgen werkt op een soort gelijke manier.
Lekker handig om dat hier neer te zetten, docenten kijken ook wel eens op tweakers.net |:(

Maar het is wel mijn code inderdaad, hehe

@minze: zie: RGB(...) in de code hierboven ;)

Overigens stond in onze MainWindow::MsgProc() ook een stukje code om die "NM_CUSTOMDRAW" bij de treeview te krijgen. Die heb je dus ook nodig om het werkend te krijgen.
Pagina: 1