Rafraichissement fenetre winapi en c

Fermé
MR. - 2 janv. 2009 à 14:09
 MR. - 2 janv. 2009 à 17:12
bonjour a tous,
sa faire quelque semain que j'ai un gros probleme avec le rechaichissement winapi, se probleme menpaiche d'avancer dans mais projet.
se que je veut créer des jeu en 2d, et j'ai compri le principe mais le probleme c'est quand je deplace une forme geometrique, une image ... je suis obliger de rafraichir toute la fenetre ou juste le rectangle qui se deplace toute le milli second(ou autre ect...)et c'est la que survien le problem au bou de quelque minute dutilisation du programme ma le rectangle ne se deplace plus et la fenetre je decolor quand je la deplace elle devient blanche , enfin je vous epargne les detaille, en tou cas je me suis bien penché sur le probleme et j'en est deduis que sela venai de du rafraichissement car meme quand j'enlaive le deplasement du rectangle sa provoque le meme bug.
voila le un le code avec le rectangle:

#include <windows.h>
#include <stdlib.h>


#define direc_droite 011
#define direc_gauche 012
#define direc_haut 013
#define direc_bas 014

LRESULT CALLBACK Proc_principale (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
WNDCLASS wc;
MSG msg;
char szCn[]="standard";
HACCEL hAccel;
HWND hwnd;


inst=hInstance;

wc.style=CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=Proc_principale;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(hInstance,"IDI_ICON");
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=CreateSolidBrush(0xFFFFFF);
wc.lpszMenuName=NULL;
wc.lpszClassName=szCn;
RegisterClass(&wc);



hwnd=CreateWindowEx(0,szCn,"test",WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX|WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,800,600,NULL,NULL,hInstance,0);


hAccel=LoadAccelerators(hInstance,"IDA_ACCELERATOR");
while(GetMessage(&msg,NULL,0,0)==1)
{
if(TranslateAccelerator(hwnd,hAccel,&msg)==0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return msg.wParam;
}

RECT dim_rect={100,100,150,150};

LRESULT CALLBACK Proc_principale (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{


switch (message)
{
//redessine la fenetre
case WM_PAINT:
{
HPEN crayon = CreatePen(PS_SOLID, 3, RGB(0, 255, 0));
HBRUSH fon = CreateSolidBrush(RGB(255,0,0));
HBITMAP hBmp;
PAINTSTRUCT ps;
HDC hDC, hMemDC;

hDC = BeginPaint(hwnd, &ps);
hMemDC = CreateCompatibleDC(hDC);
hBmp = CreateCompatibleBitmap(hDC, 800, 600);
SelectObject(hMemDC, hBmp);

// contours noirs des yeux
//SelectObject(hMemDC, crayon);
SelectObject(hMemDC, fon);
Ellipse(hMemDC, dim_rect.left, dim_rect.top, dim_rect.right, dim_rect.bottom);
//Ellipse(hMemDC, CX, 0, CX+CX-1, CY-1);



// on affiche d'un coup le MemDC
BitBlt(hDC, 0, 0, 800, 600, hMemDC, 0, 0, SRCCOPY);
DeleteObject(hBmp);
DeleteDC(hMemDC);
EndPaint(hwnd, &ps);
}
return 0;
//********************

//création des control
case WM_CREATE:
{

}
return 0;
//********************

//les evenement
case WM_COMMAND:
{

}
return 0;
//************
case WM_KEYDOWN:
switch (wParam)
{
case VK_RIGHT:
SetTimer(hwnd, direc_droite, 1, 0);
return 0;

case VK_LEFT:
SetTimer(hwnd, direc_gauche, 1, 0);
return 0;

case VK_DOWN:
SetTimer(hwnd, direc_haut, 1, 0);
return 0;

case VK_UP:
SetTimer(hwnd, direc_bas, 1, 0);
return 0;
}
return 0;

case WM_KEYUP:
switch (wParam)
{
case VK_RIGHT:
KillTimer(hwnd, direc_droite);
return 0;

case VK_LEFT:
KillTimer(hwnd, direc_gauche);
return 0;

case VK_DOWN:
KillTimer(hwnd, direc_haut);
return 0;

case VK_UP:
KillTimer(hwnd, direc_bas);
return 0;
}
return 0;
case WM_TIMER:
switch (wParam)
{
case direc_droite:
dim_rect.left +=5;
dim_rect.right+=5;
//InvalidateRect(hwnd, &dim_rect_eff, TRUE);
// InvalidateRect(hwnd, &dim_rect, TRUE);
InvalidateRect(hwnd, NULL, FALSE);
UpdateWindow(hwnd);
return 0;

case direc_gauche:
dim_rect.left -=5;
dim_rect.right-=5;
//InvalidateRect(hwnd, &dim_rect_eff, TRUE);
//InvalidateRect(hwnd, &dim_rect, TRUE);
InvalidateRect(hwnd, NULL, FALSE);
UpdateWindow(hwnd);
return 0;

case direc_haut:
dim_rect.top+=5;
dim_rect.bottom+=5;
//InvalidateRect(hwnd, &dim_rect_eff, TRUE);
//InvalidateRect(hwnd, &dim_rect, TRUE);
InvalidateRect(hwnd, NULL, FALSE);
UpdateWindow(hwnd);
return 0;

case direc_bas:
dim_rect.top-=5;
dim_rect.bottom-=5;
//InvalidateRect(hwnd, &dim_rect_eff, TRUE);
//InvalidateRect(hwnd, &dim_rect, TRUE);
InvalidateRect(hwnd, NULL, FALSE);
UpdateWindow(hwnd);
return 0;
}
return 0;

case WM_CLOSE:
DestroyWindow(hwnd);
return 0;

case WM_DESTROY:
PostQuitMessage(0);
return 0;

default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
}

bon voila si vous nava pas compri quelque chose nesiter pas a me le dire car je sais que je mexprime mal.
merci et a ++.

1 réponse

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
2 janv. 2009 à 17:06
Salut,

Que se passe t'il si tu mets

return DefWindowProc(hwnd, message, wParam, lParam);

A la fin de ton bloc WM_PAINT au lieu d'un return 0 ?
0
sa n'a rien changer
0