Bonjour à tous,

J'essaye de déplacer un BITMAP que j'affiche dans une fenêtre lors du resize de celle-ci.
Pour faire ça, j'intercepte le message 'WM_SIZE' puis comme j'ai lu dans le forum, je tente d'effacer l'image puis de la ré-afficher à sa nouvelle position.
J'utilise le code suivant pour le faire :

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
 
case WM_CREATE:
		hDC = GetDC(hwnd);
		g_hBitmap = (HBITMAP)LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(IDB_INTERACTIVE_ICON));
		GetObject(g_hBitmap,sizeof(BITMAP),(LPVOID)(&infoBmp));
		width_Image = infoBmp.bmWidth; 
		height_Image = infoBmp.bmHeight; 
		break;
	case WM_PAINT:
		BeginPaint(hwnd,&ps);
		result = DrawState(hDC,NULL,NULL,(LPARAM)g_hBitmap,0,DEFAULT_SCREEN_WIDTH-40,DEFAULT_SCREEN_HEIGHT-40,0,0,DST_BITMAP);
		EndPaint(hwnd,&ps);
		break;
	case WM_SIZE:
		 //position control after window re-sizing
         dx=LOWORD(lParam); //LOWORD = WIDTH
         dy=HIWORD(lParam); //HIWORD = WEIGHT
         InvalidateRect(hwnd,NULL,false); // J'efface toute la zone cliente
		 result = DrawState(hDC,NULL,NULL,(LPARAM)g_hBitmap,0,dx-width_Image,dy-height_Image,0,0,DST_BITMAP); //Je ré-affiche le bitmap à sa nouvelle position
		 break;
Lorsque je fait ça, j'ai bien la nouvelle BITMAP qui s'affiche et qui se déplace lors du resize de la fenêtre. Le seul problème est que la bitmap affichée par le premier appel à DrawState dans 'case WM_PAINT:' n'est pas effacée. En gros, je me retrouve avec deux BITMAP affichée :
- une qui se déplace bien
- celle d'origine qui reste à sa place initiale.

Sauriez-vous pourquoi? Ai-je oublié de faire quelque chose? Comment dois-je supprimer la première BITMAP?

Une autre indication : si je passe la champ ' bErase' de la fonction InvalidateRect à TRUE, même problème sauf qu'en plus la nouvelle BITMAP (celle qui se déplace bien) scintille mais je sais pourquoi (il faut intercepter le message 'EraseBackgrd').

Merci d'avance!