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 …
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.