GDI+C: Dessin sans scintillement

Soyez le premier à donner votre avis sur cette source.

Vue 7 fois - Téléchargée 1 fois

Description

Bonjour,

▼▼ Bug CCM-CS: voir ci-dessous ▼▼

En utilisant les move et zoom avec un dessin GDI assez conséquent, on remarque des scintillements (ou clignotements).
Deux manières permettent d'y remédier:
- La méthode du double buffer.
- En dessinant dans un DC (Device Context) supplémentaire crée en mémoire, puis en le copiant d'un seul coup (avec BitBlt) dans le DC ordinaire.

Nous choisirons la seconde méthode, où le DC doit être associé à un autre Bitmap (également crée en mémoire).

Presque toutes les propositions de code du web créent et suppriment ces deux éléments à chaque "Paint".
En fait, ceci n'est nécessaire que lorsque la dimension de la fenêtre change !
 

WM_SIZE

const HBRUSH fond=CreateSolidBrush(0XAAFFFF),col=CreateSolidBrush(0XFF0000);
HDC hdc,memDC=0;
HBITMAP BM=0;
RECT clRec;
int X0=0,Y0=0;
float Dil=1.0F; // x'=X0 + x*Dil; y'=Y0 + y*Dil;
// ...
  case WM_SIZE: {hdc=GetDC(h);
    if (BM) DeleteObject(BM);
    if (memDC) DeleteDC(memDC);
    GetClientRect(h,&clRec);
    memDC=CreateCompatibleDC(hdc); 
    BM=CreateCompatibleBitmap(hdc,clRec.right,clRec.bottom);
    SelectObject(memDC,BM);
  } return 0;

 

WM_PAINT

void Paint(HDC dc) { // Exemple
  const int X[]={100,300,500,700},Y[]={67,200,333,467};
  SelectObject(dc,col); SetBkMode(dc,TRANSPARENT);
  int x[4],y[4],rx=90*Dil,ry=60*Dil;
  for (int i=0; i<4; ++i) {x[i]=X0+(int)((X[i])*Dil); y[i]=Y0+(int)((Y[i])*Dil);}
  for (int j=0; j<4; ++j)
    for (int i=0; i<4; ++i) Ellipse(dc,x[i]-rx,y[j]-ry,x[i]+rx,y[j]+ry);
  TextOut(dc,10,4,"Dessin sans scintillement, par William VOIROL, Jan 2018",55);
}
// ...
  case WM_PAINT:
    hdc=BeginPaint(h,&ps);
    FillRect(memDC,&rect,fond);
    Paint(memDC);
    BitBlt(hdc,0,0,rect.right,rect.bottom,memDC,0,0,SRCCOPY);
    EndPaint(h,&ps);
    return 0;

 
 
N'oubliez pas d'essayer:
- Move: presser le bouton gauche de la souris et bougez.
- Zoom: roulette de la souris (zoom "intelligent").
- Changez la taille de la fenêtre.
 
 
Bonne lecture ...
 
 

Liens

CodeS-SourceS: GDI+A: Déplacement avec la souris
CodeS-SourceS: GDI+B: Move et Zoom avec la souris
 
 

Bug CCM-CS: Charger une image

Depuis le 14 oct. 2017, personne ne peut déposer un code avec une image comme on est pourtant invité à le faire (voir par exemple: Liste des derniers codes sources).
A mon avis, ces images de capture sont très importantes !

En attendant, je mets cette image à disposition dans le fichier Capture.jpg du Zip, et demande au lecteur de m'excuser pour cette complication.

Je me permets de signaler ici ce bug d'une manière peu conventionnelle, car malgré bien des demandes, les "responsables" sont restés muets (voir: Discussion: Charger une image).

Dans tous les articles, j'enlèverai toute référence à ce bug dès qu'il sera de nouveau possible de charger une image (de capture) pour les articles existants et nouveaux.
 
 

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Commenter la réponse de William VOIROL

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.