Affichage bitmap

Résolu
cs_gregory6 Messages postés 22 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 3 janvier 2005 - 3 déc. 2004 à 18:27
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 3 déc. 2004 à 22:27
Gringo

Bonjour,

je suis débutant ss visual C++ et j'aurai besoin d'un peu d'aide. Je crée un projet MFC ds lequel je crée une fenetre. Cette fenetre crée, je dessine à l'interieur. c'est une première fonction. J'aimerai afficher un second dessin que je crée ds une deuxième fonction lors de l'appui sur une des touches de fonctions F1,F2,... que j'intercepte grace au WM_KEYDOWN.
J'essaie d'utiliser la technique du double buffering pour éviter les clignotements. Cependant ma fenetre s'ouvre, j'appuie sur F1, il dessine ce que je souhaite, mais lorsque j'appuie sur F2, il ne rafraichis pas la fenetre. Si qqn pourrait m'aider à résoudre ce problème, ce serait super sympa.

Je vous montre le code.

void Dessiner(HWND hwnd)
{

int w,h;
CRect rect;
GetClientRect(hwnd,rect);
w = rect.Width();
h = rect.Height();
HDC hdc;
HDC hMemDC;
PAINTSTRUCT ps;
hdc=BeginPaint(hwnd,&ps);

hMemDC =CreateCompatibleDC(hdc);
HBITMAP hMemBmp = CreateCompatibleBitmap(hdc, w, h);
HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDC,hMemBmp);

je simplifie la partie dessin
HBRUSH backBrush = CreateSolidBrush(RGB(010,106,010));
(HBRUSH)SelectObject(hMemDC,backBrush);
FillRect( hMemDC, rect, backBrush);

CString s0="DESSIN1";
SetTextAlign(hMemDC,TA_BASELINE | TA_LEFT);
SetTextColor(hMemDC,(RGB(255,255,255)));
SetBkMode(hMemDC,TRANSPARENT);
TextOut(hMemDC,7,18,s0,20);

BitBlt(hdc,0,0,w+1,h+1,hMemDC,0,0,SRCCOPY);
SelectObject(hMemDC, hOldBmp);
DeleteObject(hMemBmp);
DeleteDC(hMemDC);

EndPaint(hwnd,&ps);
}

Ma deuxieme fonction est identique j'affiche un truc différent.

Là je crée la fenetre, mais je détaille pas ça fonctionne. Je déclare hdc, hMemDC, hMembmp, hOldBmp en variables globales.

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)

Ensuite pour le traitement des messages, j'écris :

LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam)
{
static int cx,cy;

switch (iMsg)
{
case WM_CREATE:
{
return 0;
}
case WM_SIZE:
{
cx = LOWORD(lParam);
cy = HIWORD(lParam);
break;
}
case WM_PAINT:
{

hdc=BeginPaint(hwnd,&ps);

BitBlt(hdc,0,0,cx,cy,hMemDC,0,0,SRCCOPY);

SelectObject(hMemDC, hOldBmp);
DeleteObject(hMemBmp);
DeleteDC(hMemDC);

EndPaint(hwnd,&ps);

}
case WM_KEYDOWN:
{
if(wParam==VK_ESCAPE)
PostMessage(hwnd,WM_DESTROY,0,0);

else if(wParam==VK_F1)
Dessiner(hwnd);

else if(wParam==VK_F3)
{
Dessiner2(hwnd);
}
return 0;

}
case WM_DESTROY:
{
PostQuitMessage (0);
return 0;
}
}

return DefWindowProc(hwnd,iMsg,wParam,lParam);
}

Voilà le code, j'espère que j'ai été assez clair. Je vous remercie de toute aide conseils ou lien pour résoudre mon problème.

Tchao.

3 réponses

cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
3 déc. 2004 à 19:50
"il ne rafraichis pas la fenetre" > Il faut faire un InvalidateRect() pour forcer le rafraichissement de la fenetre.

+2(p - n)
3
cs_gregory6 Messages postés 22 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 3 janvier 2005
3 déc. 2004 à 21:14
Gringo

ok merci, ça fonctionne nickel.
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 déc. 2004 à 22:27
DeleteObject(hMemBmp);
DeleteDC(hMemDC);

Ces deux lignes dans WM_PAINT sont assez curieuses... enfin si ca marche c'est sans dout que tu n'as pas copié tout ton code ici
0
Rejoignez-nous