Redessiner le fond

cs_gregory6 Messages postés 22 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 3 janvier 2005 - 21 déc. 2004 à 08:42
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 - 24 déc. 2004 à 18:16
Bonjour

je débute en visual c++ sous MFC, je dessine une page graphique avec un fond et du texte. Pour éviter le scintillement à chaque chgt de page, j'utilise un back buffer et bitblt. J'appelle InvalidateRect pour redessiner la page. Néanmoins, mon fond est noir lorsque j'affiche mes autres pages.
Voili le code en espérant que ça pourra vous aider.
J'aimerai que le fond soit dessiner sur toutes les pages sans le redessiner ds toutes mes fonctions.

//affiche ma page graphique
void CProjecttestDlg::Afficher1()
{
CPaintDC dc(this);
GetClientRect(rect);

dcMem.CreateCompatibleDC(&dc);

bitmap.CreateCompatibleBitmap(&dc,240,320);
CBitmap* pOldBitmap = dcMem.SelectObject(&bitmap);

CString s = "PAGE 2";
dcMem.SetTextColor(RGB(255,255,255));
dcMem.SetBkMode(TRANSPARENT);
dcMem.TextOut(35,65,s);
dcMem.TextOut(35,85,"CA MARCHE");

}

//dessine ma première page fond + trait
void CProjecttestDlg::OnPaint()
{

CPaintDC dc(this);

GetClientRect(rect);

CBrush backBrush (RGB(010,106,010));
dc.FillRect(rect, &backBrush);

dc.SelectObject(GetStockObject (WHITE_PEN));
dc.MoveTo(0,25);
dc.LineTo(240,25);

dc.SetTextColor(RGB(255,255,255));
dc.SetBkMode(TRANSPARENT);

dc.BitBlt(0,0,240,320,&dcMem,0,0,SRCCOPY);

dc.SelectObject(pOldBitmap);//pr l'instant supprimer
bitmap.DeleteObject();
dcMem.DeleteDC();

}

//appui sur une touche appelle la fonction.
void CProjecttestDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar==78)
{
Afficher1();
InvalidateRect(rect,FALSE);
}
}

Je vous remercie pour votre aide.

++

10 réponses

cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
21 déc. 2004 à 21:08
qu'est ce que tu appelles un "page", c'est une nouvelle fenetre ?

sans les back buffer, ca marche ?
0
cs_gregory6 Messages postés 22 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 3 janvier 2005
22 déc. 2004 à 11:35
en fait, je défini une page graphique, un rectangle ds laquelle je dessine un fond, une ligne du texte. Je ne me sers pas des boites de dialogues ou active x , je crée tout moi meme.
Sans le back buffer, c ok mais j'aimerai éviter les clignotements lorsque je change de page. En gros, si je ne redessine pas le fond ds ma fonction afficher, il me colle le texte avec un fond noir.
Je pensais que la fonction InvalidateRect(NULL, FALSE) permettait de redessiner sur la page sans modifier le fond. Mais encore faut il ou savoir dessiner le fond ?

J'espère que j'ai été clair et merci pour ton aide. J'ai du mal avec les contextes de périphériques si t'aurai des liens intéresants dessus ou des sources.

++
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
23 déc. 2004 à 09:25
regarde mes dernieres sources, j'utilise la methode du back-buffer. (par exemple http://www.cppfrance.com/code.aspx?ID=25713)

pour information, je crois que (NULL,FALSE) vei dire : NULL pour redessinner toute la fenetre, et FALSE c'est pour dire si il faut appeller la procedure pour redessinner, moi je mets toujours (NULL,TRUE).
0
cs_gregory6 Messages postés 22 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 3 janvier 2005
23 déc. 2004 à 10:23
ok merci c sympa. je vais étudier ça. ça m'a l'air intéressant.

bonne journée
++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_gregory6 Messages postés 22 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 3 janvier 2005
23 déc. 2004 à 20:40
En etudiant ta source, J'ai bien compris pour le back buffer mais cela ne resoud pas mon problème pour le fond de page. J'aimerai dessiner un fond ds un buffer mémoire (couleur , ligne, ...) ce fond serait invariant. Ensuite,ds un autre buffer je ne redessinerai que les éléments que je souhaite en les collants par dessus ma page mais je n'y arrive pas.
Je dessine le fond de ma page ds le onPaint mais il ya un probléme.

void CProjecttestDlg::OnPaint()
{
CPaintDC dc(this);
GetClientRect(rect);

dcMem1.CreateCompatibleDC(&dc);

CBrush backBrush (RGB(010,106,010));
dcMem1.FillRect(rect, &backBrush);

dc.BitBlt(0,0,240,320,&dcMem1,0,0,SRCCOPY);
dc.BitBlt(0,0,240,320,&dcMem,0,0,SRCCOPY);

bitmap.DeleteObject();
dcMem.DeleteDC();
dcMem1.DeleteDC();
}

voilà mais qd j'appelle cette fonction il me dessine le texte sur un fond noir. Voilà mon problème.
J'espère que je suis clair.

void CProjecttestDlg::AfficherMenu ()
{
CPaintDC dc(this);
GetClientRect(rect);

dcMem.CreateCompatibleDC(&dc);

bitmap.CreateCompatibleBitmap(&dc,240,320);
CBitmap* pOldBitmap = dcMem.SelectObject(&bitmap);

CString s0="TEXTE";
dcMem.SetTextAlign(TA_BASELINE | TA_LEFT);
dcMem.SetTextColor(RGB(255,255,255));
dcMem.SetBkMode(TRANSPARENT);
dcMem.TextOut(38,18,s0,11);

}

Je te remercie pour ton aide.

++
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
24 déc. 2004 à 11:10
Quand tu veux dessinner ton texte, tu copies le fond dans ton DC de dessin, sans changer le DC de ton fond.
Donc tu utilise la fonction BitBlt.
0
cs_gregory6 Messages postés 22 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 3 janvier 2005
24 déc. 2004 à 13:35
je vois pas trop ce que tu veux dire, tu veux que j'utilise bitblt ds ma fonction afficher ? Si tu peux préciser, merci.
En revanche, j'ai fais des recherches et pour éviter de redessiner le fond, j'ai vu sur des sources qu'il fallait utiliser la fonction invalidateRect(NULL, FALSE) mais ça ne marche pas, ds une autre source j'ai vu qu'il fallait intercepter WM_ERASEBKGND et retouner TRUE ensuite je dessine le fond ds ma fonction OnPaint mais sans succès, ces méthodes te disent qqch ?
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
24 déc. 2004 à 15:04
Le fond pour l'instant de ta fenetre, c'est du noir, tu voudrais avoir quoi ?

effectivement si tu retourne TRUE a WM_ERASEBKGND et que tu n'a en fait rien fait, alors tu ne redessine pas le fond
0
cs_gregory6 Messages postés 22 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 3 janvier 2005
24 déc. 2004 à 15:25
J'aimerai avoir un fond vert, des lignes (moveto, lineto) et peut etre un rectangle avec le titre de l'appli. J'aimerai éviter de redessiner ça à chaque page. Voilà mais le fond de la page on le définit ou ? Je sais pas trop comment faire ?
Je suis preneur de la moindre idée.
0
cs_JCDjcd Messages postés 1138 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 25 janvier 2009 4
24 déc. 2004 à 18:16
utilise WM_ERASE... (http://www.cppfrance.com/code.aspx?id=25498)
le probleme c'est que tu fais des MFC, et moi je connais pas; mais si tu fais du Win32API, il n'y a aucun probleme, tu dessine tes lignes vertes dans ce message.
0
Rejoignez-nous