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 :

[MFC] Personnaliser sa boite de dialogue


Sujet :

MFC

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Points : 362
    Points
    362
    Par défaut [MFC] Personnaliser sa boite de dialogue
    Salut !
    Voila, j'aimerais savoir comment on peut personnaliser sa boite de dialogue, au niveau graphique. Si on peut modifier la couleur de fond, mettre une image en arrière plan, des boutons de formes différentes...
    Les polices j'ai vu la question dans la FAQ donc je vais essayer ca deja.
    Bonne journée

  2. #2
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    en ce qui concerne la couleur de fond le sujet a du etre traité dans un des post de la faq.
    soit on gere le message WM_ERASEBKGND soit dans le cas d'une dialogue le message WM_CTLCOLOR.


  3. #3
    Membre régulier

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2002
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 216
    Points : 120
    Points
    120
    Par défaut
    pour ce qui est des boutons personnalisés et autres ...
    voir sur les sites :
    www.codeguru.com/
    et
    www.codeproject.com/
    il y as vraiment tout ce qu'il faut dessus...

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Points : 362
    Points
    362
    Par défaut
    Donc j'ai regarder dans la faq, j'ai trouvé le post.
    Vu que moi c'est une boite de dialogue, je gère le message WM_CTLCOLOR, ca marche apparemment puisque je peux jouer avec SetBkColor ou SetTextColor. Mais en ce qui concerne ton code avec la classe CPicture...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if(m_Picture.m_IPicture)    
        { 
          CRect rect; 
          GetClientRect(&rect);       
           m_Picture.UpdateSizeOnDC(pDC); // Get Picture Dimentions In Pixels 
              m_Picture.Show(pDC, CPoint(0,0), CPoint(m_Picture.m_Width, m_Picture.m_Height), 0,0); 
           m_Picture.Show(pDC,rect); // Change Original Dimentions 
        }
    J'ai bien piquer la classe sur l'adresse que t'as donnée, puis j'ai copier coller ce bout de code, mais comme je pensais ca allait pas faire grand chose. Je sais pas ce que ca fait...
    Par contre en parcourant CPicture.h, j'ai vu des fonctions qui m'intéresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    BOOL Load(CString sFilePathName);
    BOOL Load(UINT ResourceName, LPCSTR ResourceType);
    et ensuite je pourrais faire le Show(pDC,rect), mais ce que tu fais avant je comprends pas

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Points : 362
    Points
    362
    Par défaut
    Merci beaucoup Lucky ! le site de Code Project a l'air vraiment bien je l'ai survolé, et je pense qu'il va bien me servir, je me suis déjà inscrit...

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    tu n'aurais pas zapper ça dans le .h de la classe ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    bool LoadImg(CString sFilePathName)
       {
          m_sFilePathName=sFilePathName;
          return (m_Picture.Load(sFilePathName)?true:false);
       }
    regarde bien mon post de depart.

  7. #7
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Points : 362
    Points
    362
    Par défaut
    Argh sincères excuses ! Je regardais un autre message, posté plus tard ! Je vais réessayer avec ce code ca ira surement mieux

  8. #8
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Points : 362
    Points
    362
    Par défaut
    Bon j'ai quelques soucis pour faire affcher une image dans un bouton la, j'ai donc repris ton code (du bon message ), et je l'ai appliqué à ma boite. Sauf que ca me fait une erreur Debug quand ca tourne, et ca m'affiche pas le bouton.
    Donc j'ai créé par ClassWizard la methode au message WM_DRAWITEM, j'ai coper le code dans cette nouvelle fonction, et la ca maffiche mon gif a la forme du bouton, mais ya toujours lerreur debug, et quand je clique dessus, ca fait planter... sniff

    voici mon code simplifié, si ca peut aider...
    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
    BOOL Test::OnInitDialog()
    {
         CDialog::OnInitDialog();
     
         Police();
         this->LoadImg("bla.gif");
         this->Invalidate();
     
         return TRUE;
    }
     
    //change la police, marche bien
    void Test::Police()
    {
         LOGFONT LogFont;
         .......
         pStatic->SetFont(pFont); 
    }
     
    //change couleur texte et fond de texte, marche bien
    HBRUSH Test::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
         HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
         ........
         return hbr;
    }
     
    //Créée a partir du ClassWizard
    void Test::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
    {
         ASSERT(lpDrawItemStruct != NULL);
         CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
         CRect itemRect = lpDrawItemStruct->rcItem;
     
         if(m_Picture.m_IPicture)    
        {       
           m_Picture.UpdateSizeOnDC(pDC);
           m_Picture.Show(pDC, CPoint(0,0), CPoint(m_Picture.m_Width, m_Picture.m_Height), 0,0); 
           m_Picture.Show(pDC,itemRect);
        }   
     
         CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
    }

  9. #9
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    re,
    tu fais pas un melange des genres j'ai donne 2 applications de la classe Picture :
    1 la customisation d'un boutton avec la fonction OnDrawitem.
    2 la gestion d'un image dans le message WM_ERASEBKGND
    la ton code c'est une dialog avec OnDrawItem
    j'ai jamais fais ça des mes posts !

  10. #10
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Points : 362
    Points
    362
    Par défaut
    Oui oui je sais bien , mais moi je voulais l'appliquer à une boite de dialogue. C'est clair que je suis en train de m'embrouiller totalement...

    En fait
    la gestion d'un image dans le message WM_ERASEBKGND
    j'ai en quelque sorte 'passer'...ca m'a quand même permit de changer de couleur du texte... ca me servira, mais ce que je voulais à l'initial c'était de placer une image en fond, qui prends toute la boite. Et j'ai pas réussi, mais j'ai pas résigner !!
    Et je croyais que ton autre post
    la customisation d'un boutton avec la fonction OnDrawitem.
    allait me servir a placer une image dans le fond, mais je me susis aperçu que non. Donc j'ai dit tant pis ca va me servir quand même !

    Donc pour essayer de résumer, j'ai ces deux méthodes OnDrawItem et OnCtlColor pour une même boite de dialogue. Mais au lancement de cette boite, une erreur Debug surgit à cause de OnDrawItem, l'image saffiche dans le bouton, mais pas son texte...

    Je suis vraiment désolé d'avoir autant de mal comme ca et d'etre aussi peu clair...

  11. #11
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Points : 362
    Points
    362
    Par défaut
    D'où mon embrouillement presque total, j'ai essayer une autre méthode, meilleure ou pas je ne sais pas, mais elle m'affiche mon bitmap en fond :
    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
    void ClasseBoiteDeDilogue::OnPaint()
    {
         CPaintDC dc(this);
         CBitmap bmp;
         bmp.LoadBitmap(IDB_TONIMAGE);
         BITMAP bmpInfo;
         bmp.GetBitmap(&bmpInfo);
         CDC hMemDC;
         hMemDC.CreateCompatibleDC(&dc);
         hMemDC.SelectObject(bmp);
         CRect size;
         GetClientRect(size);
         dc.StretchBlt(0,0,size.right-size.left,size.bottom-     size.top,&hMemDC,0,0, bmpInfo.bmWidth, bmpInfo.bmHeight,SRCCOPY );
         ReleaseDC(&dc);
    }
    Le souci c'est que mes CStatic ne sont pas "transparent", enfin j'aimerais voir que le Texte et non pas sa zone qui est "dessus" la bitmap.
    J'ai pas trouvé de fonction associée au CStatic pour lui rendre cet effet...

  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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    bon tu m'a completement embrouillé aussi
    on resume pour mettre une image dans le fond d'une dialogue :
    mon post: la gestion d'un image dans le message WM_ERASEBKGND
    convient tres bien.
    si tu veux coloriser le fond d'une dialogue le traitement avec OnCtcolor
    marche tres bien (voir post dans le post it faq).
    note on peut aussi traiter le fond avec WM_ERASEBKGND

  13. #13
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Points : 362
    Points
    362
    Par défaut
    Bon j'ai essayé de suivre ton post du 24 Février dans la FAQ, et j'ai beaucoup de mal. J'ai créé la classe BtPicture, avec son .h et son .cpp (le .cpp apparement visual le voulait absolument). Puis dans la classe de ma boite principale j'ai déclaré l'objet BtPicture, et c'est la que tout va plus, il y a des erreurs dans tout les sens...
    Je comprends vraiment pas comment ca fonctionne... en fait BtPicture ca remplace le CButton ?
    A mon avis mon problème, ce sont les include à placer dans Projet.cpp, ProjetDlg.cpp, BtPicture.cpp... dès que je change, ca me met d'autres erreurs
    je suis perdu...

  14. #14
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Points : 362
    Points
    362
    Par défaut
    Il ya donc aussi ton message du 25 Mars : Comment mettre une image de fond dans une dialogue ?

    Donc j'ai bien modifié dans le classwizard "child window", j'ai créé la fonction OnEraseBkgnd, j'ai fait un beau copier coller, j'ai créé mon objet PIcture dans mon .h
    Et voila... maintenant je sais pas ce qu'il faut faire, j'ai tenté dans mon OnInitDialog() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_Picture.Load("image.bmp");
    Mais comme je le pensais ca n'a rien fait...

    Dans le code de ce message il n'apparait pas d'endroit où tu appelles ton image, où tu l'importes... c'est peut être évident, mais moi pas comprendre...

  15. #15
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    Salut,
    La lecture de l'image est a faire par exemple dans le OnInitDialog si la classe parent est une CDialog et OninitialUpdate si c'est une CFormView.
    Je comprends vraiment pas comment ça fonctionne... en fait BtPicture ca remplace le CButton ?
    oui le but est de définir un objet derive de CButton avec des méthodes supplémentaires ....
    Ne pas oublier de mettre notify dans la ressource sur le bouton.
    Le pb aussi c'est que tu pars dans tous les sens.
    Essaye de présenter un pb après l’autre. un besoin après l'autre parce que la on s'emmêle les pinceaux lol (en plus comme je bosse en meme temps mais oui je bosse la lol)!

  16. #16
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Points : 362
    Points
    362
    Par défaut
    Le pb aussi c'est que tu pars dans tous les sens.
    Tu as tout à fait raison ! c'est clair que je veux faire trop de choses à la fois, et c'est pas une super méthode
    Je vais retenter quelques trucs quand même, en tout cas merci de ta patience !

  17. #17
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Points : 362
    Points
    362
    Par défaut
    ralala, je meriterais trois paires de claques au moins...
    j'ai enfin réussi à mettre mon image de fond dans ma boite ! 8) c'est la fête...
    en fait mon Picture.Load("bla.jpg"), je le faisais dans le message WM_PAINT, je me rappelle plus pourquoi je l'ai mis la !! justement surement a cause de tout confondre. Et donc je l'ai placé dans le OnInitDialog(), et ca marche nickel ! Merci farscape !

    Pour les icones dans les boutons je verrais ca plus tard, ca presse pas, je suis deja content avec mes changement de polices, de couleurs, et mon image de fond !

    Tcho merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MFC]ActiveX et boite de dialogue
    Par tus01 dans le forum MFC
    Réponses: 8
    Dernier message: 13/12/2005, 17h29
  2. [MFC] DLL avec boite de dialogue
    Par ricky78 dans le forum MFC
    Réponses: 2
    Dernier message: 17/06/2005, 12h06
  3. [MFC & TRAY] Affichage boite de dialogue
    Par Tigris94 dans le forum MFC
    Réponses: 3
    Dernier message: 20/08/2004, 12h31
  4. Réponses: 6
    Dernier message: 28/02/2004, 09h19
  5. [MFC] rendre une boite de dialogue inactive
    Par Vestaproman dans le forum MFC
    Réponses: 8
    Dernier message: 22/01/2004, 14h09

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