Bonjour
Je suis un peu perdu , je voudrais affichier des informations dans une view mais j'aurai besoin d'un scrollbar comment proceder ?
De l'aide SVP !
Merci
Bonjour
Je suis un peu perdu , je voudrais affichier des informations dans une view mais j'aurai besoin d'un scrollbar comment proceder ?
De l'aide SVP !
Merci
Bonjour,
Tu peux utiliser une CScrollView.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Oui mais comment je pars d'une View normale ou je pourrai effectuer mes changements ?
J'ouvre l'application et je trouve directement une vue devant moi donc je travaille la dessus !
Comment faire autrement ?
Merci
salut,
dans le wizzard de création d'un projet MFC, dernière page, tu peux spécifier le type de vue que tu veux (par défaut, une simple CView)
suffit de cliquer sur la classe "CChildView" et dans le menu déroulant choisir le type CScrollView...
c'est le plus simple
@+
Oui j'ai bien fais ça !
Mais toujours ça ne donne rien pas de scroll bar sur le view malgré que j'ecris des choses dans la view qui depasse les limites de la view .
Alors ..
Salut,
Il me semble que dans ton cas c'est a toi de rajouter dans le style les scrollbar:
Dans ta view (PreCreateWindows)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 cs.style |= WS_VSCROLL; cs.style |= WS_HSCROLL;
J'ai reussi a mettre les scroll bars mais pour lemoment je galere pour les gerer car le texte se deforme quand je fait monter ou descendre la scroll bar !
Je sais quoi faire là !
C'est peut être lié à l'affichage: le texte à l'ancienne place n'est pas effacé mais tu rajoutes juste le nouveau texte un peu au dessus (ou en dessous).
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
oui c'est ça je pense , mais comment faire pour eviter ça !
En gros, quand je monte ou descend l'ascenceur faut tout réécrire , c'est ça ?
Mais dans quelle fonction faut faire ça, et comment le faire ?
Merci
En toute logique tu dois gérer ton affichage dans CView::OnDraw. Je ne me souviens plus si tu dois demander la mise à jour lorsque tu fais le scroll ou si c'est fait automatiquement. Je ne pense pas que ce soit automatique, mais bon, à vérifier.
Ensuite, lorsque tu demandes la mise à jour sur traitement du scrool, soit tu fais du brutal et tu redessines toute la partie visible de ta vue. Soit tu essayes d'optimiser les zones à rafraichir avec InvalidateRect ou InvalidateRgn. J'avoue, quant à moi, avoir toujours fait du brutal.
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
c'est fait automatiquement via la fonction ScrollWindow() par les MFCJe ne me souviens plus si tu dois demander la mise à jour lorsque tu fais le scroll ou si c'est fait automatiquement.
ce n'est pas un probleme d'effacement du fond, puisque c'est géré automatiquement par la WNDCLASS (par défaut)
@A_B : montre nous ton code pour dessiner ton texte
si tu utilises une CScrollView, il n'y a quasiment rien à faire, tout est géré en interne ... donc plus facile à utiliser, il n'y a pas
un petit tour sur un bon tuto MFC serait judicieux ...
@+
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 void CFichierOKView::OnDraw(CDC* /*pDC*/) { CFichierOKDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; CDC *ptr = CScrollView::GetDC(); CString s; CString str; for(int i=0;i<50;i++) { s.Format(_T("%d"), i); str = _T("Reponse_")+s; ptr->TextOutW(50,50+20*i,str);} } void CFichierOKView::OnInitialUpdate() { CSize sizeTotal; sizeTotal.cx = sizeTotal.cy = 1000; SetScrollSizes(MM_TEXT, sizeTotal); CScrollView::OnInitialUpdate(); }
Il faut utiliser le paramètre pDC de la fonction OnDraw() !
et supprimer cette ligne :
(en plus, tu ne liberais pas le DC par un ReleaseDC(), donc GDI leaks et gros plantage assuré après X affichages ...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CDC *ptr = CScrollView::GetDC();
sinon le reste ça a l'air ok !
@+
En gros, le code de OnDraw serait :
@+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 void CFichierOKView::OnDraw(CDC *pDC) { for (int i=0;i<50;i++) { CString string; string.Format(_T("Reponse_%d"),i); pDC->TextOut(50,50+20*i,string); } }
et la meme chose, de maniere optimisé (ne redessiner que ce qui est nécessaire) :
@+
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 void CFichierOKView::OnDraw(CDC *pDC) { CRect rect; if (pDC->GetClipBox(rect)<=NULLREGION) return; // rien à dessiner int ymin=(rect.top-50)/20; int ymax=(rect.bottom-50+19)/20; ymin=min(max(ymin,0),50); ymax=min(max(ymax,0),50); for (int i=ymin;i<ymax;i++) { CString string; string.Format(_T("Reponse_%d"),i); pDC->TextOut(50,50+20*i,string); } }
Enorme !!
Merci beaucoup c'était ça au fait, le release!!
Sinon comment faire pour ouvrir plusieurs documents en meme temps .
Je me demande comment le faire et surtout ou le faire dans la classe View ou Doc ?
Les documents je les créé suite a un appuie sur bouton, j'initialise leurs données et puis les affichier .
Merci![]()
plusieurs doc en meme temps c'est plutot une application MDI alors que SDI
MDI = Multiple Document Interface
SDI = Single Document Interface
sinon pas d'interet d'avoir plusieurs docs pour une SDI ...
@+
Oui pardon au fait je suis en MDI !
Et c'est tout l'interet de mon application qui doit générer des sujets aléatoirement donc fournir à la fois plusieurs documents (vues) .
Ressources proposées par 3DArchi - Les fonctions virtuelles en C++ - Cours et tutoriels C++ - FAQ C++ - Forum C++.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager