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 :

couleurs des éléments 3D d'une appli


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Par défaut couleurs des éléments 3D d'une appli
    j'ai voulu changer la couleur de fond de mon appli, j'ai fait un setsyscolor et ça m'a changé toutes les couleurs windows...

    je trouve pas la même fonction relative à mon appli uniquement...

    (d'ailleurs, je trouve bizarre qu'on puisse, en lançant une fonction) modifier tous les params windows de l'utilisateur...)

  2. #2
    Membre éclairé

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Par défaut
    Salut

    La fonction SetSysColor() modifie la couleur système de Windows (comme tu as pu le voir )
    Pour modifier la couleur de fond tu peux par exemple dessiner dedans : dans l'évenement OnPaint() tu mets :

    RECT rect;
    GetClientRect(&rect);

    CBrush cBrush;
    cBrush.CreateSolidBrush(RGB(100,120,160));
    CBrush *pBrushPrec=dc.SelectObject(&cBrush);

    dc.Rectangle(0,0,rect.right,rect.bottom);

    // restaurer l'ancien pinceau
    dc.SelectObject(pBrushPrec);


    Je sais qu'il y a aussi une fonction qui fait ca tout seul mais je ne m'en souvient plus ...

    Par ailleurs il y a énormément de fonctions qui peuvent modifier le système de facon parfois même dangereuses (base de registre, reboot, suppression de fichiers ...)

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    Sympa le titre mais comme changer le fond d'une application sera plus efficace pour la recherche ultérieure dans le forum .

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Par défaut
    Citation Envoyé par basnifo
    RECT rect;
    GetClientRect(&rect);

    CBrush cBrush;
    cBrush.CreateSolidBrush(RGB(100,120,160));
    CBrush *pBrushPrec=dc.SelectObject(&cBrush);

    dc.Rectangle(0,0,rect.right,rect.bottom);

    // restaurer l'ancien pinceau
    dc.SelectObject(pBrushPrec);
    merci !!


    Citation Envoyé par farscape
    Sympa le titre mais comme changer le fond d'une application sera plus efficace pour la recherche ultérieure dans le forum
    oops, désolée

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Par défaut
    et en fait, je voulais pas changer le bg mais la couleur de tous les éléments 3D... (oui je sais, je suis ch... )

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    CWinApp::SetDialogBkColor
    void SetDialogBkColor( COLORREF clrCtlBk = RGB(192, 192, 192), COLORREF clrCtlText = RGB(0, 0, 0) );
    Parameters
    clrCtlBk
    The dialog background color for the application.
    clrCtlText
    The dialog control color for the application.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    BOOL CMyApp::InitInstance()
    {
       // Standard initialization
     
       SetDialogBkColor();        // Set dialog background color to gray
       LoadStdProfileSettings();  // Load standard INI file options (including MRU)
     
       // ...
    }
    ça peut etre ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Par défaut
    mais ça ne fait que le bg ça non ?

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Sinon j’ai traite le sujet dans le post it de la faq
    -pour changer la couleur de fond d’edit ou de static .
    - ou au niveau de la boite de dialogue

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Par défaut
    si j'ai pbien compris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LoadStdProfileSettings();  // Load standard INI file options (including MRU)
    prend les valeurs dans un fichier.ini ?
    donc on peut customiser l'appli, c'est ça ? (le compiler une fois et changer la couleur de fond comme on veut sans le recompiler mais juste en changeant les valeurs dans le .ini ?)
    on le met où le .ini ?

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Non ,
    c’était un bout de code d’exemple ignore le LoadStdProfileSettings();
    Maintenant si tu veux stocker la couleur dans le point .ini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Récupération couleur dans InitInstance
    SetDialogBkColor(GetProfileInt(«Settings»,«BkColor»,RGB(128 ,128,128)));
    // quelque part dans l’application set color
    COLORREF color= RGB(128 ,128,0);
    AfxgetApp()->WriteProfileInt(«Settings»,«BkColor»,color);

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Par défaut
    Citation Envoyé par farscape
    Non ,
    c’était un bout de code d’exemple ignore le LoadStdProfileSettings();
    Maintenant si tu veux stocker la couleur dans le point .ini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Récupération couleur dans InitInstance
    SetDialogBkColor(GetProfileInt(«Settings»,«BkColor»,RGB(128 ,128,128)));
    // quelque part dans l’application set color
    COLORREF color= RGB(128 ,128,0);
    AfxgetApp()->WriteProfileInt(«Settings»,«BkColor»,color);
    oui mais là, c'est mon appli qui définit les couleurs, pas le .ini ! (puisque c'est elle qui écrit)

    d'ailleurs, c'est win.ini ?



    j'ai regardé dans le post-it, mais ça me parait énorme comme code à rajouter...
    le SetDialogBkColor fait bien ce que je veux à part les boutons et les boîtes de dialogue (en fait, je voudrais que ça s'applique à tous mes éléments 3D). C'est possible d'avoir ça en 2 lignes ? (comme avec SetDialogBkColor).

    merci pour ton aide.

  12. #12
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    re,
    si tu veux gerer le fond d'une dialogue fait comme indiqué dans le post it
    avec CTestsDiversDlg::OnCtlColor(..
    pareil avec les boutons en trappant le message :CTLCOLOR_BTN

  13. #13
    mat.M
    Invité(e)
    Par défaut
    j'ai voulu changer la couleur de fond de mon appli,
    C'est extrêmement irritant de faire la même réflexion à chaque fois : merci d'être explicite !!
    Changer la couleur de fond mais de QUOI PRECISEMENT ????
    type de projet MFC ou NON
    projet MDI/SDI ?? avec une CView ??
    quel est le but de la manoeuvre merci de détailler

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Par défaut
    j'ai fait une application MFC (MDI, SDI, CView, je sais pas ce que c'est).

    J'utilise CWnd et Cdialog. Je voudrais savoir comment changer la couleur de tous les éléments 3D de mon appli. J'ai essayé avec setsyscolor(3D_FACE), ce qui marche très bien mais modifie toutes les couleurs du système de l'utilisateur (c'est pas mon but). Je voudrais avoir la même chose mais qui ne modifie que mon appli.
    SetDialogBkColor c'est sympas mais ça ne modifie que le bg et pas les bouton, msgBox, input(flèches des combos...), etc...

    vala.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Par défaut
    et j'ai essayé la méthode de farscape mais, ça n'impacte pas tous les objets 3D

  16. #16
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    montre le code que tu as implemente pour gerer les couleurs

  17. #17
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Eugénie
    j'ai fait une application MFC (MDI, SDI, CView, je sais pas ce que c'est).

    J'utilise CWnd et Cdialog. Je voudrais savoir comment changer la couleur de tous les éléments 3D de mon appli. J'ai essayé avec setsyscolor(3D_FACE), ce qui marche très bien mais modifie toutes les couleurs du système de l'utilisateur (c'est pas mon but). Je voudrais avoir la même chose mais qui ne modifie que mon appli.
    SetDialogBkColor c'est sympas mais ça ne modifie que le bg et pas les bouton, msgBox, input(flèches des combos...), etc...

    vala.
    Dur dur pour aider les gens !!!!

    il faut impérativement comprendre ce qu'on peut faire avec VC++ ,les différentes technologies utilisées win32/MFC etc...
    Pour cela il ya de très bons bouquins.

    tu parle d'éléments 3D : est-ce les contrôles ( boutons , zone de listes déroulantes ) ?
    Ou bien est-ce que c'est une application de CAO c.a.d. de conception de graphismes 3d ????

    pour changer la couleur d'un contrôle cette question a déjà été posée plusieurs fois.
    Sur le site lafaqmfc.com c'est abordé .
    Sinon, il faut utilser CDialog::OnCtlColor.

    Voir le MSDN :

    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
     
    HBRUSH CZilchDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
       // Call the base class implementation first! Otherwise, it may
       // undo what we're trying to accomplish here.
       HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
     
       // Are we painting the IDC_MYSTATIC control? We can use
       // CWnd::GetDlgCtrlID() to perform the most efficient test.
       if (pWnd->GetDlgCtrlID() == IDC_MYSTATIC)
       {
          // Set the text color to red
          pDC->SetTextColor(RGB(255, 0, 0));
     
          // Set the background mode for text to transparent 
          // so background will show thru.
          pDC->SetBkMode(TRANSPARENT);
     
          // Return handle to our CBrush object
          hbr = m_brush;
       }
     
       return hbr;
    }

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Par défaut
    Citation Envoyé par Mat.M
    tu parle d'éléments 3D : est-ce les contrôles ( boutons , zone de listes déroulantes ) ?
    Ou bien est-ce que c'est une application de CAO c.a.d. de conception de graphismes 3d ????
    quand tu changes tes propriétés windows, dans apparence tu peux changer la couleur de ton bureau, tes fenêtres, etc... et tu as l'élément "objets 3D". Si tu changes cette couleurs, toutes tes fenêtres, tes boutons, tous tes éléments "3D" (comme ils appellent) prennent cette couleur. et c'est bien pratique ! Je ne pense pas que les "contrôles" englobent tous ces éléments. Ca agit aussi sur le grisage. ex : mon windows est vert, les éléments grisés sont vert/gris.

    Je voudrais utiliser ça pour mon appli. En fait, j'ai un .ini (merci Farscape ) où j'indique la couleur principale de l'appli (je la veux customisable par l'utilisateur), je souhaite la récupérer et l'appliquer à toute mon application (qui est une fenêtre qui en ouvre certaines autres, qui lance des boîtes de dialogues et qui contient plein de bouton avec des bitmaps ou non)

    voilà pour les détails...

  19. #19
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    bon maintenant que le decor est planté
    la methode indiqué pour la customisation des couleurs dans une dialogue doit fonctionnée (OnCtlColor )
    il faut maintenant que tu soit precise sur ce qui ne fonctionne pas et montrer par exemple le code implementer pour gerer les couleurs.
    sinon ça va etre dur ! .

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 76
    Par défaut
    voili voilà, j'ai enfin trouvé le temps :

    j'ai une classe dll_test avec un InitInstance :

    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
     
     
    BOOL CDll_testApp::InitInstance()
    {
    	AfxEnableControlContainer();
    	// If you are not using these features and wish to reduce the size
    	//  of your final executable, you should remove from the following
    	//  the specific initialization routines you do not need.
     
    #ifdef _AFXDLL
    	Enable3dControls();			// Call this when using MFC in a shared DLL
    #else
    	Enable3dControlsStatic();	// Call this when linking to MFC statically
    #endif
     
    	CDll_testDlg dlg;
    	m_pMainWnd = &dlg;
     
    	dlg.SetDialogBkColor(RGB(GetProfileInt("Settings","RColor", 128),
    					GetProfileInt("Settings","GColor", 128),
    					GetProfileInt("Settings","BColor", 128)),
    				RGB(GetProfileInt("Settings","RTColor", 0),
    					GetProfileInt("Settings","GTColor", 0),
    					GetProfileInt("Settings","BTColor", 0)));
     
    	int nResponse = dlg.DoModal();// affiche la boite de dialogue
    	if (nResponse == IDOK)
    	{
    		// TODO: Place code here to handle when the dialog is
    		//  dismissed with OK
    	}
    	else if (nResponse == IDCANCEL)
    	{
    		// TODO: Place code here to handle when the dialog is
    		//  dismissed with Cancel
     
    	}
     
    	// Since the dialog has been closed, return FALSE so that we exit the
    	//  application, rather than start the application's message pump.
    	return FALSE;
    }
    dans test_dllDlg, j'ai mis tout ce dont tu avais parlé : un handler sur WM_CTLCOLOR :

    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
     
    HBRUSH CDll_testDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
       HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 
     
       // TODO: Change any attributes of the DC here 
        // par exemple en fonction de nCtlColor voir doc. 
        switch(nCtlColor) 
       { 
          // Intercepte le message pour la dialogue et les statics. 
          case CTLCOLOR_DLG: 
          case CTLCOLOR_STATIC  : 
              //  Fixe la couleur d’ecriture du texte 
              pDC->SetTextColor(m_ClrCtlText); 
             // Fixe le fond en transparent  pour le texte 
             pDC->SetBkMode(TRANSPARENT); 
             // retourne le handle de la brush pour le fond si il existe. 
             if(m_HbrClrCtlBk ) hbr = m_HbrClrCtlBk; 
          break; 
       } 
       // TODO: Return a different brush if the default is not desired 
       return hbr; 
     
    }
    et une fonction SetDialogBkColor :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    void CDll_testDlg::SetDialogBkColor( COLORREF clrCtlBk, COLORREF clrCtlText) 
    { 
      // m_HbrClrCtlBk est à null dans le constructeur 
       if(m_HbrClrCtlBk) ::DeleteObject(m_HbrClrCtlBk); 
     
        m_HbrClrCtlBk = ::CreateSolidBrush(clrCtlBk);  
        m_ClrCtlText    = clrCtlText; 
    }
    et pis ça aussi :


    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
     
    CDll_testDlg::CDll_testDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CDll_testDlg::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(CDll_testDlg)
    	m_nbSceances = _T("1");
    	m_quantite = _T("1");
    	//}}AFX_DATA_INIT
     
      m_HbrClrCtlBk=NULL ; //déclaré dans le .h
      m_ClrCtlText= RGB(0, 0, 0) ; //idem
     
    	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
     
    }
    CDll_testDlg::~CDll_testDlg(){
       if(m_HbrClrCtlBk) ::DeleteObject(m_HbrClrCtlBk); 
    }
    voilà, je pense que tu as tout.

    sinon, j'ai pas trouvé le handler pour CTLCOLOR_BTN...

    résultat : la couleur de fond est changée mais pas les autres éléments 3d (boutons, group box, etc...)

    en fait, j'ai le même résultat qu'en faisant un SetDialogBkColor tout seul (sans rajouter le reste) sauf qu'il ne prend pas en compte la couleur de la police (il met noir alors que c'est rouge dans le .ini, le SetDialogBkColor prend bien le rouge)

    woilà woilà.

    merci.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Afficher des éléments HTML dans une WindowsForm
    Par flagadda dans le forum Windows Forms
    Réponses: 3
    Dernier message: 16/04/2007, 17h31
  2. [C#] Changer les couleurs des titres colonnes d'une listView
    Par ExSter dans le forum Windows Forms
    Réponses: 4
    Dernier message: 15/04/2007, 21h02
  3. afficher des etats ireports dans une appli jsf
    Par ouedmouss dans le forum Documents
    Réponses: 1
    Dernier message: 09/02/2007, 07h05
  4. Réponses: 3
    Dernier message: 21/11/2006, 09h08
  5. [Collections]enlever des éléments répétés dans une ArrayList
    Par apan dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 23/03/2006, 13h28

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