GDI+C: Dessin sans scintillement

Soyez le premier à donner votre avis sur cette source.

Vue 952 fois - Téléchargée 102 fois

Description

[Version avec image de capture qui remplace celle du 13.01.2018]

Bonjour,

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

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.