IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

changer la couleur d'un élément creer par creatwindow


Sujet :

MFC

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Points : 12
    Points
    12
    Par défaut changer la couleur d'un élément creer par creatwindow
    Bonjour,

    J'aimerai pouvoir changer par exemple la couleur de fond d'une fenetre, ou d'un bouton crééer par la fonction

    createwindow("buton",.....

    Enfin personalisé l'affichage de la fenetre et de ses éléments.

    Et ce sans MFC.

    Merci.

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Il faut sous-classer la fenetre (si c'est un bouton par exemple), et faire son propre traitement dans le WM_PAINT

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par nico-pyright(c)
    Il faut sous-classer la fenetre (si c'est un bouton par exemple), et faire son propre traitement dans le WM_PAINT
    Voila j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    //La classe que je déclare avec un fond noir
    WNDCLASS BoxGroup2; 	
    BoxGroup2.lpszClassName = "button"; 
    BoxGroup2.hbrBackground = (HBRUSH) GetStockObject
    BLACK_BRUSH);	
     
    //on enregistre celle-ci
    RegisterClass(&BoxGroup2);//on enregistre cette classe
     
    //Ici un GroupBox qui est creer ds ma fenetre principale(hFenetre)
    hWndButtonGRP2 = CreateWindow("button", "Choise", WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 450,295,150,70,hFenetre,0,((LPCREATESTRUCT)lParam)->hInstance ,NULL);
    Donc j'aimerai que mon groupBox2 ai par exemple un fond noir.
    La couleur de fond ne change pas.
    J'ai implémenté ce code ds WM_CREATE.

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    alors, en fait, je ne pensais pas à ca

    Ce que je te proposais, c'était d'affecter une windowProc à ton bouton : à sa création :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    but = CreateWindowEx(0, "BUTTON", "Appuyer ici", WS_VISIBLE|WS_CHILD| WS_BORDER, 20, 100, 200, 40, hwnd, (HMENU)ID_BUTTON, ghInstance, NULL);
    ancienneButProc = (WNDPROC) SetWindowLong(but,GWL_WNDPROC,(long)butProc);
    puis de rédéfinir le paint dans ta nouvelle callback
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    WNDPROC ancienneButProc;
     
     
    BOOL CALLBACK butProc(HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam)
    {
    	HDC hdc;
        PAINTSTRUCT ps;
    	RECT rect;
    	switch(mssg)
    	{
    		case WM_PAINT:
    			hdc = BeginPaint (hwnd, &ps);
    			GetClientRect (hwnd, &rect);
    			SelectObject(hdc, GetStockObject(BLACK_BRUSH)); 
    			Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom); 
    			EndPaint (hwnd, &ps);
    			return 0;
    	}
    	return CallWindowProc(ancienneButProc, hwnd, mssg, wParam, lParam);
    }

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup "nico-pyright(c)" , super cool ca fontionne.

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par nico-pyright(c)
    alors, en fait, je ne pensais pas à ca

    Ce que je te proposais, c'était d'affecter une windowProc à ton bouton : à sa création :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    but = CreateWindowEx(0, "BUTTON", "Appuyer ici", WS_VISIBLE|WS_CHILD| WS_BORDER, 20, 100, 200, 40, hwnd, (HMENU)ID_BUTTON, ghInstance, NULL);
    ancienneButProc = (WNDPROC) SetWindowLong(but,GWL_WNDPROC,(long)butProc);
    puis de rédéfinir le paint dans ta nouvelle callback
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    WNDPROC ancienneButProc;
     
     
    BOOL CALLBACK butProc(HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam)
    {
    	HDC hdc;
        PAINTSTRUCT ps;
    	RECT rect;
    	switch(mssg)
    	{
    		case WM_PAINT:
    			hdc = BeginPaint (hwnd, &ps);
    			GetClientRect (hwnd, &rect);
    			SelectObject(hdc, GetStockObject(BLACK_BRUSH)); 
    			Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom); 
    			EndPaint (hwnd, &ps);
    			return 0;
    	}
    	return CallWindowProc(ancienneButProc, hwnd, mssg, wParam, lParam);
    }
    Juste encore une question je veux personaliser ma couleur
    pour ce faire j'utiliser ses lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //Déclarations ajoutées aux existante:
    #include <Wingdi.h> //pour le GDI
    #pragma comment( lib, "Gdi32.lib" )
     
    .....
    ::SelectObject(hdc,GetStockObject(DC_BRUSH)); 
    ::SetDCBrushColor(hdc,RGB(00,0xff,00));
    Lors de la compilation:
    error C2065: 'DC_BRUSH' : undeclared identifier
    error C2039: 'SetDCBrushColor' : is not a member of '`global namespace''
    error C2065: 'SetDCBrushColor' : undeclared identifier

    pourtant la fonction est disponnible quand je fait les "::" je la voi.
    De plus je suis sur windows XP donc je suis authorisé à l'utilisé d'apres MSDN.

  7. #7
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    normalement, tu n'as pas besoin de l'opérateur de résolution de portée ::

    et comme tu peux le constater
    Citation Envoyé par wingdi.h
    #if (_WIN32_WINNT >= 0x0500)
    WINGDIAPI COLORREF WINAPI SetDCBrushColor(IN HDC, IN COLORREF);
    WINGDIAPI COLORREF WINAPI SetDCPenColor(IN HDC, IN COLORREF);
    #endif
    si ton _WIN32_WINNT est supérieur à 5 (donc pour 2000 et plus), ca devrait marcher ; vérifie bien que c'est le cas

  8. #8
    mat.M
    Invité(e)
    Par défaut
    BoxGroup2.hbrBackground = (HBRUSH) GetStockObject
    BLACK_BRUSH);
    Il n'est pas nécessaire d'appeler GetStockObject mais on peut affecter directement à BLACK_BRUSH ( faut que je fasse l'essai ).
    Est-ce que BoxGroup2.hbrBackground est bien affecté ?? ( F9 déboguage ? )

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par mat.M
    BoxGroup2.hbrBackground = (HBRUSH) GetStockObject
    BLACK_BRUSH);
    Il n'est pas nécessaire d'appeler GetStockObject mais on peut affecter directement à BLACK_BRUSH ( faut que je fasse l'essai ).
    Est-ce que BoxGroup2.hbrBackground est bien affecté ?? ( F9 déboguage ? )
    Merci mais j'essai la méthode de nico qui ne passe plus par la classe de la fenetre, dailleur je ne sais pas si c'est facilement implémentable pour des boutons,... vu que ca ne fonctionnai pas.
    Celle ci peu etre util si par exemple on veu changer aussi le curseur de la souri lorsque l'on passe sur un éléments bouton,...

    Mais je n'ai pas reussi a implémenter une WNDCLASS à un bouton ou GRPBOX.

  10. #10
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par nico-pyright(c)
    normalement, tu n'as pas besoin de l'opérateur de résolution de portée ::

    et comme tu peux le constater
    Citation Envoyé par wingdi.h
    #if (_WIN32_WINNT >= 0x0500)
    WINGDIAPI COLORREF WINAPI SetDCBrushColor(IN HDC, IN COLORREF);
    WINGDIAPI COLORREF WINAPI SetDCPenColor(IN HDC, IN COLORREF);
    #endif
    si ton _WIN32_WINNT est supérieur à 5 (donc pour 2000 et plus), ca devrait marcher ; véifie bien que c'est le cas
    Ok j'utilisai l'opérateur de résolution de portée pour voir si la fonction était bien disponnible.

    Je l'ai enlevé et j'ai toujours l'erreur comme quoi SetDCBrushColor est pas déclaré.

    J'ai mis ton code au debut dans les déclarations et dans ma fonction aussi mais je pense qu'elle se met en déclaration.
    J'ai aussi essayer sans le if là j'ai comme erreur:

    error LNK2001: unresolved external symbol "__declspec(dllimport) unsigned long __stdcall SetDCBrushColor(struct HDC__ *,unsigned long)" (__imp_?SetDCBrushColor@@YGKPAUHDC__@@K@Z)
    Debug/prog.exe: fatal error LNK1120: 1 unresolved externals

    Et toujours DC_BRUSH non déclaré.

    Merci beaucoup pour votre aide

  11. #11
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 682
    Points
    10 682
    Billets dans le blog
    3
    Par défaut
    La technique de personnalisation du dessin des controles standards c'est le owner drawing. Crée ton bouton avec le style BS_OWNERDRAW et gère l'évènement WM_DRAWITEM.
    http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/buttons/usingbuttons.asp

  12. #12
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 42
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    La technique de personnalisation du dessin des controles standards c'est le owner drawing. Crée ton bouton avec le style BS_OWNERDRAW et gère l'évènement WM_DRAWITEM.
    http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/buttons/usingbuttons.asp
    J'ai un peu chercher donc si j'ai bien compris j'ajoute dans la creation de mon bouton un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //Global
    ...
    HBITMAP hbm1;
    ...
     
    GroupBoxA = createwindow("buton",...,...|BS_OWNERDRAW|...,...);
    ...
    Et dans ma boucle de gestion des évenements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     
     
    WinProc(...)
    {
    //Local
    ...
    HDC hdcMem; 
    LPDRAWITEMSTRUCT lpdis; 
    ...
     
    ...
    Switch(param):
    ...
    case WM_CREATE:
    ...
    case WM_PAINT:
    ...
     case WM_INITDIALOG: 
     
                // hinst, hbm1 and hbm2 are defined globally. 
                hbm1 = LoadBitmap((HANDLE) hinst, "c:\monimage.bmp");
                Return true;
     
    case WM_DRAWITEM: 
                lpdis = (LPDRAWITEMSTRUCT) lParam; 
                hdcMem = CreateCompatibleDC(lpdis->hDC); 
     
                SelectObject(hdcMem, hbm1); 
     
                // Destination 
                StretchBlt( 
                    lpdis->hDC,         // destination DC 
                    lpdis->rcItem.left, // x upper left 
                    lpdis->rcItem.top,  // y upper left 
     
                    // The next two lines specify the width and 
                    // height. 
                    lpdis->rcItem.right - lpdis->rcItem.left, 
                    lpdis->rcItem.bottom - lpdis->rcItem.top, 
                    hdcMem,    // source device context 
                    0, 0,      // x and y upper left 
                    32,        // source bitmap width 
                    32,        // source bitmap height 
                    SRCCOPY);  // raster operation 
     
                DeleteDC(hdcMem); 
                return TRUE;
    Je n'ai aucunes erreur à la compilation mais que ce soit un groupbox, un bouton, ou radiobox la couleur ne change pas elle ne prend pas celle que 'jai dans le bitmap (que j'ai paint de couleur unie pour le test).

Discussions similaires

  1. JComboBox : Changer la couleur d'un élément ?
    Par wam111 dans le forum Composants
    Réponses: 8
    Dernier message: 24/06/2014, 11h26
  2. Changer la couleur d'un élément d'un listView
    Par bitoons dans le forum Composants graphiques
    Réponses: 9
    Dernier message: 03/06/2011, 13h28
  3. Réponses: 6
    Dernier message: 22/12/2005, 11h32
  4. [JList] changer la couleur d'UN élément
    Par youb dans le forum Composants
    Réponses: 1
    Dernier message: 31/03/2005, 11h31
  5. Réponses: 2
    Dernier message: 01/12/2004, 22h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo