JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Dessins élémentaires Lun 29 Jan 2018 - 15:25 | |
| Une autre petite sub pour dessiner rapidement des figures élémentaires sur un picture (contenant ou non une image). Figures de base: trait, rectangle, cercle. On peut choisir soit une des 16 couleurs de base, soit une couleur quelconque définie par R,G,B. Pour le remplissage de zones entourées d'une couleur donnée, j'ai fait appel à une fonction de KGF.dll de l'ami Klaus, je ne sais pas faire en Panoramic pur (si la zone n'est pas de couleur uniforme). Il faut donc ajuster le chemin de Kgf.dll en tête de la sub. Il n'y a qu'un seul droit à l'erreur (annuler la dernière figure tracée). - Code:
-
dim f$: f$ = "c:\graph\jpg\goldgate.jpg" width 0,660: height 0,520: border_small 0 picture 1: width 1,640: height 1,480: file_load 1,f$ DesPic(1) END ' ============================================================================== SUB DesPic(p%) ' Dessin de formes élémentaires sur le picture p% IF LABEL("Clk") = 0 THEN LABEL Clk IF LABEL("Anud") = 0 THEN LABEL Anud IF LABEL("Typf") = 0 THEN LABEL Typf IF LABEL("Colf") = 0 THEN LABEL Colf IF LABEL("Hlp") = 0 THEN LABEL Hlp IF LABEL("Qqit") = 0 THEN LABEL Qqit DIM_LOCAL fm%,co%,cf%,fig%,ff%,x%,y%,x1%,y1%,ct%,cc%,sp%,ry%,i%,j%,k%,r%,g%,b%,sc%,bc% DIM_LOCAL rt%,gt%,bt%,rf%,gf%,bf%,pm%,kgf$,a$,cr$ kgf$ = "C:\PANORAMIC\KGF\KGF.dll": ' <==== A AJUSTER ========================= cr$ = CHR$(13)+CHR$(10) fm% = 900 FORM fm%: BORDER_SMALL fm%: LEFT fm%,WIDTH(0): WIDTH fm%,220: HEIGHT fm%,210 ON_CLOSE fm%,Qqit: CAPTION fm%," - OUTILS DE DESSIN -" FONT_BOLD fm%: COLOR fm%,190,255,255 i%=fm%+1: CONTAINER_OPTION i%: PARENT i%,fm%: WIDTH i%,WIDTH_CLIENT(fm%) HEIGHT i%,55: COLOR i%,255,255,128: co% = i% i%=i%+1: OPTION i%: PARENT i%,co%: TOP i%,5: LEFT i%,5: CAPTION i%,"Trait" i%=i%+1: OPTION i%: PARENT i%,co%: TOP i%,20: LEFT i%,5: CAPTION i%,"Rectangle vide" i%=i%+1: OPTION i%: PARENT i%,co%: TOP i%,35: LEFT i%,5: CAPTION i%,"Rectangle plein" i%=i%+1: OPTION i%: PARENT i%,co%: TOP i%,5: LEFT i%,110: CAPTION i%,"Cercle vide" i%=i%+1: OPTION i%: PARENT i%,co%: TOP i%,20: LEFT i%,110: CAPTION i%,"Cercle plein" i%=i%+1: OPTION i%: PARENT i%,co%: TOP i%,35: LEFT i%,110: CAPTION i%,"Remplissage" FOR j% = co%+1 TO i%: ON_CLICK j%,Typf: NEXT j% MARK_ON co%+1: fig% = 1: ' trait i%=i%+1: ALPHA i%: PARENT i%,fm%: TOP i%,HEIGHT(co%)+5: LEFT i%,5: CAPTION i%,"Ép. trait:" i%=i%+1: SPIN i%: PARENT i%,fm%: TOP i%,TOP(i%-1)+15: LEFT i%,5: WIDTH i%,45: sp% = i% MIN sp%,1: MAX sp%,20: POSITION sp%,1 i%=i%+1: ALPHA i%: PARENT i%,fm%: TOP i%,TOP(i%-2): LEFT i%,65: CAPTION i%,"Coul. trait" i%=i%+1: PICTURE i%: PARENT i%,fm%: TOP i%,TOP(i%-1)+15: LEFT i%,LEFT(i%-1)+5 WIDTH i%,50: HEIGHT i%,22: 2D_FILL_COLOR 0,0,0: COLOR i%,0,0,0 ON_CLICK i%,Colf: ct%=i% i%=i%+1: ALPHA i%: PARENT i%,fm%: TOP i%,TOP(i%-2): LEFT i%,135: CAPTION i%,"Coul. rempl." i%=i%+1: PICTURE i%: PARENT i%,fm%: TOP i%,TOP(i%-1)+15: LEFT i%,LEFT(i%-1)+5 WIDTH i%,50: HEIGHT i%,22: COLOR i%,255,255,255: ON_CLICK i%,Colf: cf% = i% i%=i%+1: PICTURE i%: PARENT i%,fm%: TOP i%,TOP(i%-1)+25: LEFT i%,4: WIDTH i%,WIDTH(co%)-8 HEIGHT i%,20: k% = WIDTH(co%)/16: 2D_TARGET_IS i%: 2D_FILL_ON FOR j% = 0 TO 15 SELECT j% CASE 0: 2D_FILL_COLOR 0,0,0: ' Noir CASE 1: 2D_FILL_COLOR 0,0,128: ' Bleu CASE 2: 2D_FILL_COLOR 0,128,0: ' Vert CASE 3: 2D_FILL_COLOR 0,128,128: ' Cyan CASE 4: 2D_FILL_COLOR 128,0,0: ' Rouge CASE 5: 2D_FILL_COLOR 128,0,128: ' Magenta CASE 6: 2D_FILL_COLOR 128,64,0: ' Brun CASE 7: 2D_FILL_COLOR 192,192,192: ' Blanc CASE 8: 2D_FILL_COLOR 128,128,128: ' Gris CASE 9: 2D_FILL_COLOR 0,0,255: ' Bleu clair CASE 10: 2D_FILL_COLOR 0,255,0: ' Vert clair CASE 11: 2D_FILL_COLOR 0,255,255: ' Cyan clair CASE 12: 2D_FILL_COLOR 255,0,0: ' Rouge clair CASE 13: 2D_FILL_COLOR 255,0,255: ' Magenta clair CASE 14: 2D_FILL_COLOR 255,255,0: ' Jaune CASE 15: 2D_FILL_COLOR 255,255,255: ' Blanc intense END_SELECT 2D_RECTANGLE j%*k%,0,(j%+1)*k%+1,19 NEXT j% ON_CLICK i%,Colf i%=i%+1: ALPHA i%: PARENT i%,fm%: TOP i%,TOP(i%-1)+27: LEFT i%,1 CAPTION i%,"R= G= B=" i%=i%+1: SPIN i%: PARENT i%,fm%: TOP i%,TOP(i%-1)-3: LEFT i%,15: WIDTH i%,45: sc% = i% i%=i%+1: SPIN i%: PARENT i%,fm%: TOP i%,TOP(i%-1): LEFT i%,75: WIDTH i%,45 i%=i%+1: SPIN i%: PARENT i%,fm%: TOP i%,TOP(i%-1): LEFT i%,135: WIDTH i%,45 FOR j%=i%-2 TO i%: MIN i%,0: MAX i%,255: POSITION i%,0: NEXT j% i%=i%+1: BUTTON i%: PARENT i%,fm%: TOP i%,TOP(i%-1)-2: WIDTH i%,25: LEFT i%,LEFT(i%-1)+43 CAPTION i%,"OK": ON_CLICK i%,Colf: bc%=i% i%=i%+1: BUTTON i%: PARENT i%,fm%: TOP i%,HEIGHT_CLIENT(fm%)-25: LEFT i%,3: WIDTH i%,25 CAPTION i%,"?": FONT_SIZE i%,11: ON_CLICK i%,Hlp i%=i%+1: BUTTON i%: PARENT i%,fm%: TOP i%,TOP(i%-1) LEFT i%,LEFT(i%-1)+30: WIDTH i%,90: CAPTION i%,"Annul dernier": ON_CLICK i%,Anud i%=i%+1: BUTTON i%: PARENT i%,fm%: TOP i%,TOP(i%-1) LEFT i%,LEFT(i%-1)+95: CAPTION i%,"Quitter": ON_CLICK i%,Qqit i%=i%+1: PICTURE i%: PARENT i%,fm%: HIDE i%: pm%=i%: ' picture de manoeuvre 2D_TARGET_IS p% WHILE ff% = 0 IF MOUSE_LEFT_DOWN(p%) = 1 x1% = MOUSE_X_POSITION(p%): y1% = MOUSE_Y_POSITION(p%) 2D_FILL_OFF: 2D_PEN_WIDTH POSITION(sp%) CLIPBOARD_COPY p% rt% = COLOR_PIXEL_RED(ct%,2,2): gt% = COLOR_PIXEL_GREEN(ct%,2,2) bt% = COLOR_PIXEL_BLUE(ct%,2,2): 2D_PEN_COLOR rt%,gt%,bt% rf% = COLOR_PIXEL_RED(cf%,2,2): gf% = COLOR_PIXEL_GREEN(cf%,2,2) bf% = COLOR_PIXEL_BLUE(cf%,2,2): 2D_FILL_COLOR rf%,gf%,bf% WHILE MOUSE_LEFT_UP(p%) = 0 x% = MOUSE_X_POSITION(p%): y% = MOUSE_Y_POSITION(p%) CLIPBOARD_PASTE p% 2D_FILL_OFF SELECT fig% CASE 1: j% = SCANCODE: SCANCODE = 0 IF j% = 160 AND x%<>x1% AND y%<>y1%: ' Maj gauche enfoncé j% = ABS(y%-y1%)/ABS(x%-x1%) IF j% > 1: ' angle >45°: -> verticale x% = x1% ELSE: ' horizontale y% = y1% END_IF END_IF 2D_LINE x1%,y1%,x%,y% CASE 2: 2D_RECTANGLE x1%,y1%,x%,y%: ' rectangle vide CASE 3: 2D_FILL_ON: 2D_FILL_COLOR rf%,gf%,bf% 2D_RECTANGLE x1%,y1%,x%,y%: ' rectangle plein CASE 4: ry% = SQR((x%-x1%)*(x%-x1%)+(y%-y1%)*(y%-y1%)): ' cercle vide 2D_CIRCLE x1%,y1%,ry% CASE 5: ry% = SQR((x%-x1%)*(x%-x1%)+(y%-y1%)*(y%-y1%)): ' cercle plein 2D_FILL_ON: 2D_FILL_COLOR rf%,gf%,bf% 2D_CIRCLE x1%,y1%,ry% CASE 6: i% = 65536*bf%+256*gf%+rf%: ' couleur de remplissage (BGR) j% = 65536*bt%+256*gt%+rt%: ' couleur de trait CLIPBOARD_PASTE pm% DLL_ON kgf$ k% = DLL_CALL0("LoadPicture"): ' presse-papier -> image interne k% = DLL_CALL4("FloodfillPictureToBorderColor",x%,y%,i%,j%) k% = DLL_CALL0("SavePicture"): ' image interne -> presse-papier DLL_OFF CLIPBOARD_PASTE p% CLIPBOARD_COPY pm%: ' restore le clip pour annul éventuel END_SELECT PAUSE 50 END_WHILE END_IF END_WHILE 2D_TARGET_IS 0: DELETE fm%: EXIT_SUB ' ------------------------------------------------------------------------------ Clk: WHILE MOUSE_LEFT_DOWN(p%) = 0: PAUSE 100: END_WHILE x1% = MOUSE_X_POSITION(p%): y1% = MOUSE_Y_POSITION(p%) 2D_FILL_OFF: 2D_PEN_WIDTH POSITION(sp%) CLIPBOARD_COPY p% rt% = COLOR_PIXEL_RED(ct%,2,2): gt% = COLOR_PIXEL_GREEN(ct%,2,2) bt% = COLOR_PIXEL_BLUE(ct%,2,2): 2D_PEN_COLOR rt%,gt%,bt% rf% = COLOR_PIXEL_RED(cf%,2,2): gf% = COLOR_PIXEL_GREEN(cf%,2,2) bf% = COLOR_PIXEL_BLUE(cf%,2,2): 2D_FILL_COLOR rf%,gf%,bf% WHILE MOUSE_LEFT_UP(p%) = 0 x% = MOUSE_X_POSITION(p%): y% = MOUSE_Y_POSITION(p%) CLIPBOARD_PASTE p% 2D_FILL_OFF SELECT fig% CASE 1: 2D_LINE x1%,y1%,x%,y% CASE 2: 2D_RECTANGLE x1%,y1%,x%,y%: ' rectangle vide CASE 3: 2D_FILL_ON: 2D_FILL_COLOR rf%,gf%,bf% 2D_RECTANGLE x1%,y1%,x%,y%: ' rectangle plein CASE 4: ry% = SQR((x%-x1%)*(x%-x1%)+(y%-y1%)*(y%-y1%)): ' cercle vide 2D_CIRCLE x1%,y1%,ry% CASE 5: ry% = SQR((x%-x1%)*(x%-x1%)+(y%-y1%)*(y%-y1%)): ' cercle plein 2D_FILL_ON: 2D_FILL_COLOR rf%,gf%,bf% 2D_CIRCLE x1%,y1%,ry% CASE 6: i% = 65536*bf%+256*gf%+rf%: ' couleur de remplissage (BGR) j% = 65536*bt%+256*gt%+rt%: ' couleur de trait CLIPBOARD_PASTE pm% DLL_ON kgf$ k% = DLL_CALL0("LoadPicture"): ' presse-papier -> image interne k% = DLL_CALL4("FloodfillPictureToBorderColor",x%,y%,i%,j%) k% = DLL_CALL0("SavePicture"): ' image interne -> presse-papier DLL_OFF CLIPBOARD_PASTE p% CLIPBOARD_COPY pm%: ' pour annul éventuel END_SELECT PAUSE 50 END_WHILE GOTO Clk RETURN ' ------------------------------------------------------------------------------ Anud: ' Annuler la dernière opération CLIPBOARD_PASTE p% RETURN ' ------------------------------------------------------------------------------ Typf: k% = NUMBER_CLICK: fig% = k%-co%: ' type de figure RETURN ' ------------------------------------------------------------------------------ Colf: k% = NUMBER_CLICK IF k% = ct%: ' couleur trait cc% = 1 ELSE IF k% = cf%: ' couleur de remplissage cc% = 2 ELSE: ' couleur choisie IF k% = bc%: ' bouton OK, couleur personnalisée r% = POSITION(sc%): g% = POSITION(sc%+1): b% = POSITION(sc%+2) ELSE i% = MOUSE_X_POSITION(cf%+1): j% = MOUSE_Y_POSITION(cf%+1) r% = COLOR_PIXEL_RED(cf%+1,i%,j%): g% = COLOR_PIXEL_GREEN(cf%+1,i%,j%) b% = COLOR_PIXEL_BLUE(cf%+1,i%,j%) POSITION sc%,r%: POSITION sc%+1,g%: POSITION sc%+2,b% END_IF IF cc% = 1: ' couleur trait rt%=r%: gt%=g%: bt%=b%: COLOR ct%,rt%,gt%,bt% ELSE: ' couleur fond IF cc% = 2 THEN rf%=r%: gf%=g%: bf%=b%: COLOR cf%,rf%,gf%,bf% END_IF cc% = 0 END_IF END_IF RETURN ' ------------------------------------------------------------------------------ Hlp: a$ = " - TRACÉ DE FIGURES ÉLÉMENTAIRES -"+cr$ a$=a$+" ========================="+cr$+cr$ a$=a$+"- Cocher le type de figure à tracer"+cr$+cr$ a$=a$+"- Choisir l'épaisseur du tracé (1 à 20 pixels)"+cr$+cr$ a$=a$+"- Choisir la couleur du tracé et la couleur de remplissage :"+cr$ a$=a$+" . Couleur standard: cliquer la couleur actuelle, puis la couleur désirée."+cr$ a$=a$+" . Couleur personnalisée: entrer les valeurs R,G,B, cliquer la couleur"+cr$ a$=a$+" actuelle, puis 'OK'."+cr$+cr$ a$=a$+"NB:"+cr$ a$=a$+" - Tracé de ligne: touche 'Maj' gauche enfoncée pour une ligne"+cr$ a$=a$+" parfaitement horizontale ou verticale."+cr$ a$=a$+" - Remplissage: la zone cliquée entourée par la couleur de trait est remplie"+cr$ a$=a$+" par la couleur de remplissage."+cr$ a$=a$+" - Il est possible d'annuler la dernière opération (une seule fois)." MESSAGE a$ RETURN ' ------------------------------------------------------------------------------ Qqit: ff% = 1: : 2D_TARGET_IS 0: DELETE fm%: EXIT_SUB RETURN END_SUB ' ============================================================================== | |
|