C & API Win32: région invalide à réafficher..

C & API Win32: région invalide à réafficher.. - C - Programmation

Marsh Posté le 30-08-2005 à 01:11:31    

je débute en programmation windows en C (donc avec API Win32 ;) avec VC++6 ou 2003
 
j'ai codé un prog de base qui, dans la zone cliente d'une fenetre windows,
affiche des lignes de caractères (voir morceau de code ci-dessous).
 
en l'état actuel, à chaque fois qu'une région de la fenetre en question  
est rendue invalide:  
le code de la wndproc lié au message WM_PAINT appelle a nouveau  
toutes les fonctions, meme si la fct TextOut ne réaffiche réellement que la zone invalide,
on peut constater que toute la région cliente est passée en revue et que ça prend du temps..
 
OBJECTIF:
 
comment ne réafficher que la région invalide?
je vois qu'on peut récupérer les coordonnées de cette région dans la structure RECT
mais je ne sais pas comment procéder :(
 
help please
 
 
P.S. je n'ai pas internet actuellement.. je ne peux y accéder que très ponctuellement et 2-3 min seulement.. merci de votre compréhension.
 
Lep
 
voici une partie de mon code:

Code :
  1. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
  2. {
  3. static long xchar, ychar;
  4. HDC hdc;
  5. PAINTSTRUCT ps;
  6. RECT rect;
  7. TEXTMETRIC tm;
  8. int retour = 0;
  9. switch (message)
  10. {
  11. case WM_CREATE:
  12.  hdc = GetDC(hwnd);
  13.  GetTextMetrics(hdc, &tm);
  14.  xchar = tm.tmAveCharWidth;
  15.  ychar = tm.tmHeight + tm.tmExternalLeading;
  16.  ReleaseDC(hwnd, hdc);
  17.  break;
  18. case WM_PAINT:
  19.  hdc = BeginPaint(hwnd, &ps);
  20.  {
  21.   int car = ' ';
  22.   char szBuffer[50];
  23.   short i;
  24.   int Bottom = ps.rcPaint.bottom;
  25.   int Left = ps.rcPaint.left;
  26.   for (i = 0; i<40; i++)
  27.   {
  28.    wsprintf(szBuffer, " \"%c\" : %d   Bottom:  %d Left:  %d ", car, car, Bottom, Left);
  29.    TextOut(hdc, 10*xchar, ychar*i, szBuffer, strlen(szBuffer));
  30.    car++;
  31.    Sleep(100);  // pour voir les étapes de l'affichage
  32.    wsprintf(szBuffer, " \"%c\" : %d   Bottom:  %d Left:  %d ", car, car, BottomH, Left);
  33.    TextOut(hdc, 40*xchar, ychar*i, szBuffer, strlen(szBuffer));
  34.    car++;
  35.   }
  36.  }
  37.  EndPaint(hwnd, &ps);
  38.  break;
  39. case WM_CLOSE:
  40.  DestroyWindow(hwnd);
  41.  break;
  42. case WM_DESTROY:
  43.  // si fenetre 1  
  44.  if (hwnd == hwndGlobal)
  45.  {
  46.   PostQuitMessage(0);
  47.  }
  48.  break;
  49. default:
  50.  retour = DefWindowProc(hwnd, message, wparam, lparam);
  51. }
  52. return retour;


Reply

Marsh Posté le 30-08-2005 à 01:11:31   

Reply

Marsh Posté le 30-08-2005 à 05:21:19    

si ta fonction paint est lente, tu peux utiliser un double buffer.  
Tu ne rends dans ton back buffer que lorsque tu as besoin d'en changer le contenu. Lorsque tu reçois une commande paint, tu te contentes de copier le contenu du buffer dans ta fenetre en utilisant le rectangle partiel passé en argument à paint.

Reply

Marsh Posté le 30-08-2005 à 09:28:53    

Je crois que c'est le fait que le dessin apparaisse progressivement qui le dérange. Ca s'appelle le flickering. Ce que t'as donné LeGreg est la bonne solution.
Exemple ici:
http://msdn.microsoft.com/library/ [...] licker.asp


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed