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
Version imprimable
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.
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:
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).
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.
c'est fait automatiquement via la fonction ScrollWindow() par les MFCCitation:
Je 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 :aie:
un petit tour sur un bon tuto MFC serait judicieux ...
@+
Code:
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:
1
2 CDC *ptr = CScrollView::GetDC();
sinon le reste �a a l'air ok !
@+
En gros, le code de OnDraw serait :
@+Code:
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:
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 :yaisse2:
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) .
OK, merci !
:D