JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Pour coincer la bulle Jeu 6 Avr 2017 - 17:51 | |
| Promis juré je n'ai pas copié sur Klaus... Quelque chose de beaucoup moins sophistiqué que ce qu'a fait l'ami Klaus, pour désigner et commenter un point précis d'une image (ici dans un picture): un cadre avec un texte et une flèche vers le point, sous la forme d'une sub. - Code:
-
DIM txt$,x%,y%,pos%,typ%,rc$,x2%,y2% rc$ = CHR$(13)+CHR$(10) width 0,660: height 0,520: border_small 0 PICTURE 1: WIDTH 1,640: HEIGHT 1,480 FILE_LOAD 1,"C:\GRAPH\JPG\goldgate.jpg": ' image 640 x 480 (exemple) txt$ = "San Francisco: pont du Golden Gate"+rc$+"qui relie la baie au Pacifique." typ% = 1: pos% = 4: x% = 250: y% = 100: ' rectangle arrondi Bulle(1,x%,y%,pos%,typ%,txt$) txt$ = "Ceci est"+rc$+"un petit voilier" typ% = 3: pos% = 8: x% = 530: y% = 360: ' ellipse Bulle(1,x%,y%,pos%,typ%,txt$) txt$ = "Mille sabords !"+rc$+"Y a-t'il quelqu'un"+rc$+"à bord ?" typ% = 1: pos% = 3: x% = 565: y% = 270: ' cercle Bulle(1,x%,y%,pos%,typ%,txt$) x% = 320: y% = 240: typ% = 1: ' différentes positions pos% = 1: x% = 200: y% = 240: Bulle(1,x%,y%,pos%,typ%,"- "+STR$(pos%)+" -") pos% = 2: x% = 200: y% = 220: Bulle(1,x%,y%,pos%,typ%,"- "+STR$(pos%)+" -") pos% = 3: x% = 220: y% = 220: Bulle(1,x%,y%,pos%,typ%,"- "+STR$(pos%)+" -") pos% = 4: x% = 240: y% = 220: Bulle(1,x%,y%,pos%,typ%,"- "+STR$(pos%)+" -") pos% = 5: x% = 240: y% = 240: Bulle(1,x%,y%,pos%,typ%,"- "+STR$(pos%)+" -") pos% = 6: x% = 240: y% = 260: Bulle(1,x%,y%,pos%,typ%,"- "+STR$(pos%)+" -") pos% = 7: x% = 220: y% = 260: Bulle(1,x%,y%,pos%,typ%,"- "+STR$(pos%)+" -") pos% = 8: x% = 200: y% = 260: Bulle(1,x%,y%,pos%,typ%,"- "+STR$(pos%)+" -") END ' ==================== SUB Bulle(p%,x%,y%,pos%,typ%,txt$) ' Apposer un texte txt$ en forme de bulle sur le picture p% ' typ% = 0: rectangle, = 1: rectangle arrondi, = 2: cercle, = 3: ellipse ' NB: rectangle coins arrondis non codé : ' Flèche pointant en x%,y% ' pos% = position de la bulle par rapport au point cible x%,y% ' =1 à gauche, =2 en haut à gauche, =3 au dessus à gauche, =4 en haut à droite ' =5 à droite, =6 en bas à droite, =7 au dessous, =8 en bas à gauche ' A moduler: couleurs de trait et de fond, épaisseur trait, taille texte, etc. DIM_LOCAL rc$,i%,k%,nl%,tx$(10),wt%,hl%,ht%,wb%,hb%,xb%,yb%,d%,x1%,y1%,ra%,xc%,yc% DIM_LOCAL an%,a1%,a2%,a%,ol%,oh%,et% rc$ = CHR$(13)+CHR$(10) 2D_TARGET_IS p%: PRINT_TARGET_IS p%: FONT_SIZE p%,10: ' police/taille à moduler k% = INSTR(txt$,rc$): wt% = 0 WHILE k% > 0 nl% = nl%+1: tx$(nl%) = LEFT$(txt$,k%-1): txt$ = RIGHT_POS$(txt$,k%+2) i% = TEXT_WIDTH(tx$(nl%),p%): IF i% > wt% THEN wt% = i% k% = INSTR(txt$,rc$) END_WHILE nl% = nl%+1: tx$(nl%) = txt$ i% = TEXT_WIDTH(tx$(nl%),p%): IF i% > wt% THEN wt% = i% hl% = TEXT_HEIGHT(tx$(1),p%): ht% = hl%*nl%: ' hauteur totale du texte wb% = wt%+20: hb% = ht%+10: ' dimensions du cadre extérieur IF typ% = 2 THEN i% = MAX(wb%,hb%): wb% = i%: hb% = i%: ' cercle d% = 40: ' longueur du segment flèche SELECT pos% CASE 1: xb% = x%-wb%-d%: yb% = y%-hb%/2 CASE 2: xb% = x%-wb%-d%: yb% = y%-hb%-d% CASE 3: xb% = x%-wb%/2: yb% = y%-hb%-d% CASE 4: xb% = x%+d%: yb% = y%-hb%-d% CASE 5: xb% = x%+d%: yb% = y%-hb%/2 CASE 6: xb% = x%+d%: yb% = y%+d% CASE 7: xb% = x%-wb%/2: yb% = y%+d% CASE 8: xb% = x%-wb%-d%: yb% = y%+d% END_SELECT xc% = xb%+wb%/2: yc% = yb%+hb%/2: ' centre de la bulle ' Tracé de la flèche IF xc% = x% THEN xc% = xc%+1 IF yc% = y% THEN yc% = yc%+1 2D_PEN_WIDTH 3: 2D_PEN_COLOR 255,0,0: 2D_LINE xc%,yc%,x%,y%: ' Tracé de l'axe de la flèche DEGREES an% = ATN((y%-yc%)/(x%-xc%)): ' inclinaison de l'axe de la flèche d% = 15: a% = 30: ' longueur et écartement (angle) des ailes de la flèche a1% = an%-a%: a2% = an%+a% IF x%>xc% AND y%<yc% THEN a1% = a1%+180: a2% = a2%+180 IF x%>xc% AND y%>yc% THEN a1% = a1%+180: a2% = a2%-180 x1% = d%*COS(a1%)+x%: y1% = d%*SIN(a1%)+y%: 2D_LINE x%,y%,x1%,y1% x1% = d%*COS(a2%)+x%: y1% = d%*SIN(a2%)+y%: 2D_LINE x%,y%,x1%,y1% 2D_FILL_COLOR 255,255,0: ' couleur de fond et% = 3: 2D_PEN_WIDTH et%: ' épaisseur et couleur de trait SELECT typ% CASE 0: 2D_RECTANGLE xb%,yb%,xb%+wb%,yb%+hb% CASE 1: ra% = 8: ' rectangle coins arrondis, rayon arbitraire de l'arrondi 2D_PEN_COLOR 255,255,0: 2D_RECTANGLE xb%+et%-2,yb%+ra%-1,xb%+wb%-et%+3,yb%+hb%-ra%+1 2D_RECTANGLE xb%+2*et%-2,yb%+et%-1,xb%+wb%-2*et%+3,yb%+hb%-et%+2 2D_PEN_COLOR 255,0,0 xc% = xb%+ra%: yc% = yb%+ra%: 2D_POLY_FROM xb%,yb%+ra% FOR a% = 180 TO 270 STEP 45: 2D_POLY_TO xc%+ra%*COS(a%),yc%+ra%*SIN(a%): NEXT a% 2D_POLY_TO xb%+wb%-ra%,yb% xc% = xb%+wb%-ra% FOR a% = 270 TO 360 STEP 45: 2D_POLY_TO xc%+ra%*COS(a%),yc%+ra%*SIN(a%): NEXT a% 2D_POLY_TO xb%+wb%,yb%+hb%-ra% yc% = yb%+hb%-ra% FOR a% = 0 TO 90 STEP 45: 2D_POLY_TO xc%+ra%*COS(a%),yc%+ra%*SIN(a%): NEXT a% 2D_POLY_TO xb%+ra%,yb%+hb% xc% = xb%+ra% FOR a% = 90 TO 180 STEP 45: 2D_POLY_TO xc%+ra%*COS(a%),yc%+ra%*SIN(a%): NEXT a% 2D_POLY_TO xb%,yb%+ra% CASE 2: 2D_CIRCLE xc%,yc%,wb%/2 CASE 3: wb% = wb%*12/10: hb% = hb%*12/10 DLL_ON "gdi32.dll": k% = HANDLE_CANVAS(p%) i% = DLL_CALL5("Ellipse",k%,xb%,yb%,xb%+wb%,yb%+hb%) DLL_OFF END_SELECT x% = xb%+(wb%-wt%)/2: y% = yb%+(hb%-ht%)/2: ' centrage du texte FOR i% = 1 TO nl%: PRINT_LOCATE x%,y%: PRINT tx$(i%): y% = y%+hl%: NEXT i% END_SUB ' ==================== Le rectangle/bulle se dimensionne automatiquement en fonction du texte inclus. On peut faire partir la flèche des 4 coins, ou du haut ou du bas de la bulle. Pour modifier les paramètres annexes: police, taille, couleur, enrichissements, couleur du fond, épaisseur du trait, il faut intervenir dans le code, je ne l'ai pas mis dans les paramètres d'appel à la sub pour ne pas compliquer, mais tout est possible. Et tout en Panoramic. Il serait facile d'envisager d'autres formes d'enveloppe un peu plus artistiques que le rectangle, cercle ou ellipse par exemple, avec un paramètre supplémentaire... Edit: petite simplification de la sub.Edit 7/4: ajout des rectangles à coins arrondis, ellipses et cercles. Ça complique un peu, mais bon, qui peut le plus peut le moins.
Dernière édition par JL35 le Sam 8 Avr 2017 - 15:13, édité 5 fois | |
|