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 :

Application MFC - MDI - Scrollbars


Sujet :

MFC

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 3
    Points
    3
    Par défaut Application MFC - MDI - Scrollbars
    Bonjour,

    Actuellement, je développe une application MFC en MDI et je rencontre un problème fâcheux.

    Mon application affiche des courbes via OnDraw comme je le souhaite mais ce qui s'affiche à l'écran est plus grand que la résolution de la vue du document.

    Je me suis donc dit, il suffit d'ajouter des scrollbars verticaux et horizontaux...

    "Il suffit" est un bien grand mot car à ce jour pas moyen d'y arriver... La seule chose à laquelle j'arrive c'est à ajouter les ascenseurs mais ceux ci ne font littéralement rien (pas moyen de "descendre" avec donc...)

    Pour l'instant mes scrollbars sont affichés "grâce" à cette ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BOOL CMainFrame:: PreCreateWindow(CREATESTRUCT& cs)
    {
        // TODO: Modify the Window class or styles here by modifying
        //  the CREATESTRUCT cs    
        cs.style |=(WS_VSCROLL | WS_HSCROLL);    
        return CMDIFrameWnd:: PreCreateWindow(cs);
    }
    Quelqu'un saurait-il comment je dois m'y prendre avec précision pour que je réussisse enfin à rendre fonctionnel ces ascenseurs dans mes childframe ?

    Je vous remercie d'avance.

    Ps : j'ai essayé de chercher dans le guide en ligne, qui d'ailleurs m'a dépanné grandement sur d'autres problèmes, mais là je n'y trouve visiblement pas de réponse...

    Ah et sinon je code avec VC 6, la version récente j'y suis allergique.
    pense à mettre la balise de code, Merci Farscape

  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,
    ton application est MDI, je suppose que tu dessines dans une vue ?
    la classe la plus appropriée serait la CSCrollView.
    pourquoi vouloir rajouter les ascenseurs sur la mainframe ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Oui effectivement les ascenseurs sont inutiles dans la mainframe, c'est dans les childframe qu'ils ont leurs utilités...

    Par contre, cette histoire de CScrollView, j'ai pas tout compris j'avoue...

    J'ai pas de classe CScrollView dans mon projet mais visiblement il y en a une dans la libraibrie MFC de référence...

    Dois je donc créer une classe CMyScrollView qui a comme base la classe MFC CScrollView ?

    Et une fois celle ci créée, comment faire pour la déclaration de mes scrollbar ?

    Merci d'avance !

  4. #4
    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 classe CScrollview est la classe dédiée au dessin, elle dispose déjà de la gestion des scrollbars.
    tu peux en plus définir ta propre surface client de dessin.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Hmmm...

    J'ai beau cherché dans ma liste de classe, je n'ai pas de classe CScrollView...

    J'imagine qu'il faut l'importer d'une bibliothèque de classe commune à toute les MFC.

    Comment faire ?

    Ps : merci pour tes réponses ^^

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Bon après quelques recherche, j'ai fait dérivé ma classe CPrgView de la classe CScrollView et non plus de la classe CView, en modifiant ça dans CPrgView.h

    (EDIT : j'ai fait cela en recréant un projet vide où ma vue dérivait d'une CScrollView et non plus d'une CView, ensuite j'ai repris les fichiers que j'avais bien sur nommés à l'identique pour éviter tout conflit, et j'ai réécrit mes fonctions)

    Je pensais donc que j'allais enfin avoir directement les scrollbar, eh bien non, pas du tout...

    Faut-il que je rajoute du code dans ma View pour que ceux ci soit activé ?

    Si oui lequel ?

    Merci d'avance !

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Bon ben bonne nouvelle, j'ai réussi à mettre en place un scrollbar qui fonctionne ! (j'avais juste oublié de mettre un chiffe correct pour sizeTotal.cx et sizeTotal.cy ^^)



    Mauvaise nouvelle, ça me fait du grand nawak au niveau du texte quand je bouge mon scrollbar !

    En gros ça se décale mal et ça se chevauche par moment... Pire : là où il n'y a rien au niveau texte et/ou dessin, il me recopie "des morceaux" de ce qu'il y avait avant...

    Comment régler ce problème ?

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Hello Olivier les CScrollView sont un peu pointilleuses à utiliser ;
    pour définir la zone de vue il faut dans CScrollView::OnInitialUpdate() faire les opérations nécessaires
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CSize sizeTotal;
    ClientDC dc(this);
    // TODO: calculate the total size of this view
    sizeTotal.cx = sizeTotal.cy = 2000;
    SetScrollSizes(MM_TEXT, sizeTotal);
    SetScrollSize() dans ce cas là fixera une zone de 2000*2000 pixels.
    Je conseille d'utiliser CScrollview::GetClipBox() qui permet de dessiner ce qui n'apparait qu'à l'écran

    Citation Envoyé par m.olivier.valentin Voir le message
    Mauvaise nouvelle, ça me fait du grand nawak au niveau du texte quand je bouge mon scrollbar !

    En gros ça se décale mal et ça se chevauche par moment... Pire : là où il n'y a rien au niveau texte et/ou dessin, il me recopie "des morceaux" de ce qu'il y avait avant...

    Comment régler ce problème ?
    Il faut gérer l'affichage éventuellement avec CScrollView :: GetScrollPos() qui retourne un CSize.
    Regarder toutes les méthodes de CScrollView dans le MSDN

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    Bonsoir et merci de ton message.

    "il faut dans CScrollView::OnInitialUpdate()"

    Tu veux dire dans CPrgView::OnInitialUpdate() sachant que CPrgView dérive de CScrollView ?

    Parce que si je rajoute "ClientDC dc(this);" dans mon code actuel dans OnInitialUpdate de CPrgView j'ai comme erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    error C2065: 'ClientDC' : undeclared identifier
    error C2146: syntax error : missing ';' before identifier 'dc'
    error C2065: 'dc' : undeclared identifier
    J'ai pas encore étudié la suite de ta proposition mais déjà sur ce premier point pour le moment cela ne fonctionne pas mieux...

    Any idea ?

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 14
    Points : 3
    Points
    3
    Par défaut
    C'est bon problème réglé !

    En fait j'avais juste effacé par mégarde cette ligne dans "OnPrepareDC" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CScrollView::OnPrepareDC(pDC, pInfo);


    Pour résumer voila comment j'ai fais pour m'en sortir (et ce grâce à vos précieux conseils !) au cas où si certaines personnes passent par là dans le futur :

    1) Tout d'abord il faut que la classe CMonApplicationView dérive de la classe CScrollView et non de la classe CView

    2) Ensuite dans CMonApplicationView::OnInitialUpdate il faut "jouer" sur le code suivant ce que l'on désire obtenir (cf le code ci dessous)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void CAudioPlotView::OnInitialUpdate()
    {
     
    	CSize sizeTotal;
     
    	// TODO: calculate the total size of this view
     
    	sizeTotal.cx = sizeTotal.cy = 1500;
    	SetScrollSizes(MM_TEXT, sizeTotal);
    }
    3)Enjoy it !



    Ps : je viens de découvrir d'autre soucis mais qui n'ont rien à voir avec les scrollbars donc je les posterais dans un autre topic (notamment des soucis dans l'impression des couleurs..)

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

Discussions similaires

  1. Application MFC - MDI - Gestion des couleurs étrange
    Par m.olivier.valentin dans le forum MFC
    Réponses: 10
    Dernier message: 01/06/2009, 08h54
  2. Réponses: 1
    Dernier message: 19/04/2008, 17h37
  3. Intégration d'une application MFC MDI dans une DLL
    Par AYARA Adel dans le forum MFC
    Réponses: 3
    Dernier message: 03/03/2008, 20h11
  4. Réponses: 12
    Dernier message: 02/02/2005, 16h52
  5. Application MFC contre pure Win32
    Par albertl dans le forum MFC
    Réponses: 15
    Dernier message: 01/02/2005, 20h16

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