Changer couleur par un clique [Win32 sans MFC]

Signaler
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007
-
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
-
Bonjour,


j'aimerai pouvoir changer la couleur de fond d'un static, ou meme d'un
element picture (mon but et juste d avoir un carré rempli d'une
couleur) en cliquant sur des boutons! Par exemple j'ai deux boutons,
lorsque je clique sur le premier, le static se colorie en bleue, et l
autre bouton le colorie en rouge!


J'ai cherché un moment sur ce site, mais je ne trouve que des sources
expliquant comment definire ces couleurs de fond au chargement!

Et quand je tatais les codes pour comprendre, bah ca me definissait
tous mes statics de mon dialog de la meme couleur de fond alor que je
definissais bien le mon HDC...


Merci de m'aider en m indiquant la procedure!


Jojo

18 réponses

Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Si ca marche au chargement pourquoi ca marche pas lors d'un click ?
Tu bosses avec quoi ? WM_CTLCOLORSTATIC WM_PAINT WM_ERASEBACKGROUNG .....
IL y a plusieurs moyens d obtenir ca, tu as commencer a programmer avec quoi ?
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut :

Supposons qu'on a :

         ---------------------
         |     ID_STATIC     |
         ---------------------

  ------------            ------------
  | ID_ROUGE |            |  ID_BLUE |
  ------------            ------------

// Variables globales
COLORREF clrBr = RGB (0x00, 0x00, 0x00);
RECT     rect;

// Procédure : WndProc
LRESULT CALLBACK WndProc (HWND   hDlg,
                          UINT   uMsg,
                          WPARAM wParam,
                          LPARAM lParam)
{
      int         choice;
      HDC         hDC;
      HWND        hWnd;
      PAINTSTRUCT ps;

      switch (uMsg) {
      case WM_COMMAND:
           choice = LOWORD (wParam);
           switch (choice) {
           case ID_ROUGE:
                hWnd =
GetDlgItem (hWnd, ID_ROUGE)


                GetClientRect (hWnd, &rect);
                return TRUE;

           case ID_BLUE:
               
hWnd =
GetDlgItem (hWnd, ID_ROUGE)



                GetClientRect (hWnd, &rect);


                return FALSE;

           default:
                return FALSE;
           }
           break;
      case WM_PAINT:
           hDC = BeginPaint (hDlg, &ps);
           FillRect (hDC,
                     &rect,
                     CreateSolidBrush (clrBr));
           EndPaint (hDlg, &ps);
           break;
      // ...
      }
}
 
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut :

J'ai oublié d'ajouter :


case ID_ROUGE:
                hWnd =
GetDlgItem (hWnd, ID_ROUGE)


                GetClientRect (hWnd, &rect);
                clrBr = RGB (0xFF, 0x00, 0x00);
                return TRUE;

case ID_BLUE:
               
hWnd =
GetDlgItem (hWnd, ID_ROUGE)


                GetClientRect (hWnd, &rect);

                                        clrBr = RGB (0x00, 0x00, 0xFF);
                return FALSE;
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

Je vois, mais ou dis tu que le ID_STATIC devient de la couleur desiré?

Mon truc est un chouillat plus compliqué je t'explique

Dans ma fenetre de dialogue j'ai un treeview et plusieur static dont mon ID_COULEUR_FOND

j'aimerai que lorsque je clique sur un element de mon treeview que le static change de couleur.

Pour l'exemple on dira que le case 1 mon static ID_COULEUR_FOND a une
couleur background noir, case 2 il est bleu... et ainsi de suite.

Si vous pensez que je devrai utiliser un autre type que le static pour
arriver a mon but y a pas de souci! Ce que je veux c'est betement un
carré rempli d'une couleur!


Je code sous VSC++ 6 en API win32 sans MFC


Voici mon code: avec indication de l'endroit ou l'action doit changer la couleur:

#include <windows.h>

#include "General.h"

#include "resource.h"


STVMain objTreeView;    // les données du TreeView


HTREEITEM tvInsertItem(HWND hWnd,HTREEITEM parentItem,LPSTR strText,bool itemChild,long itemParam, bool ItemChecked) {

    TVINSERTSTRUCT tviStr;

    ZeroMemory(&tviStr,sizeof(TVINSERTSTRUCT));

    tviStr.hParent = parentItem;

    tviStr.hInsertAfter = TVI_LAST;

    tviStr.item.pszText = strText;

    tviStr.item.cchTextMax = strlen(strText);

    tviStr.item.cChildren = itemChild;

    tviStr.item.lParam = itemParam;

    tviStr.item.state = NULL;

    tviStr.item.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM | TVIF_STATE;

    return TreeView_InsertItem(GetDlgItem(hWnd,ID_TREE), (LPTVINSERTSTRUCT) &tviStr);

}


void tvItemLeftClick(HWND hWnd) {

    TVITEM tvItem;

    ZeroMemory(&tvItem,sizeof(TVITEM));

    tvItem.hItem = TreeView_GetSelection(GetDlgItem(hWnd,ID_TREE));

    tvItem.mask = TVIF_PARAM;

    ListView_GetCheckState(hWnd, ID_TREE);

    TreeView_GetItem(GetDlgItem(hWnd,ID_TREE),&tvItem);

    switch(tvItem.lParam) {

    case 1: // PREMIER CAS OU LE STATIC DEVRAI PASSER D'UNE CERTAIN COULEUR

        SetDlgItemText(hWnd,ID_TITRE,"Aucune couche séléctionnée");

        EnableItems(hWnd, false);

        SelectedLayer = -1;

        CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

       

        break;

    case 2:
// DEUXEME CAS OU LE STATIC DEVRAI PASSER D'UNE CERTAIN COULEUR

        SetDlgItemText(hWnd,ID_TITRE,"Couche NWell");

        EnableItems(hWnd, true);

               

        SelectedLayer = INDICE_NWELL;

        if(LNWell.visible==true)

            CheckDlgButton(hWnd, ID_CHECK,BST_CHECKED);

        else

            CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

        break;

    case 3:
// ET AINSI DE SUITE

        SetDlgItemText(hWnd,ID_TITRE,"Couche Active ");

        EnableItems(hWnd, true);

        SelectedLayer = INDICE_ACTIVE;

        if(LActive.visible==true)

            CheckDlgButton(hWnd, ID_CHECK,BST_CHECKED);

        else

            CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

        break;

    case 4:

        SetDlgItemText(hWnd,ID_TITRE,"Couche Cont");

        EnableItems(hWnd, true);

        SelectedLayer = INDICE_CONT;

        if(LCont.visible==true)

            CheckDlgButton(hWnd, ID_CHECK,BST_CHECKED);

        else

            CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

        break;

    case 5:

        SetDlgItemText(hWnd,ID_TITRE,"Couche Metal1");

        EnableItems(hWnd, true);

        SelectedLayer = INDICE_METAL1;

        if(LMetal1.visible==true)

            CheckDlgButton(hWnd, ID_CHECK,BST_CHECKED);

        else

            CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

        break;

    case 6:

        SetDlgItemText(hWnd,ID_TITRE,"Couche Metal2");

        EnableItems(hWnd, true);

        SelectedLayer = INDICE_METAL2;

        if(LMetal2.visible==true)

            CheckDlgButton(hWnd, ID_CHECK,BST_CHECKED);

        else

            CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

        break;

   

    }

       

}


void InitTreeViewListe(HWND hWnd) {

    STVGroup tvGroup;

    char buftmp[256];

    int NumCouche=0;


    ZeroMemory(&tvGroup,sizeof(STVGroup));

    objTreeView.hMainItem = tvInsertItem(hWnd,NULL,objTreeView.mainName,1,1, true);


    if(LNWell.num_quads>0)

    {

        sprintf(buftmp,"NWell (%d éléments)",LNWell.num_quads);

        objTreeView.hItem_NWell = tvInsertItem(hWnd,objTreeView.hMainItem,buftmp,0,2, true);


    }

    if(LActive.num_quads>0)

    {

        sprintf(buftmp,"Active (%d éléments)",LActive.num_quads);

        objTreeView.hItem_Active = tvInsertItem(hWnd,objTreeView.hMainItem,buftmp,0,3, true);

    }

    if(LCont.num_quads>0)

    {

        sprintf(buftmp,"Cont (%d éléments)",LCont.num_quads);

        objTreeView.hItem_Cont = tvInsertItem(hWnd,objTreeView.hMainItem,buftmp,0,4, true);

    }

    if(LMetal1.num_quads>0)

    {

        sprintf(buftmp,"Metal1 (%d éléments)",LMetal1.num_quads);

        objTreeView.hItem_Metal1 = tvInsertItem(hWnd,objTreeView.hMainItem,buftmp,0,5, true);

    }

    if(LMetal2.num_quads>0)

    {

        sprintf(buftmp,"Metal2 (%d éléments)",LMetal2.num_quads);

        objTreeView.hItem_Metal2 = tvInsertItem(hWnd,objTreeView.hMainItem,buftmp,0,6, true);

    }

   

}


// la procédure CallBack pour la gestion du treeview

LRESULT CALLBACK DlgTreeViewProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam) {

    switch(msg) {

    case WM_NOTIFY:

        switch(wParam) {

        case ID_TREE:

            UINT cde = ((LPNMHDR)lParam)->code;

            switch(((LPNMHDR)lParam)->code) {

            case TVN_SELCHANGED:

                tvItemLeftClick(hDlg);

                break;

            }

            break;

        }

        break;

    case WM_CONTEXTMENU:

        POINT mpt;

        GetCursorPos(&mpt); // coordonnées de la souris par rapport à l'ecran

        ScreenToClient(GetDlgItem(hDlg,
ID_TREE), &mpt); // convertion pour qu'elles soient par rapport au
Treeview

        TV_HITTESTINFO tvHit; // on récupère l'item survolé par la souris

        tvHit.pt = mpt;

        break;

       

    case WM_KEYUP:

    case WM_KEYDOWN:

        break;

    case WM_INITDIALOG:

        InitTreeViewListe(hDlg);

        TreeView_Expand(GetDlgItem(hDlg, ID_TREE),objTreeView.hMainItem,TVE_EXPAND);

        break;

    case WM_COMMAND:

        switch (wParam) {

        case ID_CHECK:

            if(SelectedLayer == INDICE_NWELL)

                LNWell.visible= Inv(LNWell.visible);

            if(SelectedLayer == INDICE_ACTIVE)

                LActive.visible= Inv(LActive.visible);

            if(SelectedLayer == INDICE_CONT)

                LCont.visible= Inv(LCont.visible);

            if(SelectedLayer == INDICE_METAL1)

                LMetal1.visible= Inv(LMetal1.visible);

            if(SelectedLayer == INDICE_METAL2)

                LMetal2.visible= Inv(LMetal2.visible);

            break;

        }


    case WM_SYSCOMMAND:

        switch(wParam) {

        case SC_CLOSE: // on empêche de fermer la fenêtre du TreeView

            return 1;

            break;

        }

        return false;

    case WM_CLOSE: // gère la fermeture de la fenêtre

        TreeView_DeleteAllItems(GetDlgItem(hDlg,ID_TREE)); // supprime tous les items

        tvhDlg = NULL; // reset le pointeur de la fenêtre

        EndDialog(hDlg,0); // et la détruit

        return 1;

    }

    return 0;

}


// crée la fenêtre pour le treeview et la remplie avec les infos

bool InitTreeView(const char *mainName) {

    INITCOMMONCONTROLSEX TV_Init_Str;

    TV_Init_Str.dwSize = sizeof(INITCOMMONCONTROLSEX);

    TV_Init_Str.dwICC = ICC_TREEVIEW_CLASSES ;

    InitCommonControlsEx(&TV_Init_Str); // charge les dll utiles pour la gestion du treeview


    objTreeView.mainName = mainName;

    objTreeView.mainName.Cut(objTreeView.mainName.FindFromEnd('\\')+1,objTreeView.mainName.GetLength());

    tvhDlg = CreateDialog(hInstance, MAKEINTRESOURCE(ID_CONTROL), hWnd, (DLGPROC)DlgTreeViewProc);


    return (tvhDlg)?true:false;

}


bool Inv(bool toInv)

{

    if(toInv==true)

        return false;

    else

        return true;

}


void EnableItems(HWND hWnd, bool Set)

{

    EnableWindow(GetDlgItem(hWnd,ID_LAYER),Set);

    EnableWindow(GetDlgItem(hWnd,ID_VISIBILITE),Set);

    EnableWindow(GetDlgItem(hWnd,ID_COULEUR_COUCHE),Set);

    EnableWindow(GetDlgItem(hWnd,ID_CHECK),Set);

    EnableWindow(GetDlgItem(hWnd,ID_HAUTEUR),Set);

    EnableWindow(GetDlgItem(hWnd,ID_SLIDE_HAUTEUR),Set);

    EnableWindow(GetDlgItem(hWnd,ID_SLIDE_ALPHA),Set);

    EnableWindow(GetDlgItem(hWnd,ID_STATIC),Set);

    EnableWindow(GetDlgItem(hWnd,ID_CACHER),Set);

}


Encore merci!
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut :

As tu testé mon code?

Une petite rectification :


// Variables globales
COLORREF clrBr = RGB (0xFF, 0x00, 0x00);
RECT     rect;

// Procédure : WndProc
LRESULT CALLBACK WndProc (HWND   hDlg,
                          UINT   uMsg,
                          WPARAM wParam,
                          LPARAM lParam)
{
      int         choice;
      HDC         hDC;
      HWND        hWnd;
      PAINTSTRUCT ps;

      switch (uMsg) {
      case WM_COMMAND:
           choice = LOWORD (wParam);
           switch (choice) {
           case ID_ROUGE:
                hWnd =
GetDlgItem (hWnd, ID_STATIC);


                GetClientRect (hWnd, &rect);
               
clrBr = RGB (0xFF, 0x00, 0x00);

                SendMessage (hDlg, WM_PAINT, 0, 0);


                return TRUE;

           case ID_BLUE:
                
hWnd =
GetDlgItem (hWnd, ID_STATIC)


                GetClientRect (hWnd, &rect);

                                        clrBr = RGB (0x00, 0x00, 0xFF);
                SendMessage (hDlg, WM_PAINT, 0, 0);
                return FALSE;

           default:
                return FALSE;
           }
           break;
      case WM_PAINT:
           hDC = BeginPaint (hDlg, &ps);
           FillRect (hDC,
                     &rect,
                     CreateSolidBrush (clrBr));
           EndPaint (hDlg, &ps);
           break;
      // ...
      }
}
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
SendMessage (hDlg, WM_PAINT, 0, 0); ne sert a rien si aucune zone n'est invalidée auparavant avec InvalidateRect

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

oui, voila les changement que j'ai fait en essayant d inserer ton code... mais ca change rien :(

Qu'ai je fais de faux?

Vraiment merci pour ton aide

#include <windows.h>

#include "General.h"

#include "resource.h"


STVMain objTreeView;    // les données du TreeView
COLORREF clrBr = RGB (0xFF, 0x00, 0x00);

RECT     rect;


HTREEITEM tvInsertItem(HWND hWnd,HTREEITEM parentItem,LPSTR strText,bool itemChild,long itemParam, bool ItemChecked) {

    TVINSERTSTRUCT tviStr;

    ZeroMemory(&tviStr,sizeof(TVINSERTSTRUCT));

    tviStr.hParent = parentItem;

    tviStr.hInsertAfter = TVI_LAST;

    tviStr.item.pszText = strText;

    tviStr.item.cchTextMax = strlen(strText);

    tviStr.item.cChildren = itemChild;

    tviStr.item.lParam = itemParam;

    tviStr.item.state = NULL;

    tviStr.item.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM | TVIF_STATE;

    return TreeView_InsertItem(GetDlgItem(hWnd,ID_TREE), (LPTVINSERTSTRUCT) &tviStr);

}


void tvItemLeftClick(HWND hWnd) {

    TVITEM tvItem;

    ZeroMemory(&tvItem,sizeof(TVITEM));

    tvItem.hItem = TreeView_GetSelection(GetDlgItem(hWnd,ID_TREE));

    tvItem.mask = TVIF_PARAM;

    ListView_GetCheckState(hWnd, ID_TREE);

    TreeView_GetItem(GetDlgItem(hWnd,ID_TREE),&tvItem);

    switch(tvItem.lParam) {

    case 1:

        SetDlgItemText(hWnd,ID_TITRE,"Aucune couche séléctionnée");

        EnableItems(hWnd, false);

        SelectedLayer = -1;

        CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

       

        break;

    case 2:

        SetDlgItemText(hWnd,ID_TITRE,"Couche NWell");

       


        EnableItems(hWnd, true);

   

        SelectedLayer = INDICE_NWELL;

        if(LNWell.visible==true)

            CheckDlgButton(hWnd, ID_CHECK,BST_CHECKED);

        else

            CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

            hWnd =  GetDlgItem (hWnd, ID_COULEUR_FOND);

                GetClientRect (hWnd, &rect);

                clrBr = RGB (0xFF, 0x00, 0x00);

                SendMessage (hWnd, WM_PAINT, 0, 0);

               

        break;

    case 3:

        SetDlgItemText(hWnd,ID_TITRE,"Couche Active ");

        EnableItems(hWnd, true);

        SelectedLayer = INDICE_ACTIVE;

        if(LActive.visible==true)

            CheckDlgButton(hWnd, ID_CHECK,BST_CHECKED);

        else

            CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

        break;

    case 4:

        SetDlgItemText(hWnd,ID_TITRE,"Couche Cont");

        EnableItems(hWnd, true);

        SelectedLayer = INDICE_CONT;

        if(LCont.visible==true)

            CheckDlgButton(hWnd, ID_CHECK,BST_CHECKED);

        else

            CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

        break;

    case 5:

        SetDlgItemText(hWnd,ID_TITRE,"Couche Metal1");

        EnableItems(hWnd, true);

        SelectedLayer = INDICE_METAL1;

        if(LMetal1.visible==true)

            CheckDlgButton(hWnd, ID_CHECK,BST_CHECKED);

        else

            CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

        break;

    case 6:

        SetDlgItemText(hWnd,ID_TITRE,"Couche Metal2");

        EnableItems(hWnd, true);

        SelectedLayer = INDICE_METAL2;

        if(LMetal2.visible==true)

            CheckDlgButton(hWnd, ID_CHECK,BST_CHECKED);

        else

            CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

        break;

   

    }

       

}


void InitTreeViewListe(HWND hWnd) {

    STVGroup tvGroup;

    char buftmp[256];

    int NumCouche=0;


    ZeroMemory(&tvGroup,sizeof(STVGroup));

    objTreeView.hMainItem = tvInsertItem(hWnd,NULL,objTreeView.mainName,1,1, true);


    if(LNWell.num_quads>0)

    {

        sprintf(buftmp,"NWell (%d éléments)",LNWell.num_quads);

        objTreeView.hItem_NWell = tvInsertItem(hWnd,objTreeView.hMainItem,buftmp,0,2, true);


    }

    if(LActive.num_quads>0)

    {

        sprintf(buftmp,"Active (%d éléments)",LActive.num_quads);

        objTreeView.hItem_Active = tvInsertItem(hWnd,objTreeView.hMainItem,buftmp,0,3, true);

    }

    if(LCont.num_quads>0)

    {

        sprintf(buftmp,"Cont (%d éléments)",LCont.num_quads);

        objTreeView.hItem_Cont = tvInsertItem(hWnd,objTreeView.hMainItem,buftmp,0,4, true);

    }

    if(LMetal1.num_quads>0)

    {

        sprintf(buftmp,"Metal1 (%d éléments)",LMetal1.num_quads);

        objTreeView.hItem_Metal1 = tvInsertItem(hWnd,objTreeView.hMainItem,buftmp,0,5, true);

    }

    if(LMetal2.num_quads>0)

    {

        sprintf(buftmp,"Metal2 (%d éléments)",LMetal2.num_quads);

        objTreeView.hItem_Metal2 = tvInsertItem(hWnd,objTreeView.hMainItem,buftmp,0,6, true);

    }

   

}


// la procédure CallBack pour la gestion du treeview

LRESULT CALLBACK DlgTreeViewProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam) {

   

    PAINTSTRUCT ps;

    HDC         hDC;


    switch(msg) {

    case WM_NOTIFY:

        switch(wParam) {

        case ID_TREE:

            UINT cde = ((LPNMHDR)lParam)->code;

            switch(((LPNMHDR)lParam)->code) {

            case TVN_SELCHANGED:

                tvItemLeftClick(hDlg);

                break;

            }

            break;

        }

        break;

    case WM_CONTEXTMENU:

        POINT mpt;

        GetCursorPos(&mpt); // coordonnées de la souris par rapport à l'ecran

        ScreenToClient(GetDlgItem(hDlg,
ID_TREE), &mpt); // convertion pour qu'elles soient par rapport au
Treeview

        TV_HITTESTINFO tvHit; // on récupère l'item survolé par la souris

        tvHit.pt = mpt;

        break;

       

    case WM_KEYUP:

    case WM_KEYDOWN:

        break;

    case WM_INITDIALOG:

        InitTreeViewListe(hDlg);

        TreeView_Expand(GetDlgItem(hDlg, ID_TREE),objTreeView.hMainItem,TVE_EXPAND);

        break;

    case WM_COMMAND:

        switch (wParam) {

        case ID_CHECK:

            if(SelectedLayer == INDICE_NWELL)

                LNWell.visible= Inv(LNWell.visible);

            if(SelectedLayer == INDICE_ACTIVE)

                LActive.visible= Inv(LActive.visible);

            if(SelectedLayer == INDICE_CONT)

                LCont.visible= Inv(LCont.visible);

            if(SelectedLayer == INDICE_METAL1)

                LMetal1.visible= Inv(LMetal1.visible);

            if(SelectedLayer == INDICE_METAL2)

                LMetal2.visible= Inv(LMetal2.visible);

            break;

        }


    case WM_SYSCOMMAND:

        switch(wParam) {

        case SC_CLOSE: // on empêche de fermer la fenêtre du TreeView

            return 1;

            break;

        }

        return false;

    case WM_CLOSE: // gère la fermeture de la fenêtre

        TreeView_DeleteAllItems(GetDlgItem(hDlg,ID_TREE)); // supprime tous les items

        tvhDlg = NULL; // reset le pointeur de la fenêtre

        EndDialog(hDlg,0); // et la détruit

        return 1;


    case WM_PAINT:

           hDC = BeginPaint (hDlg, &ps);

           FillRect (hDC,

                    
&rect,

                    
CreateSolidBrush (clrBr));

           EndPaint (hDlg, &ps);

           break;

    }

    return 0;

}


// crée la fenêtre pour le treeview et la remplie avec les infos

bool InitTreeView(const char *mainName) {

    INITCOMMONCONTROLSEX TV_Init_Str;

    TV_Init_Str.dwSize = sizeof(INITCOMMONCONTROLSEX);

    TV_Init_Str.dwICC = ICC_TREEVIEW_CLASSES ;

    InitCommonControlsEx(&TV_Init_Str); // charge les dll utiles pour la gestion du treeview


    objTreeView.mainName = mainName;

    objTreeView.mainName.Cut(objTreeView.mainName.FindFromEnd('\\')+1,objTreeView.mainName.GetLength());

    tvhDlg = CreateDialog(hInstance, MAKEINTRESOURCE(ID_CONTROL), hWnd, (DLGPROC)DlgTreeViewProc);


    return (tvhDlg)?true:false;

}


bool Inv(bool toInv)

{

    if(toInv==true)

        return false;

    else

        return true;

}


void EnableItems(HWND hWnd, bool Set)

{

    EnableWindow(GetDlgItem(hWnd,ID_LAYER),Set);

    EnableWindow(GetDlgItem(hWnd,ID_VISIBILITE),Set);

    EnableWindow(GetDlgItem(hWnd,ID_COULEUR_COUCHE),Set);

    EnableWindow(GetDlgItem(hWnd,ID_CHECK),Set);

    EnableWindow(GetDlgItem(hWnd,ID_HAUTEUR),Set);

    EnableWindow(GetDlgItem(hWnd,ID_SLIDE_HAUTEUR),Set);

    EnableWindow(GetDlgItem(hWnd,ID_SLIDE_ALPHA),Set);

    EnableWindow(GetDlgItem(hWnd,ID_STATIC),Set);

    EnableWindow(GetDlgItem(hWnd,ID_CACHER),Set);

    EnableWindow(GetDlgItem(hWnd,ID_NUM_ALPHA),Set);

    EnableWindow(GetDlgItem(hWnd,ID_NUM_HAUTEUR),Set);

}
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut :

Donc on ajoute un InvalidateRect


case ID_ROUGE:
                hWnd =
GetDlgItem (hWnd, ID_STATIC);


                GetClientRect (hWnd, &rect);
               
clrBr = RGB (0xFF, 0x00, 0x00);
               

InvalidateRect (hDlg, &rect, FALSE);



                SendMessage (hDlg, WM_PAINT, 0, 0);


                return TRUE;
case ID_BLUE:
                
hWnd =
GetDlgItem (hWnd, ID_STATIC)


                GetClientRect (hWnd, &rect);

                                        clrBr = RGB (0x00, 0x00, 0xFF);
                InvalidateRect (hDlg, &rect, FALSE);
                SendMessage (hDlg, WM_PAINT, 0, 0);
                return FALSE;
}
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

MErci pour ton aide, ca marche presque, le probleme c'est que ce n'est
pas mon mon static d'id ID_COULEUR_FOND qui se color en rouge, mais un
carré se créé en haut a gauche de ma fenetre de dialogue!

voila le code comme je l'ai reecris avec tes indications en rouge, peut etre que tu trouvera mon erreur!

Encore un grand merci!

#include <windows.h>

#include "resource.h"

#include "TreeView.h"

#include "General.h"


STVMain objTreeView;    // les données du TreeView
COLORREF clrBr = RGB (0xFF, 0x00, 0x00);

RECT     rect;


HTREEITEM tvInsertItem(HWND hWnd,HTREEITEM parentItem,LPSTR strText,bool itemChild,long itemParam, bool ItemChecked) {

    TVINSERTSTRUCT tviStr;

    ZeroMemory(&tviStr,sizeof(TVINSERTSTRUCT));

    tviStr.hParent = parentItem;

    tviStr.hInsertAfter = TVI_LAST;

    tviStr.item.pszText = strText;

    tviStr.item.cchTextMax = strlen(strText);

    tviStr.item.cChildren = itemChild;

    tviStr.item.lParam = itemParam;

    tviStr.item.state = NULL;

    tviStr.item.mask = TVIF_CHILDREN | TVIF_TEXT | TVIF_PARAM | TVIF_STATE;

    return TreeView_InsertItem(GetDlgItem(hWnd,ID_TREE), (LPTVINSERTSTRUCT) &tviStr);

}


void tvItemLeftClick(HWND hWnd) {
    HWND hWnd2;

    TVITEM tvItem;

    ZeroMemory(&tvItem,sizeof(TVITEM));

    tvItem.hItem = TreeView_GetSelection(GetDlgItem(hWnd,ID_TREE));

    tvItem.mask = TVIF_PARAM;

    ListView_GetCheckState(hWnd, ID_TREE);

    TreeView_GetItem(GetDlgItem(hWnd,ID_TREE),&tvItem);

    switch(tvItem.lParam) {

    case 1:

        SetDlgItemText(hWnd,ID_TITRE,"Aucune couche séléctionnée");

        EnableItems(hWnd , false);

        SelectedLayer = -1;

        CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

       

        break;

    case 2:

        SetDlgItemText(hWnd,ID_TITRE,"Couche NWell");

        if(LNWell.visible==true)

            CheckDlgButton(hWnd, ID_CHECK,BST_CHECKED);

        else

            CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

        EnableItems(hWnd, true);

        SelectedLayer = INDICE_NWELL;

        hWnd2 =  GetDlgItem(hWnd, ID_COULEUR_FOND);

                GetClientRect (hWnd2, &rect);

                clrBr = RGB (0xFF, 0x00, 0x00);

               
InvalidateRect (hWnd, &rect, FALSE);

                SendMessage (hWnd, WM_PAINT, 0, 0);

        break;

    case 3:

        SetDlgItemText(hWnd,ID_TITRE,"Couche Active ");

        if(LActive.visible==true)

            CheckDlgButton(hWnd, ID_CHECK,BST_CHECKED);

        else

            CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

        EnableItems(hWnd, true);

        SelectedLayer = INDICE_ACTIVE;

        break;

    case 4:

        SetDlgItemText(hWnd,ID_TITRE,"Couche Cont");

        if(LCont.visible==true)

            CheckDlgButton(hWnd, ID_CHECK,BST_CHECKED);

        else

            CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

        EnableItems(hWnd, true);

        SelectedLayer = INDICE_CONT;

        break;

    case 5:

        SetDlgItemText(hWnd,ID_TITRE,"Couche Metal1");

        if(LMetal1.visible==true)

            CheckDlgButton(hWnd, ID_CHECK,BST_CHECKED);

        else

            CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

        EnableItems(hWnd, true);

        SelectedLayer = INDICE_METAL1;

        break;

    case 6:

        SetDlgItemText(hWnd,ID_TITRE,"Couche Metal2");

        if(LMetal2.visible==true)

            CheckDlgButton(hWnd, ID_CHECK,BST_CHECKED);

        else

            CheckDlgButton(hWnd, ID_CHECK,BST_UNCHECKED);

        EnableItems(hWnd, true);

        SelectedLayer = INDICE_METAL2;

        break;

   

    }

       

}


void InitTreeViewListe(HWND hWnd) {

    STVGroup tvGroup;

    char buftmp[256];

    int NumCouche=0;


    ZeroMemory(&tvGroup,sizeof(STVGroup));

    objTreeView.hMainItem = tvInsertItem(hWnd,NULL,objTreeView.mainName,1,1, true);


    if(LNWell.num_quads>0)

    {

        sprintf(buftmp,"NWell (%d éléments)",LNWell.num_quads);

        objTreeView.hItem_NWell = tvInsertItem(hWnd,objTreeView.hMainItem,buftmp,0,2, true);


    }

    if(LActive.num_quads>0)

    {

        sprintf(buftmp,"Active (%d éléments)",LActive.num_quads);

        objTreeView.hItem_Active = tvInsertItem(hWnd,objTreeView.hMainItem,buftmp,0,3, true);

    }

    if(LCont.num_quads>0)

    {

        sprintf(buftmp,"Cont (%d éléments)",LCont.num_quads);

        objTreeView.hItem_Cont = tvInsertItem(hWnd,objTreeView.hMainItem,buftmp,0,4, true);

    }

    if(LMetal1.num_quads>0)

    {

        sprintf(buftmp,"Metal1 (%d éléments)",LMetal1.num_quads);

        objTreeView.hItem_Metal1 = tvInsertItem(hWnd,objTreeView.hMainItem,buftmp,0,5, true);

    }

    if(LMetal2.num_quads>0)

    {

        sprintf(buftmp,"Metal2 (%d éléments)",LMetal2.num_quads);

        objTreeView.hItem_Metal2 = tvInsertItem(hWnd,objTreeView.hMainItem,buftmp,0,6, true);

    }

   

}


// la procédure CallBack pour la gestion du treeview

LRESULT CALLBACK DlgTreeViewProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam) {

   

    PAINTSTRUCT ps;

    HDC         hDC;


    switch(msg) {

    case WM_NOTIFY:

        switch(wParam) {

        case ID_TREE:

            UINT cde = ((LPNMHDR)lParam)->code;

            switch(((LPNMHDR)lParam)->code) {

            case TVN_SELCHANGED:

                tvItemLeftClick(hDlg);

                break;

            }

            break;

        }

        break;

    case WM_CONTEXTMENU:

        POINT mpt;

        GetCursorPos(&mpt); // coordonnées de la souris par rapport à l'ecran

        ScreenToClient(GetDlgItem(hDlg,
ID_TREE), &mpt); // convertion pour qu'elles soient par rapport au
Treeview

        TV_HITTESTINFO tvHit; // on récupère l'item survolé par la souris

        tvHit.pt = mpt;

        break;

       

    case WM_KEYUP:

    case WM_KEYDOWN:

        break;

    case WM_INITDIALOG:

        InitTreeViewListe(hDlg);

        TreeView_Expand(GetDlgItem(hDlg, ID_TREE),objTreeView.hMainItem,TVE_EXPAND);

        break;

    case WM_COMMAND:

        switch (wParam) {

        case ID_CHECK:

            if(SelectedLayer == INDICE_NWELL)

                LNWell.visible= Inv(LNWell.visible);

            if(SelectedLayer == INDICE_ACTIVE)

                LActive.visible= Inv(LActive.visible);

            if(SelectedLayer == INDICE_CONT)

                LCont.visible= Inv(LCont.visible);

            if(SelectedLayer == INDICE_METAL1)

                LMetal1.visible= Inv(LMetal1.visible);

            if(SelectedLayer == INDICE_METAL2)

                LMetal2.visible= Inv(LMetal2.visible);

            break;

        }


    case WM_SYSCOMMAND:

        switch(wParam) {

        case SC_CLOSE: // on empêche de fermer la fenêtre du TreeView

            return 1;

            break;

        }

        return false;

    case WM_CLOSE: // gère la fermeture de la fenêtre

        TreeView_DeleteAllItems(GetDlgItem(hDlg,ID_TREE)); // supprime tous les items

        tvhDlg = NULL; // reset le pointeur de la fenêtre

        EndDialog(hDlg,0); // et la détruit

        return 1;


    case WM_PAINT:

           hDC = BeginPaint (hDlg, &ps);

           FillRect (hDC,

                    
&rect,

                    
CreateSolidBrush (clrBr));

           EndPaint (hDlg, &ps);

           break;

    }

    return 0;

}


// crée la fenêtre pour le treeview et la remplie avec les infos

bool InitTreeView(const char *mainName) {

    INITCOMMONCONTROLSEX TV_Init_Str;

    TV_Init_Str.dwSize = sizeof(INITCOMMONCONTROLSEX);

    TV_Init_Str.dwICC = ICC_TREEVIEW_CLASSES ;

    InitCommonControlsEx(&TV_Init_Str); // charge les dll utiles pour la gestion du treeview


    objTreeView.mainName = mainName;

    objTreeView.mainName.Cut(objTreeView.mainName.FindFromEnd('\\')+1,objTreeView.mainName.GetLength());

    tvhDlg = CreateDialog(hInstance, MAKEINTRESOURCE(ID_CONTROL), hWnd, (DLGPROC)DlgTreeViewProc);


    return (tvhDlg)?true:false;

}


bool Inv(bool toInv)

{

    if(toInv==true)

        return false;

    else

        return true;

}


void EnableItems(HWND hWnd, bool Set)

{

    EnableWindow(GetDlgItem(hWnd,ID_LAYER),Set);

    EnableWindow(GetDlgItem(hWnd,ID_VISIBILITE),Set);

    EnableWindow(GetDlgItem(hWnd,ID_COULEUR_COUCHE),Set);

    EnableWindow(GetDlgItem(hWnd,ID_CHECK),Set);

    EnableWindow(GetDlgItem(hWnd,ID_HAUTEUR),Set);

    EnableWindow(GetDlgItem(hWnd,ID_SLIDE_HAUTEUR),Set);

    EnableWindow(GetDlgItem(hWnd,ID_SLIDE_ALPHA),Set);

    EnableWindow(GetDlgItem(hWnd,ID_STATIC),Set);

    EnableWindow(GetDlgItem(hWnd,ID_CACHER),Set);

    EnableWindow(GetDlgItem(hWnd,ID_NUM_ALPHA),Set);

    EnableWindow(GetDlgItem(hWnd,ID_NUM_HAUTEUR),Set);

}
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut :

Je pense que tu dois faire un changement de repère :

ScreenToClient / ClientToScreen


case ID_ROUGE:


RECT  rc;
POINT pt;



SIZE  sz;



hWnd =
GetDlgItem (hWnd, ID_STATIC);



GetClientRect (hWnd, &rc);






pt.x = rc.top;

pt.y = rc.left;


sz.cx = (LONG) (rc.right - rc.left);
sz.cy = (LONG) (rc.bottom - rc.top);








il (!ScreenToClient (hDlg, &pt)) {
    MessageBox (NULL, "Conversion impossile", "Erreur", MB_OK);
    return TRUE;
}

SetRect (&rect, pt.x, pt.y, pt.x + sz.cx, pt.y + sz.cy);




 clrBr = RGB (0xFF, 0x00, 0x00);             
InvalidateRect (hDlg, &rect, FALSE);

// Je pense que tu peux supprimer cette ligne
// car "InvalidateRect" envoie un message WM_PAINT
//SendMessage (hDlg, WM_PAINT, 0, 0);

return TRUE;

// De même pour ID_BLUE
/...

Bonne chance ...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
En fait ce n'est pas InvalidateRect qui envoie un WM_PAINT, c'est le système qui s'en occupe, voyant qu'une zoné a été invalidée:
"The system sends a WM_PAINT message to a window whenever its update
region is not empty and there are no other messages in the application queue for
that window."
Si on veut une mise à jour immédiate, il vaut mieux appeler UpdateWindow immédiatement après InvalidateRect.

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut :

Je me suis mal expliqué. C'est évident que WINDOWS qui s'en charge.

Est ce que le SendMessage est inutile dès que InvalidateRect est définie?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Ce n'est pas évident, ca aurait très bien pu être InvalidateRect qui envoie le message...
Dans le cas présent le SendMessage(WM_PAINT) (qui est équivalent à UpdateWindow) ne sert à rien, mais parfois ca peut être utile

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

morche po :(

plus rien ne s affiche, et meme pas le message de conversion impossible
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut :

Changer ScreenToClient par ClientToScreen.
Messages postés
136
Date d'inscription
samedi 1 mai 2004
Statut
Membre
Dernière intervention
26 mai 2007

morche pas non plus!

Peut etre que je l'integre mal a mon code! Vous pourriez verifier par
rapport au code que j'ai mis ce que je dois changer? Les parties sont
les ajout fait d apres vos recommandations (voir page1)
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
36
Salut :

Après une recherche il me paraît que l'utilisation de SetBkColor est la plus adéquate.

Voici quelques liens qui peuvent vous aidez :
(Utilise setBkColor et WM_CTRCOLORSTATIC)


http://www.winprog.org/tutorial/dlgfaq.html


http://www.codeguru.com/cpp/controls/staticctrl/article.php/c5803/
http://www.codejock.com/downloads/samples/controls.asp

Bonne chance ...
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Voici une autre piste.
Si tu veux juste que la couleur d'un carré change suivant une certaine action, tu peux utiliser la fonction FillRect(). Tu déclareras un tableau de HBRUSH qui contiendra les couleurs à utiliser. Ces dernières seront créées avec CreateSolidBrush() pendant l'initialisation de la boite de dialogue. Un indice permettra de choisir la couleur courante. Pour la changer, il suffira de changer l'indice courant est redessiner le carré avec la couleur correspondante.
// Variables dans la fonction WndProc:
static int indice;
static HBRUSH couleurs[3];
static RECT rect;
HDC hdc;

// Initialisation de la boite de dialogue:
case WM_INITDALOG:
couleurs[0]=CreateSolidBrush(RGB(255,0,0));//rouge
couleurs[1]=CreateSolidBrush(RGB(0,255,0));//vert
couleurs[2]=CreateSolidBrush(RGB(0,0,255));//bleu
SetRect(100,20,140,60);
indice=0;
//...
return 0;

A la suite d'une action, on change l'indice courant et redessine le carré comme ceci:
indice=1;// pour passer au vert
hdc=GetDC(hDlg);
FillRect(hdc,&rect,couleurs[indice]);
ReleaseDC(hDlg,hdc);

Pour que le carré ne disparaisse pas suite à un masquage de la boite de dialogue, il faut prévoir de le redessiner pendant WM_PAINT:
case WM_PAINT:
PAINTSTRUCT ps;
hdc=BeginPaint(hDlg,&ps);
FillRect(hdc,&rect,couleurs[indice]);
EndPaint(hDlg,&ps);
return 0;

Il ne faut pas oublier de libérer les HBRUSH en fin d'utilisation:
WM_CLOSE:
DeleteObject(couleurs[0]);
DeleteObject(couleurs[1]);
DeleteObject(couleurs[2]);
//....
return 0;

Si tu veux écrire dans le carré tu peux utiliser DrawText().
Voilà, j'espère avoir aidé un peu.