Redessiner le fond

Signaler
Messages postés
22
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 janvier 2005
-
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
-
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

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

sans les back buffer, ca marche ?
Messages postés
22
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 janvier 2005

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.

++
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
4
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).
Messages postés
22
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 janvier 2005

ok merci c sympa. je vais étudier ça. ça m'a l'air intéressant.

bonne journée
++
Messages postés
22
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 janvier 2005

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.

++
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
4
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.
Messages postés
22
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 janvier 2005

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 ?
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
4
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
Messages postés
22
Date d'inscription
jeudi 14 octobre 2004
Statut
Membre
Dernière intervention
3 janvier 2005

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.
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
4
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.