Changer couleur par un clique [Win32 sans MFC]

jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007 - 22 oct. 2006 à 12:42
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 - 23 oct. 2006 à 06:11
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

SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
22 oct. 2006 à 13:21
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 ?
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
22 oct. 2006 à 13:38
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;
      // ...
      }
}
 
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
22 oct. 2006 à 13:40
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;
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
22 oct. 2006 à 13:59
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!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
22 oct. 2006 à 14:21
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;
      // ...
      }
}
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
22 oct. 2006 à 14:36
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
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
22 oct. 2006 à 14:41
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);

}
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
22 oct. 2006 à 18:03
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;
}
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
22 oct. 2006 à 19:22
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);

}
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
22 oct. 2006 à 20:54
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 ...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
22 oct. 2006 à 21:12
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
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
22 oct. 2006 à 21:25
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?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
22 oct. 2006 à 21:32
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
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
22 oct. 2006 à 22:00
morche po :(

plus rien ne s affiche, et meme pas le message de conversion impossible
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
22 oct. 2006 à 22:50
Salut :

Changer ScreenToClient par ClientToScreen.
0
jojomillenium Messages postés 136 Date d'inscription samedi 1 mai 2004 Statut Membre Dernière intervention 26 mai 2007
22 oct. 2006 à 23:12
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)
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
22 oct. 2006 à 23:57
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 ...
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
23 oct. 2006 à 06:11
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.
0