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 créé par CreateWindow()


Sujet :

MFC

  1. #1
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 82
    Points : 41
    Points
    41
    Par défaut changer la couleur d'un élément créé par CreateWindow()
    Bonjour à tous !
    Voilà je crée des boutons avec CreateWindow() et je n'ai pas la possibilité de construire graphiquement l'interface.
    J'aimerai pouvoir changer la couleur de mes boutons...
    J'ai regardé ce topic sur le forum : http://www.developpez.net/forums/viewtopic.php?t=324595

    Mais j'ai des problèmes à utiliser cette solution : dans quelle ordre doivent être mises les fonctions ? est-ce qu'elles sont dans des fichiers différents ?

    Enfin si quelqu'un pouvait m'aider ...

  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
    quel est le problème ?
    tu n'arrives pas à mettre en place la solution ?
    ca ne marche pas ?

  3. #3
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 82
    Points : 41
    Points
    41
    Par défaut
    je n'arrive pas à mettre en place la solution !

    J'ai une fonction générale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LRESULT CALLBACK WndProc( HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam )
    dans laquelle je déclare mes boutons et après j'ai un switch avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    case WM_NOTIFY: { }
    case WM_COMMAND: {}
    ...
    Est-ce que c'est là que je dois rajouter le case WM_PAINT ?

    est-ce que je dois mettre le bouton dans ma fonction d'origine WndProc ?

  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
    en fait, tu as deux méthodes,
    une première que j'ai décrite et où il faut sous classer le bouton, donc faire une nouvelle callback (dans l'exemple BOOL CALLBACK butProc(HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam) )
    et une autre méthode décrite par Aurélien (owner drawing), où ca se passe dans la callback principale (winproc) mais où c'est un autre message qu'il faut traiter

  5. #5
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 82
    Points : 41
    Points
    41
    Par défaut
    La première solution nécessite que tu fasses 2 callback : une première dans laquelle tu crées ton bouton et une autre dans laquelle tu gères le WM_PAINT ? et qu'est ce que tu entends par sous-classer ?

    Merci d'aider les gens un peu nuls !

  6. #6
    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
    c'est le principe du sous-classement.

    Pour ta fenetre, tu as une fonction (callback) qui gère les messages (redimensionnement, click sur les menus, etc ...)

    Et tu peux faire de meme pour un bouton pour définir plus précisément, comme par exemple faire un dessin différent.

    donc un truc comme ca :
    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);
    }
    c'est la fonction butProc qui gèrera les évenements du bouton, en l'occurence son dessin (WM_PAINT)

  7. #7
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut
    Ya plus simple sans faire des callbacks: il suffit de traiter le message WM_COLORBTN.

    WM_CTLCOLORBTN
    The WM_CTLCOLORBTN message is sent to the parent window of a button when the button is about to be drawn. By responding to this message, the parent window can set a button's text and background colors.

    WM_CTLCOLORBTN
    hdcButton = (HDC) wParam; // handle to the button display context
    hwndButton = (HWND) lParam; // handle to the button

    Parameters
    hdcButton
    Value of wParam. Handle to the display context for the button.
    hwndButton
    Value of lParam. Handle to the button.
    Return Values
    If an application processes this message, it must return a handle to a brush. The system uses the brush to paint the background of the button.

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: 11
    Dernier message: 15/04/2005, 15h42
  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