CodeS-SourceS
Rechercher un code, un tuto, une réponse

GDI+A: Déplacement avec la souris

Soyez le premier à donner votre avis sur cette source.

Vue 950 fois - Téléchargée 47 fois

Description

Bonjour,

Voici le premier article d'une série "GDI±?: …" basée sur Microsoft Windows GDI (Graphics Device Interface).

Les documents de la forme "GDI+X: …" (où X = A ,B , C, ...) sont évolutifs: c'est-à-dire qu'ils contiennent les développements précédents (plus ou moins adaptés).
Par contre, ceux de la forme "GDI-X: …" décrivent des applications particulières qui utilisent les développements de "GDI+X: …".

Déplacement (move) du dessin avec la souris:

La partie importante du code se trouve dans la fonction LRESULT CALLBACK Wpro:
LRESULT CALLBACK Wpro(HWND h,UINT m,WPARAM wP,LPARAM lP) {
  static XFORM T={1,0,0,1,0,0};
  static POINT pos;
  static bool move=false;
  static HDC hdc;
  PAINTSTRUCT ps;

  switch(m) {
  case WM_LBUTTONDOWN: move=true; pos.x=LOWORD(lP); pos.y=HIWORD(lP); return 0;
  case WM_MOUSEMOVE:
    if (move) {
      T.eDx+=LOWORD(lP)-pos.x; T.eDy+=HIWORD(lP)-pos.y;
      InvalidateRect(h,0,TRUE);
      pos.x=LOWORD(lP); pos.y=HIWORD(lP);
    }
    return 0;
  case WM_LBUTTONUP: move=false; return 0;
  case WM_PAINT: hdc=BeginPaint(h,&ps); Paint(hdc,&T); EndPaint(h,&ps); return 0;
  case WM_CLOSE: DestroyWindow(h); return 0;
  case WM_DESTROY: PostQuitMessage(0); return 0;
  }
  return DefWindowProc(h,m,wP,lP);
}
Observez les instructions qui utilisent les variables T,pos.

La fonction Paint permet de distinguer entre figures fixes et déplaçables:
void Paint(HDC hdc,XFORM *tfm) {
  const HBRUSH brshG=CreateSolidBrush(0X00FF00)
              ,brshB=CreateSolidBrush(0XFF0000)
              ,brshR=CreateSolidBrush(0X0000FF);
  SetBkMode(hdc,TRANSPARENT);
  SetGraphicsMode(hdc,GM_ADVANCED); // Permet l'utilisation de WorldTransform
  // Partie fixe
  ModifyWorldTransform(hdc,0,MWT_IDENTITY);
  TextOut(hdc,8,4,"GDI: Message fixe",17);
  // Partie déplaçable
  SetWorldTransform(hdc,tfm);
  TextOut(hdc,8,30,"GDI: Move avec la souris",24);
  st16.DrawPolygon(hdc,brshB,320,220);
  st5.DrawPolygon(hdc,brshR,120,300);
  st7.DrawPolygon(hdc,brshG,200,170);
  TextOut(hdc,8,400,"GDI: Move avec la souris",24);
}


L'objet utilisé comme exemple PointSet (ensemble de points) peut être étendue à d'autres figures:
struct PointSet {
  int nPT=0;
  POINT *pt;

  void SetDim(int n) {
    if (n!=nPT) {
      if (nPT>0) delete[] pt;
      pt=new POINT[nPT=n];
    }
  }
  void DrawPolygon(HDC hdc,HBRUSH brsh,int x,int y) {
    XFORM old,trl;
    GetWorldTransform(hdc,&old);
    trl=old; trl.eDx+=x; trl.eDy+=y;
    SetWorldTransform(hdc,&trl);
    SelectObject(hdc,brsh); Polygon(hdc,pt,nPT);
    SetWorldTransform(hdc,&old);
  }
  void Star(int nB,real R,real r) { // nB >= 2
    SetDim(2*nB);
    real s=(real)sin(DPI/nPT),c=(real)cos(DPI/nPT),x=0.0,xx,y=R,q=r/R;
    for (int n=0; n<nPT; n++) {
      pt[n].x=(int)x; pt[n++].y=(int)y;
      xx=x; x=xx*c-y*s; y=xx*s+y*c;
      pt[n].x=(int)(q*x); pt[n].y=(int)(q*y);
      xx=x; x=xx*c-y*s; y=xx*s+y*c;
    }
  }
  //
  // Autres figures: void Figure(int n, ...) {...}
};

Remarque: Ce move est un peu saccadé. On va améliorer ça par le suite avec la notion de double buffer.

Liens:
Windows: SetWorldTransform function
CodeS-SourceS: Simple graphique avec GDI
CodeS-SourceS: Canvas: Déplacement avec la Souris
CodeS-SourceS: Canvas: Move et Zoom avec la Souris

Comme pour les articles JavaScript: Canvas, le deuxième document de la série s'intitulera GDI+B: Move et Zoom avec la souris.

Bonne lecture …

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Donnez votre avis

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.