FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Simuler l’appui de n’importe quelle touche.
par papydall Hier à 23:54

» Le Forum est en vacances.
par JL35 Hier à 21:20

» Une autre façon de terminer une application.
par JL35 Mar 22 Aoû 2017 - 14:27

» Compilateur FBPano
par Mike Lun 21 Aoû 2017 - 23:17

» Pb 20 (en analyse): plantage à l'appel d'un SUB
par Jack Lun 21 Aoû 2017 - 21:58

» Pb 19 (en analyse): libellé d'erreur dans des IF imbriqués
par Jack Lun 21 Aoû 2017 - 21:55

» Copier / coller du texte à partir de la fenêtre de commandes
par jean_debord Lun 21 Aoû 2017 - 9:46

» COMPILATEUR V 0.9 beta 8 du 18 aout 2017
par papydall Lun 21 Aoû 2017 - 5:01

» Mettre en windows en veille
par papydall Lun 21 Aoû 2017 - 4:15

» Stretch_on ne stretch plus...
par papydall Dim 20 Aoû 2017 - 15:22

» Pb 18 (en analyse): RESTORE_LABEL avec DATA à la fin
par Jack Dim 20 Aoû 2017 - 13:21

» Problème de traitement des opérateurs avec le compilateur.
par Pedro Alvarez Sam 19 Aoû 2017 - 20:01

» Pb 17 (résolu): ITEM_SELECT ne fonctionne pas
par Jack Jeu 17 Aoû 2017 - 19:26

» un nouveau editeur panobasic
par Jean Claude Jeu 17 Aoû 2017 - 10:18

» Le compilateur.
par Pedro Alvarez Jeu 17 Aoû 2017 - 8:36

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Août 2017
LunMarMerJeuVenSamDim
 123456
78910111213
14151617181920
21222324252627
28293031   
CalendrierCalendrier

Partagez | 
 

 Menus et Cartes

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
JL35



Nombre de messages : 5928
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Menus et Cartes   Mer 31 Déc 2014 - 19:19

Le dernier de l'année, tant pis si ça passe un peu inaperçu...
La représentation d'une page A4, soit entière pour les grands moniteurs, soit par moitié supérieure ou inférieure, au choix, à assembler au moment de l'impression.
Pour fabriquer en particulier des menus (pas panoramic, pour manger !) et cartes de voeux (à plier) ou des affichettes ou autres.

Le programme contient plusieurs sub qui peuvent intéresser:
- une sub Dessin pour insérer toutes sortes de figures ou dessiner à main levée.
- une sub Texte, idem pour du texte
- une sub Image, idem pour des images
On fabrique l'objet à insérer dans une fenêtre à part, on clique dans la page au point d'insertion, et à partir de là on peut:
- l'annuler purement et simplement (seulement le dernier objet inséré).
- le déplacer dans tous les sens.
- l'agrandir ou le réduire.
Il est possible de pivoter l'image de 180° par quart de page, pour les cas de pages A4 à replier en 4. Cette rotation peut également se faire au moment de l'impression, dans le cas d'assemblage de deux demi-pages.

Une fois la page dessinée, on peut l'archiver et/ou l'imprimer.

Le fonctionnement est simple, il y a un mode d'emploi assez succinct mais suffisant à mon avis.

Le programme fait appel à KGF.dll (merci Klaus) et à IrfanView pour les traitements d'images.
Pour des raisons de facilité de transport d'un pc à l'autre, j'ai tout regroupé dans un seul répertoire qui s'appelle C:\MENU chez moi, et qui contient tout: le programme bas lui-même (et l'exécutable si compilé), l'éditeur Panoramic, KGF.dll, une version portable d'IrfanView, et un sous-répertoire FICHIERS qui contient les fichiers de travail et les fichiers résultats (au format BMP). Donc tous les chemins mènent à Rome à ce répertoire, c'est plus simple. Donc à vérifier, ou modifier, en tête du programme.

Le programme fait environ 1600 lignes, je vais donc le passer ici en deux morceaux (sinon ça ne passera pas), à recoller à l'arrivée:

1ère partie:
Code:
LABEL Fin,Echelles,Nouveau,Ouvrir,Ouvrir1,Enreg,Enreg1,Grille,Axes,Imprimer
LABEL Colle,Colle1,Cpact,Clact,Dess1,Txte1,Imag1,Decale
LABEL R180NE,R180NO,R180SE,R180SO,Rot180,Rtotal
LABEL Form0,Form1,Impch,Impopt,Impass,Impr,Impq,Cachmenu,Ayde
DIM rmn$,a$,b$,i%,j%,k%,x%,y%,wf,hf,r,wp%,hp%,dtx%,gri%,axe%,p%,od%,sd%,im%,ecm%
DIM irfan$,kgf$,rtmp$,fpr$,fs$,wc%,pp%,re%,ge%,be%,f1$,f2$,fa$,wr%,hr%,wi%,hi%
DIM m0%,hid%
'                         =========================
' ======================== PARAMÈTRES À ACTUALISER =============================
'                         =========================
rmn$ = "C:\MENU\": ' répertoire général contenant toutes les données de travail
irfan$ = rmn$+"i_view32.exe": ' IrfanView
kgf$ = rmn$+"KGF.dll"
rtmp$ = rmn$+"FICHIERS\": ' répertoire de manoeuvre, fichiers résultats
fpr$ = rtmp$+"Fpr.bmp": ' fichier d'impression
fs$ = rtmp$+"Savpic.bmp": ' sauvegarde image actuelle (grille)
fa$ = rtmp$+"Pbas.bmp": ' pour impression
' ==============================================================================
IF SCREEN_Y > 1024
    hp% = SCREEN_Y-108: HEIGHT 0,hp%+69: wp% = hp%*210/297
    r = 7013/hp%: ' rapport de réduction imprimante/écran (inutilisé)
    a$ = "   -   TOTAL  A4 = 210 x 297 mm,  "+STR$(wp%)+" x "+STR$(hp%)+" pixels."
    pp% = 0: ' A4 pleine page
ELSE
    hp% = SCREEN_Y-108: HEIGHT 0,hp%+69: wp% = 2*hp%*210/297
    r = 4962/wp%
    a$ = "   -   DEMI  PAGE  A4 = 210 x 148.5 mm,  "+STR$(wp%)+" x "+STR$(hp%)+" pixels."
    pp% = 1: ' 1/2 page A4 haut (ou pp%=2 bas)
END_IF
WIDTH 0,wp%+41: BORDER_SMALL 0: COLOR 0,180,255,255
CAPTION 0,a$: ON_CLOSE 0,Fin

PICTURE 1: LEFT 1,24: WIDTH 1,wp%: HEIGHT 1,hp%: p% = 1: ' picture de travail
PICTURE 2: WIDTH 2,24: HEIGHT 2,hp%+10: ' règle V
PICTURE 3: TOP 3,HEIGHT(p%): LEFT 3,LEFT(p%): WIDTH 3,WIDTH(p%): HEIGHT 3,12: ' règle H

MAIN_MENU 10
SUB_MENU 20: PARENT 20,10: CAPTION 20,"Fichier"
  SUB_MENU 21: PARENT 21,20: CAPTION 21,"Nouveau": ON_CLICK 21,Nouveau
  SUB_MENU 22: PARENT 22,20: CAPTION 22,"Ouvrir": ON_CLICK 22,Ouvrir
  SUB_MENU 23: PARENT 23,20: CAPTION 23,"Enregistrer": ON_CLICK 23,Enreg
  SUB_MENU 24: PARENT 24,20: CAPTION 24,"Imprimer": ON_CLICK 24,Imprimer
  SUB_MENU 25: PARENT 25,20: CAPTION 25,"Quitter": ON_CLICK 25,Fin

SUB_MENU 30: PARENT 30,10: CAPTION 30,"Edit"
  SUB_MENU 31: PARENT 31,30: CAPTION 31,"Coller (clic l'emplacement)": ON_CLICK 31,Colle
  SUB_MENU 32: PARENT 32,30: CAPTION 32,"Copier toute la page": ON_CLICK 32,Cpact
  SUB_MENU 33: PARENT 33,30: CAPTION 33,"Coller toute la page": ON_CLICK 33,Clact

SUB_MENU 40: PARENT 40,10: CAPTION 40,"Outils"
  SUB_MENU 41: PARENT 41,40: CAPTION 41,"Dessin": ON_CLICK 41,Dess1
  SUB_MENU 42: PARENT 42,40: CAPTION 42,"Insertion de Texte": ON_CLICK 42,Txte1
  SUB_MENU 43: PARENT 43,40: CAPTION 43,"Insertion d'Image": ON_CLICK 43,Imag1
  SUB_MENU 44: PARENT 44,40: CAPTION 44,"Décalage global page": ON_CLICK 44,Decale
  SUB_MENU 45: PARENT 45,40: CAPTION 45,"Rotation 180° quart NE": ON_CLICK 45,R180NE
  SUB_MENU 46: PARENT 46,40: CAPTION 46,"Rotation 180° quart NO": ON_CLICK 46,R180NO
  SUB_MENU 47: PARENT 47,40: CAPTION 47,"Rotation 180° quart SE": ON_CLICK 47,R180SE
  SUB_MENU 48: PARENT 48,40: CAPTION 48,"Rotation 180° quart SO": ON_CLICK 48,R180SO
  SUB_MENU 49: PARENT 49,40: CAPTION 49,"Rotation totale 180°": ON_CLICK 49,Rtotal
  dtx% = 0
  IF pp%=0
      HIDE 49
  ELSE
      HIDE 45: HIDE 46: HIDE 47: HIDE 48
  END_IF
  
SUB_MENU 50: PARENT 50,10: CAPTION 50,"Grille/Axes/Échelles"
  SUB_MENU 51: PARENT 51,50: CAPTION 51,"Afficher la grille": ON_CLICK 51,Grille: gri%=0
  SUB_MENU 52: PARENT 52,50: CAPTION 52,"Afficher les axes": ON_CLICK 52,Axes: axe%=0
  SUB_MENU 53: PARENT 53,50: CAPTION 53,"Échelles en pixels": ON_CLICK 53,Echelles

SUB_MENU 60: PARENT 60,10: CAPTION 60,"Format"
  SUB_MENU 61: PARENT 61,60: CAPTION 61,"A4 pleine page": ON_CLICK 61,Form0
  SUB_MENU 62: PARENT 62,60: CAPTION 62,"A4 demi-page": ON_CLICK 62,Form1

SUB_MENU 70: PARENT 70,10: CAPTION 70,"?": ON_CLICK 70,Ayde

FORM 90: HIDE 90: WIDTH 90,550: HEIGHT 90,440: BORDER_SMALL 90: COLOR 90,190,255,255
CAPTION 90," -   IMPRESSION   -": FONT_BOLD 90: ON_CLOSE 90,Impq
CONTAINER_OPTION 91: PARENT 91,90: WIDTH 91,250: HEIGHT 91,50: COLOR 91,255,255,200
OPTION 92: PARENT 92,91: TOP 92,10: LEFT 92,15: WIDTH 92,160: CAPTION 92,"Imprimer la page actuelle"
OPTION 93: PARENT 93,91: TOP 93,28: LEFT 93,15: WIDTH 93,160: CAPTION 93,"Assembler deux 1/2 pages:"
MARK_ON 92: ON_CLICK 92,Impopt: ON_CLICK 93,Impopt
CONTAINER 110: PARENT 110,90: TOP 110,TOP(91)+HEIGHT(91)+5: LEFT 110,2: WIDTH 110,WIDTH(91)
               HEIGHT 110,160: COLOR 110,255,255,180
ALPHA 94: PARENT 94,110: TOP 94,5: LEFT 94,5: CAPTION 94,"Demi-page haut :"
EDIT 95: PARENT 95,110: TOP 95,TOP(94)+15: LEFT 95,3: WIDTH 95,WIDTH(110)-6
         ON_CLICK 95,Impch
ALPHA 96: PARENT 96,110: TOP 96,TOP(95)+22: LEFT 96,5: CAPTION 96,"Demi-page bas :"
EDIT 97: PARENT 97,110: TOP 97,TOP(96)+15: LEFT 97,3: WIDTH 97,WIDTH(110)-6
         ON_CLICK 97,Impch
CHECK 101: PARENT 101,110: TOP 101,TOP(97)+25: LEFT 101,15: WIDTH 101,200
           CAPTION 101,"Imprimer la ligne de séparation": MARK_ON 101
CHECK 102: PARENT 102,110: TOP 102,TOP(101)+25: LEFT 102,15: WIDTH 102,200
           CAPTION 102,"Retourner la 1/2 page bas"
BUTTON 103: PARENT 103,110: TOP 103,TOP(102)+25: LEFT 103,80: HEIGHT 103,20
            CAPTION 103,"Assembler": ON_CLICK 103,Impass
            
BUTTON 98: PARENT 98,90: TOP 98,TOP(110)+HEIGHT(110)+20: LEFT 98,LEFT(103)
           CAPTION 98,"Imprimer": ON_CLICK 98,Impr
BUTTON 99: PARENT 99,90: TOP 99,TOP(98)+140: LEFT 99,LEFT(98): CAPTION 99,"Quitter"
           ON_CLICK 99,Impq
PICTURE 100: PARENT 100,90: TOP 100,10: LEFT 100,LEFT(91)+WIDTH(91)+5: WIDTH 100,276
             HEIGHT 100,390: STRETCH_ON 100
ALPHA 108: PARENT 108,90: LEFT 108,15: TOP 108,TOP(98)+25: COLOR 108,255,255,128
a$ = "        L'imprimante doit être prête."+CHR$(13)+CHR$(10)
a$=a$+" L'impression démarre immédiatement "+CHR$(13)+CHR$(10)
a$=a$+"         sans dialogue imprimante.": CAPTION 108,a$
LIST 105: PARENT 105,90: TOP 105,TOP(100): LEFT 105,LEFT(100): HEIGHT 105,HEIGHT(100)
WIDTH 105,200: COLOR 105,255,255,190: HIDE 105: FONT_SIZE 105,10: ON_CLICK 105,Impch

FORM 120: HIDE 120: BORDER_SMALL 120: TOP 120,60: LEFT 120,150: HEIGHT 120,68
WIDTH 120,350: COLOR 120,255,0,0: ON_CLOSE 120,Enreg1
CAPTION 120,"   -   ENREGISTRER   SOUS :   -"
EDIT 121: PARENT 121,120: TOP 121,5: LEFT 121,5: WIDTH 121,WIDTH(120)-66
FONT_NAME 121,"Arial": FONT_SIZE 121,10: TEXT 121,rtmp$
BUTTON 122: PARENT 122,120: TOP 122,TOP(121): WIDTH 122,40: LEFT 122,WIDTH(120)-58
CAPTION 122,"OK": ON_CLICK 122,Enreg1

FORM 130: : HIDE 130: BORDER_SMALL 130: TOP 130,60: LEFT 130,150: HEIGHT 130,600
WIDTH 130,200: COLOR 130,0,255,0: ON_CLOSE 130,Ouvrir1
CAPTION 130,"   -   "+rtmp$+"   -"
LIST 131: PARENT 131,130:: TOP 131,5: LEFT 131,5: WIDTH 131,WIDTH(130)-26
HEIGHT 131,HEIGHT(130)-44: FONT_NAME 131,"Arial": FONT_SIZE 131,10
COLOR 131,255,255,190: ON_CLICK 131,Ouvrir1

od% = 140: OPEN_DIALOG od%
sd% = od%+1: SAVE_DIALOG sd%
im% = sd%+1: IMAGE im%
m0% = im%+1: MEMO m0%: HIDE m0%

ecm% = 0: GOSUB Echelles
' ==============================================================================
END: ' =========================================================================
' ==============================================================================
Fin:
TIMER_OFF_ALL
IF FILE_EXISTS(fpr$)=1 THEN FILE_DELETE fpr$
IF FILE_EXISTS(fs$)=1 THEN FILE_DELETE fs$
IF FILE_EXISTS(fa$)=1 THEN FILE_DELETE fa$
TERMINATE
' ==============================================================================
Echelles:
HEIGHT 2,hp%+10
TOP 3,HEIGHT(p%)
re% = 192: ge% = 192: be% = 192: ' couleur fonds d'échelles
re% = 255: ge% = 255: be% = 164
IF ecm% = 0: ' échelles en pixels -> centimètres
    2D_TARGET_IS 2: CLS: COLOR 2,re%,ge%,be%: PRINT_TARGET_IS 2
    2D_FILL_COLOR re%,ge%,be%
    FOR i% = 5 TO 295 STEP 5: ' Échelle verticale à gauche
        y%=i%*wp%/210
        IF BIN_AND(i%,1)=0
            2D_PEN_WIDTH 2: 2D_LINE 12,y%,30,y%
            PRINT_LOCATE -1,y%-7: PRINT RIGHT$(" "+STR$(i%/10),2)
        ELSE
            2D_PEN_WIDTH 1: 2D_LINE 14,y%,30,y%
        END_IF
    NEXT i%
    2D_TARGET_IS 3: CLS: COLOR 3,re%,ge%,be%: PRINT_TARGET_IS 3
    2D_FILL_COLOR re%,ge%,be%
    FOR i% = 0 TO 210 STEP 5: ' Échelle horizontale en bas
        x%=i%*wp%/210
        IF BIN_AND(i%,1)=0
            2D_PEN_WIDTH 2: 2D_LINE x%,0,x%,10
            PRINT_LOCATE x%-15,1: PRINT RIGHT$("  "+STR$(i%/10),2)
        ELSE
            2D_PEN_WIDTH 1: 2D_LINE x%,0,x%,5
        END_IF
    NEXT i%
    ecm% = 1: CAPTION 53,"Échelles en pixels"
ELSE: ' échelles en centimètres -> pixels
    2D_TARGET_IS 2: CLS: COLOR 2,re%,ge%,be%: PRINT_TARGET_IS 2
    2D_FILL_COLOR re%,ge%,be%
    FOR y% = 50 TO hp% STEP 50: ' Échelle verticale à gauche
        IF INT(y%/100) = y%/100
            2D_PEN_WIDTH 2: 2D_LINE 5,y%,30,y%
            PRINT_LOCATE -1,y%-14: PRINT RIGHT$("   "+STR$(y%),4)
        ELSE
            2D_PEN_WIDTH 1: 2D_LINE 14,y%,30,y%
        END_IF
    NEXT y%
    2D_TARGET_IS 3: COLOR 3,re%,ge%,be%: PRINT_TARGET_IS 3
    2D_FILL_COLOR re%,ge%,be%
    FOR x% = 0 TO wp% STEP 50: ' Échelle horizontale en bas
        IF INT(x%/100)=x%/100
            2D_PEN_WIDTH 2: 2D_LINE x%,0,x%,10
            PRINT_LOCATE x%-24,1: PRINT RIGHT$("   "+STR$(x%),4)
        ELSE
            2D_PEN_WIDTH 1: 2D_LINE x%,0,x%,7
        END_IF
    NEXT x%
    ecm% = 0: CAPTION 53,"Échelles en centimètres"
END_IF
RETURN
' ==============================================================================
Nouveau:
IF dtx%<>0 THEN RETURN
2D_TARGET_IS p%: CLS
RETURN
' ==============================================================================
Ouvrir:
IF dtx%<>0 THEN RETURN
EXECUTE_WAIT "CMD.exe /C DIR "+rtmp$+"*.bmp /B | clip"
CLEAR 131: CLEAR m0%: CLIPBOARD_PASTE m0%
IF COUNT(m0%)>0
    FOR i%=1 TO COUNT(m0%): ITEM_ADD 131,ITEM_READ$(m0%,i%): NEXT i%
END_IF
EXECUTE_WAIT "CMD.exe /C DIR "+rtmp$+"*.jpg /B | clip"
CLEAR m0%: CLIPBOARD_PASTE m0%
IF COUNT(m0%)>0
    FOR i%=1 TO COUNT(m0%): ITEM_ADD 131,ITEM_READ$(m0%,i%): NEXT i%
END_IF
SORT 131
SHOW 130
RETURN
' ---------------------------
Ouvrir1:
IF ITEM_INDEX(131)=0 THEN HIDE 130: RETURN
a$ = rtmp$+ITEM_INDEX$(131)
' a$ = FILE_NAME$(od%): IF LEN(a$)<4 THEN RETURN
b$ = UPPER$(RIGHT$(a$,4))
IF b$<>".BMP" AND b$<>".JPG"
    EXECUTE_WAIT irfan$ + " " + a$ + " /convert=" + fpr$
    a$ = fpr$
END_IF
ImgDim(a$)
IF wi% <> wp%
    EXECUTE_WAIT irfan$+" "+a$+" /resize=("+STR$(wp%)+",0) /aspectratio /convert="+fpr$
    a$ = fpr$
END_IF
HIDE 130
FILE_LOAD p%,a$
IF FILE_EXISTS(fpr$)=1 THEN FILE_DELETE fpr$
RETURN
' ==============================================================================
Enreg:
IF dtx%<>0 THEN RETURN
SHOW 120
RETURN
' -----------------------
Enreg1:
IF CLICKED(122)=0 THEN HIDE 120: RETURN: ' on_close
a$ = TEXT$(121)
' a$ = FILE_NAME$(sd%): IF LEN(a$)<4 THEN RETURN
b$ = UPPER$(RIGHT$(a$,4))
IF b$<>".BMP"
    FILE_SAVE p%,fpr$
    EXECUTE_WAIT irfan$ + " " + fpr$ + " /convert=" + a$
ELSE
    FILE_SAVE p%,a$
END_IF
HIDE 120
IF FILE_EXISTS(fpr$) = 1 THEN FILE_DELETE fpr$
RETURN
' ==============================================================================
Grille:
IF gri% = 0
    IF dtx%<>0 THEN RETURN
    FILE_SAVE p%,fs$
    Grille_Pict(p%,wp%/21): ' grille en cm
    ' Marges non imprimables:
    i% = 75/r: ' marges non imprimables (75 pixels)
    2D_LINE 0,i%,wp%,i%
    2D_LINE 0,hp%-i%,wp%,hp%-i%
    2D_LINE i%,0,i%,hp%
    2D_LINE wp%-i%,0,wp%-i%,hp%
    gri% = 1
    CAPTION 51,"Supprimer la grille"
ELSE
    FILE_LOAD p%,fs$: FILE_DELETE fs$: gri% = 0
    CAPTION 51,"Afficher la grille"
END_IF
RETURN
' ==============================================================================
Axes:
IF axe% = 0
    IF gri% = 1 THEN RETURN
    2D_TARGET_IS p%: 2D_PEN_COLOR 164,164,164: 2D_PEN_WIDTH 1: 2D_PEN_DOT
    2D_LINE wp%/2,0,wp%/2,hp%: IF pp%=0 THEN 2D_LINE 0,hp%/2,wp%,hp%/2
    axe%=1
    CAPTION 52,"Supprimer les axes"
ELSE
    2D_TARGET_IS p%: 2D_PEN_COLOR 255,255,255: 2D_PEN_WIDTH 1
    2D_LINE wp%/2,0,wp%/2,hp%: IF pp%=0 THEN 2D_LINE 0,hp%/2,wp%,hp%/2
    axe%=0
    CAPTION 52,"Afficher les axes"
END_IF
RETURN
' ==============================================================================
Imprimer:
IF dtx%<>0 THEN RETURN
HEIGHT 100,390: IF pp%>0 THEN HEIGHT 100,195
CLIPBOARD_COPY p%: CLIPBOARD_PASTE 100
FILE_SAVE p%,fpr$
MARK_ON 92: HIDE 110
SHOW 90
RETURN
' ==============================================================================
Impch:
i% = NUMBER_CLICK
IF i% = 105
    IF ITEM_INDEX(105) = 0 THEN HIDE 105: RETURN
    a$ = ITEM_INDEX$(105)
    TEXT j%,rtmp$+a$
    HIDE 105
ELSE
    EXECUTE_WAIT "CMD.exe /C DIR "+rtmp$+"*.bmp /B | clip"
    a$=CLIPBOARD_STRING_PASTE$: CLEAR 105: k%=INSTR(a$,CHR$(13)+CHR$(10))
    WHILE k%>0
      ITEM_ADD 105,LEFT$(a$,k%-1): a$=RIGHT_POS$(a$,k%+2): k%=INSTR(a$,CHR$(13)+CHR$(10))
    END_WHILE
    ITEM_ADD 105,a$
    SHOW 105
    j%=i%
END_IF
RETURN
' ==============================================================================
Impopt:
IF CHECKED(92) = 1: ' imprimer la page actuelle
    HIDE 110
ELSE: ' assembler les demi-pages pour impression
    SHOW 110
END_IF
RETURN
' ==============================================================================
Impass:
f1$ = TEXT$(95): f2$ = TEXT$(97)
IF f1$="" OR f2$="" THEN RETURN
IF FILE_EXISTS(f1$)=0 OR FILE_EXISTS(f2$)=0 THEN RETURN
ImgDim(f2$): ' -> wi%, hi%, dimensions de l'image du bas
IF CHECKED(102) = 1
    ' rotation 180° de la page du bas (les 2 moitiés séparément)
    a$ = " /crop=(0,0,"+STR$(wi%/2)+","+STR$(hi%)+")"
    a$=a$+" /rotate_l /rotate_l": ' 2 fois 90°
    EXECUTE_WAIT irfan$+" "+f2$+a$+" /convert="+fa$
    a$ = " /crop=("+STR$(wi%/2)+",0,"+STR$(wi%/2)+","+STR$(hi%)+")"
    a$=a$+" /rotate_l /rotate_l"
    EXECUTE_WAIT irfan$+" "+f2$+a$+" /convert="+fs$
    EXECUTE_WAIT irfan$+" /panorama=(1,"+fa$+","+fs$+") /convert="+fpr$
    FILE_DELETE fa$: FILE_DELETE fs$
    f2$ = fpr$
END_IF
EXECUTE_WAIT irfan$+" /panorama=(2,"+f1$+","+f2$+") /convert="+fpr$: ' assemblage
IF CHECKED(101) = 1
    ' Imprimer la ligne de séparation (pour massicotage éventuel)
    PICTURE 1000: LEFT 1000,-2000: WIDTH 1000,wi%: HEIGHT 1000,2*hi%
    FILE_LOAD 1000,fpr$
    2D_TARGET_IS 1000: 2D_PEN_DOT: 2D_PEN_COLOR 128,128,128: 2D_LINE 0,hi%,wi%,hi%
    FILE_SAVE 1000,fpr$
    2D_TARGET_IS p%: DELETE 1000
END_IF
HEIGHT 100,390
FILE_LOAD 100,fpr$: ' Aperçu avant impression
RETURN
' ==============================================================================
Impr:
IF CHECKED(92) = 1
    FILE_SAVE p%,fpr$
END_IF
IF FILE_EXISTS(fpr$) = 0 THEN RETURN
DLL_ON kgf$
Pr_Init(0): ' init, orientation portrait
Pr_Image(fpr$,0,0,Pr_lt%,Pr_ht%): ' totalité de la page
Pr_Impr()
DLL_OFF
' WAIT 500: FILE_DELETE fpr$: ' suppression du fichier d'impression
RETURN
' ==============================================================================
Impq:
HIDE 90
IF FILE_EXISTS(fpr$) = 1 THEN FILE_DELETE fpr$
RETURN
' ==============================================================================
Colle:
IF dtx%<>0 THEN RETURN
dtx% = 5: ON_CLICK p%,Colle1
RETURN
' ==============================================================================
Colle1:
IF dtx% = 5
    IF gri% = 1 THEN GOSUB Grille: ' suppression grille
    CLIPBOARD_PASTE im%
    x%=MOUSE_X_LEFT_DOWN(p%): y%=MOUSE_Y_LEFT_DOWN(p%)
    2D_TARGET_IS p%: 2D_IMAGE_PASTE im%,x%,y%
    dtx% = 0: OFF_CLICK p%
END_IF
RETURN
' ==============================================================================
Cpact:
IF dtx%<>0 THEN RETURN
CLIPBOARD_COPY p%
RETURN
' ==============================================================================
Clact:
IF dtx%<>0 THEN RETURN
CLIPBOARD_PASTE p%
RETURN
' ==============================================================================
Dess1:
IF dtx% <> 0 THEN RETURN
IF gri% = 1 THEN GOSUB Grille
hid% = 1: GOSUB Cachmenu
dtx% = 1: Dessin(wp%+35,140,p%,1): dtx% = 0
hid% = 0: GOSUB Cachmenu
RETURN
' ==============================================================================
Txte1:
IF dtx% <> 0 THEN RETURN
IF gri% = 1 THEN GOSUB Grille
hid% = 1: GOSUB Cachmenu
dtx% = 2: Texte(wp%+35,140,p%): dtx% = 0
hid% = 0: GOSUB Cachmenu
RETURN
' ==============================================================================
Imag1:
IF dtx% <> 0 THEN RETURN
IF gri% = 1 THEN GOSUB Grille
hid% = 1: GOSUB Cachmenu
dtx% = 3: Imagin(wp%+35,140,p%): dtx% = 0
hid% = 0: GOSUB Cachmenu
RETURN
' ==============================================================================
Decale:
IF dtx% <> 0 THEN RETURN
IF gri% = 1 THEN GOSUB Grille
hid% = 1: GOSUB Cachmenu
dtx% = 4: Picshift(wp%+35,140,p%): dtx% = 0
hid% = 0: GOSUB Cachmenu
RETURN
' ==============================================================================
R180NE:
x%=wp%/2: y%=0: wr%=wp%/2: hr%=hp%/2: GOTO Rot180
R180NO:
x%=0: y%=0: wr%=wp%/2: hr%=hp%/2: GOTO Rot180
R180SE:
x%=wp%/2: y%=hp%/2: wr%=wp%/2: hr%=hp%/2: GOTO Rot180
R180SO:
x%=0: y%=hp%/2: wr%=wp%/2: hr%=hp%/2: GOTO Rot180
Rot180:
' rotation de 180° par quarts de page
IF dtx%<>0 THEN RETURN
CLIPBOARD_COPY p%
a$ = "/crop=("+STR$(x%)+","+STR$(y%)+","+STR$(wr%)+","+STR$(hr%)+")"
a$ = a$+" /rotate_l /rotate_l": ' 2 fois 90°
EXECUTE_WAIT irfan$+" /clippaste "+a$+" /clipcopy /killmesoftly"
CLIPBOARD_PASTE im%
2D_TARGET_IS p%: 2D_IMAGE_PASTE im%,x%,y%
RETURN

Rtotal:
' ' rotation de la demi-page, moitié par moitié (quarts de page)
IF dtx%<>0 THEN RETURN
x%=0: y%=0: wr%=wp%/2: hr%=hp%: ' GOTO Rot180
CLIPBOARD_COPY p%: 2D_TARGET_IS p%
a$ = "/crop=("+STR$(x%)+","+STR$(y%)+","+STR$(wr%)+","+STR$(hr%)+")"
a$ = a$+" /rotate_l /rotate_l": ' 2 fois 90°
EXECUTE_WAIT irfan$+" /clippaste "+a$+" /clipcopy /killmesoftly"
CLIPBOARD_PASTE im%: 2D_IMAGE_PASTE im%,x%,y%: ' moitié gauche
x% = wp%/2
CLIPBOARD_COPY p%
a$ = "/crop=("+STR$(x%)+","+STR$(y%)+","+STR$(wr%)+","+STR$(hr%)+")"
a$ = a$+" /rotate_l /rotate_l": ' 2 fois 90°
EXECUTE_WAIT irfan$+" /clippaste "+a$+" /clipcopy /killmesoftly"
CLIPBOARD_PASTE im%: 2D_IMAGE_PASTE im%,x%,y%: ' moitié droite
RETURN

' ==============================================================================
Form0:
' A4 pleine page
IF pp% = 0 THEN RETURN
HEIGHT 0,SCREEN_Y-35: hp% = HEIGHT(0)-69: HEIGHT p%,hp%: wp% = hp%*210/297
WIDTH p%,wp%: WIDTH 0,wp%+41
r = 7013/hp%: ' rapport de réduction imprimante/écran (inutilisé)
a$ = "   -   TOTAL  A4 = 210 x 297 mm,  "+STR$(wp%)+" x "+STR$(hp%)+" pixels."
CAPTION 0,a$
2D_TARGET_IS p%: CLS
pp% = 0: WIDTH 3,WIDTH(p%): ecm% = 0: GOSUB Echelles: ' A4 pleine page
HIDE 49: SHOW 45: SHOW 46: SHOW 47: SHOW 48
RETURN
' ==============================================================================
Form1:
' A4 demi page supérieure ou inférieure
IF pp%=1 THEN RETURN
hp% = SCREEN_Y-108: wp% = hp%*420/297
WIDTH p%,wp%: HEIGHT p%,hp%: HEIGHT 0,hp%+69: WIDTH 0,wp%+41
r = 4962/wp%
a$ = "   -   DEMI  PAGE  A4 = 210 x 148.5 mm,  "+STR$(wp%)+" x "+STR$(hp%)+" pixels."
CAPTION 0,a$
2D_TARGET_IS p%: CLS
pp% = 1: WIDTH 3,WIDTH(p%): ecm% = 0: GOSUB Echelles
HIDE 45: HIDE 46: HIDE 47: HIDE 48: SHOW 49
RETURN
' ==============================================================================
Cachmenu:
IF hid% = 1: ' cacher le menu
    hide 20: hide 30: hide 40: hide 50: hide 60: hide 70
ELSE
    show 20: show 30: show 40: show 50: show 60: show 70
END_IF
RETURN
' ==============================================================================
Ayde:
IF dtx% <> 0 THEN RETURN
dtx% = 10: Aide(100,80,"Debaid"): dtx% = 0
RETURN
' ==============================================================================
' ==============================================================================
SUB Grille_Pict(obj%,wg%)
' Dessin d'une grille sur un picture obj%, de pas wg% pixels
DIM_LOCAL i%
2D_TARGET_IS obj%: 2D_PEN_COLOR 255,0,255: 2D_PEN_WIDTH 1: 2D_PEN_SOLID
FOR i% = wg% TO WIDTH(obj%)*4 STEP wg%
    2D_LINE i%,0,i%,HEIGHT(obj%)*4
NEXT i%
FOR i% = wg% TO HEIGHT(obj%)*4 STEP wg%
    2D_LINE 0,i%,WIDTH(obj%)*4,i%
NEXT i%
2D_PEN_DOT: 2D_PEN_COLOR 0,128,128: ' axes
2D_LINE WIDTH(obj%)/2,0,WIDTH(obj%)/2,HEIGHT(obj%)
2D_LINE 0,HEIGHT(obj%)/2,WIDTH(obj%),HEIGHT(obj%)/2
END_SUB
' ==============================================================================
SUB Dessin(xa%,ya%,p%,r)
' Boîte à outils affichée en xa%,ya% pour dessiner sur le picture p%
' r = facteur de correction des coordonnées
'     cas du stretch_on dans un picture: r = Largeur picture/Largeur réelle image
'     (r = 1 si picture = image)
IF r = 0 THEN r = 1: ' si paramètre absent
DIM_LOCAL f%,t%,i%,j%,k%,x%,y%,a$,tr%,tg%,tb%,n2t%,fig%,trac%,term%,ret%,an,pi,cpt
DIM_LOCAL co%,x1%,y1%,x2%,y2%,x3%,y3%,sx1%,fsv$,btg%,cap$,ad%,ps%,rm%
pi = 4*ATN(1)
fsv$ = rtmp$+"Savpre.bmp"
IF FILE_EXISTS(fsv$) = 1 THEN FILE_DELETE fsv$
IF LABEL("Desfin")=0 THEN LABEL Desfin
IF LABEL("Desopt")=0 THEN LABEL Desopt
IF LABEL("Desanu")=0 THEN LABEL Desanu
IF LABEL("Descou")=0 THEN LABEL Descou
IF LABEL("Destim")=0 THEN LABEL Destim
IF LABEL("Destra")=0 THEN LABEL Destra
IF LABEL("Deslib")=0 THEN LABEL Deslib
IF LABEL("Desrec")=0 THEN LABEL Desrec
IF LABEL("Desron")=0 THEN LABEL Desron
IF LABEL("Desell")=0 THEN LABEL Desell
IF LABEL("Deseto")=0 THEN LABEL Deseto
IF LABEL("Despol")=0 THEN LABEL Despol
IF LABEL("Desrem")=0 THEN LABEL Desrem
IF LABEL("Desshi")=0 THEN LABEL Desshi
DATA "Pal16": ' palette 16 couleurs
DATA "000000","000080","0000FF","008000","008080","00FF00","00FFFF","800000"
DATA "800080","808000","808080","C0C0C0","FF0000","FF00FF","FFFF00","FFFFFF"
n2t% = NUMBER_2D_TARGET
ON_CLICK p%,Desrem
f% = 850: WHILE OBJECT_EXISTS(f%)=1: f%=f%+1: END_WHILE
FORM f%: TOP f%,ya%: LEFT f%,xa%: HEIGHT f%,390: WIDTH f%,132: BORDER_SMALL f%
         COLOR f%,180,255,255: FONT_BOLD f%: FONT_NAME f%,"Arial": ON_CLOSE f%,Desfin
         CAPTION f%,"- OUTILS  DESSIN -"
i%=f%+1: ALPHA i%: PARENT i%,f%: TOP i%,3: CAPTION i%,"Trait:"
i%=f%+2: PICTURE i%: PARENT i%,f%: TOP i%,0: LEFT i%,32: WIDTH i%,35: HEIGHT i%,23
         COLOR i%,0,0,0
i%=f%+3: PICTURE i%: PARENT i%,f%: TOP i%,3: LEFT i%,35: WIDTH i%,WIDTH(i%-1)-5
         HEIGHT i%,18: COLOR i%,255,0,0
i%=f%+4: SPIN i%: PARENT i%,f%: LEFT i%,75: WIDTH i%,40: font_size i%,9
         MIN i%,1: MAX i%,20: POSITION i%,1
i%=f%+5: PICTURE i%: PARENT i%,f%: TOP i%,25: LEFT i%,0: WIDTH i%,WIDTH(f%)-17
         HEIGHT i%,63: 2D_TARGET_IS i%: ON_CLICK i%,Descou
         RESTORE: READ a$: WHILE a$<>"Pal16": READ a$: END_WHILE
         FOR j% = 1 TO 4
             FOR i% = 1 TO 4
                 READ a$
                 tr%=HEX(LEFT$(a$,2)): tg%=HEX(MID$(a$,3,2)): tb%=HEX(RIGHT$(a$,2))
                 2D_FILL_COLOR tr%,tg%,tb%
                 2D_RECTANGLE x%,y%,x%+28,y%+15: x%=x%+29
             NEXT i%
             y%=y%+16: x% = 0
         NEXT j%
         tr% = 0: tg% = 0: tb% = 0: COLOR f%+3,tr%,tg%,tb%
co%=f%+6: CONTAINER_OPTION co%: PARENT co%,f%: TOP co%,TOP(co%-1)+65
         WIDTH co%,WIDTH(f%)-18: LEFT co%,0: HEIGHT co%,185: COLOR co%,255,255,180
i%=co%+1:OPTION i%: PARENT i%,co%: TOP i%,10: LEFT i%,4: CAPTION i%,"Trait"
i%=i%+1:OPTION i%: PARENT i%,co%: TOP i%,25: LEFT i%,4: CAPTION i%,"Libre"
i%=i%+1:OPTION i%: PARENT i%,co%: TOP i%,40: LEFT i%,4: CAPTION i%,"Rectangle vide"
i%=i%+1:OPTION i%: PARENT i%,co%: TOP i%,55: LEFT i%,4: CAPTION i%,"Rectangle plein"
i%=i%+1:OPTION i%: PARENT i%,co%: TOP i%,70: LEFT i%,4: CAPTION i%,"Cercle vide"
i%=i%+1:OPTION i%: PARENT i%,co%: TOP i%,85: LEFT i%,4: CAPTION i%,"Cercle plein"
i%=i%+1:OPTION i%: PARENT i%,co%: TOP i%,100: LEFT i%,4: CAPTION i%,"Ellipse vide"
i%=i%+1:OPTION i%: PARENT i%,co%: TOP i%,115: LEFT i%,4: CAPTION i%,"Ellipse pleine"
i%=i%+1:OPTION i%: PARENT i%,co%: TOP i%,130: LEFT i%,4: CAPTION i%,"Étoile"
i%=i%+1:OPTION i%: PARENT i%,co%: TOP i%,145: LEFT i%,4: CAPTION i%,"Polygone:"
i%=i%+1:OPTION i%: PARENT i%,co%: TOP i%,160: LEFT i%,4: CAPTION i%,"Remplir": rm%=i%
         MARK_ON co%+1
FOR j%=co%+1 TO rm%: ON_CLICK j%,Desopt: NEXT j%
i%=i%+1: SPIN i%: PARENT i%,f%: TOP i%,TOP(co%)+143: LEFT i%,LEFT(co%)+75: WIDTH i%,40: HEIGHT i%,20
         POSITION i%,5
i%=rm%+2: CONTAINER i%: PARENT i%,f%: TOP i%,TOP(co%)+HEIGHT(co%)
            LEFT i%,0: WIDTH i%,WIDTH(co%): HEIGHT i%,60: COLOR i%,255,255,180: ad%=i%
i%=i%+1: BUTTON i%: PARENT i%,ad%: TOP i%,8: LEFT i%,5: WIDTH i%,25: CAPTION i%,CHR$(231)
i%=i%+1: BUTTON i%: PARENT i%,ad%: TOP i%,TOP(i%-1): LEFT i%,30: WIDTH i%,25: CAPTION i%,CHR$(232)
i%=i%+1: BUTTON i%: PARENT i%,ad%: TOP i%,TOP(i%-1): LEFT i%,55: WIDTH i%,25: CAPTION i%,CHR$(233)
i%=i%+1: BUTTON i%: PARENT i%,ad%: TOP i%,TOP(i%-1): LEFT i%,80: WIDTH i%,25: CAPTION i%,CHR$(234)
         FOR j% = i%-3 TO i%: FONT_NAME j%,"Wingdings": NEXT j%
i%=i%+1: BUTTON i%: PARENT i%,ad%: TOP i%,TOP(i%-1)+25: LEFT i%,5: WIDTH i%,30: CAPTION i%,"Z +"
i%=i%+1: BUTTON i%: PARENT i%,ad%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+30: WIDTH i%,30: CAPTION i%,"Z -"
         FOR j% = ad%+1 TO ad%+6: ON_CLICK j%,Desshi: NEXT j%
i%=i%+1: SPIN i%: PARENT i%,ad%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+32: WIDTH i%,40
         POSITION i%,5
        
i%=ad%+8: BUTTON i%: PARENT i%,f%: WIDTH i%,60: HEIGHT i%,20: TOP i%,HEIGHT(f%)-55
          CAPTION i%,"Annuler": ON_CLICK i%,Desanu
i%=i%+1:BUTTON i%: PARENT i%,f%: WIDTH i%,55: HEIGHT i%,20: TOP i%,TOP(i%-1): LEFT i%,60
          CAPTION i%,"Quitter": ON_CLICK i%,Desfin
2D_TARGET_IS p%: 2D_PEN_DOT
t%=i%+1: TIMER t%: PARENT t%,f%: TIMER_INTERVAL t%,40: ON_TIMER t%,Destim
trac% = 0: term% = 0: btg% = 0
fig% = 1: ret% = 0: cap$ = CAPTION$(0)
CLIPBOARD_COPY p%
WHILE ret%=0: WAIT 100: END_WHILE: EXIT_SUB
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desopt:
fig% = 1: ' trait
IF CHECKED(co%+2) = 1
    fig% = 2: ' tracé libre
    FILE_SAVE p%,fsv$: ' sauvegarde préalable
ELSE
    IF CHECKED(co%+3) = 1 OR CHECKED(co%+4) = 1
        fig% = 3: ' rectangle vide ou plein
    ELSE
        IF CHECKED(co%+5) = 1 OR CHECKED(co%+6) = 1
            fig% = 4: ' cercle vide ou plein
        ELSE
            IF CHECKED(co%+7) = 1 OR CHECKED(co%+8) = 1
                fig% = 5: ' ellipse vide ou pleine
            ELSE
                IF CHECKED(co%+9) = 1
                    fig% = 6: ' étoile
                ELSE
                    IF CHECKED(co%+10) = 1
                        fig% = 7: ' polygone
                    ELSE
                        IF CHECKED(rm%) = 1
                            fig% = 10: ' remplissage
                        END_IF
                    END_IF
                END_IF
            END_IF
        END_IF
    END_IF
END_IF
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Destim:
IF CHECKED(rm%)=1 THEN RETURN: ' remplissage
cpt = cpt+1: IF cpt>1000 THEN cpt = 2
x% = MOUSE_X_POSITION(p%)/r: y% = MOUSE_Y_POSITION(p%)/r: ' position actuelle souris
a$ =  "X= "+STR$(x%)+" pixels  Y= "+STR$(y%)+" pixels"
CAPTION 0,a$
2D_PEN_COLOR tr%,tg%,tb%: 2D_PEN_WIDTH POSITION(f%+4)
IF MOUSE_LEFT_DOWN(p%) = 1: ' bouton gauche enfoncé
    x1% = x%: y1% = y%: ' origine
    trac% = 1
    IF fig% = 2 AND btg% = 0 THEN FILE_SAVE p%,fsv$: ' sauvegarde préalable
    btg% = 1
END_IF
IF MOUSE_LEFT_UP(p%) = 1: ' relâche, tracé final
    btg% = 0
    IF x1% = -1 THEN RETURN
    TIMER_OFF t%
    ' clipboard_paste p%:
    term% = 1: 2D_PEN_SOLID
    SELECT fig%
        CASE 1: GOSUB Destra
        CASE 2: GOSUB Deslib
        CASE 3: GOSUB Desrec
        CASE 4: GOSUB Desron
        CASE 5: GOSUB Desell
        CASE 6: GOSUB Deseto
        CASE 7: GOSUB Despol
        CASE 10: GOSUB Desrem
    END_SELECT
    CLIPBOARD_COPY p%: term% = 0
    trac% = 0: 2D_PEN_DOT: 2D_PEN_COLOR 0,0,255
    TIMER_ON t%
END_IF
IF trac% = 1
    ' tracé provisoire, en continu
    IF x1% = -1 THEN RETURN
    x2% = x%: y2% = y%: ' position actuelle
    IF x2%=x3% AND y2%=y3% THEN RETURN: ' position inchangée
    2D_PEN_DOT: 2D_PEN_COLOR 0,0,255: 2D_PEN_WIDTH 1
    SELECT fig%
        CASE 1: GOSUB Destra
        CASE 2: GOSUB Deslib
        CASE 3: GOSUB Desrec
        CASE 4: GOSUB Desron
        CASE 5: GOSUB Desell
        CASE 6: GOSUB Deseto
        CASE 7: GOSUB Despol
    END_SELECT
    x3% = x%: y3% = y%
END_IF
TO_FOREGROUND f%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Destra:
IF cpt = 1 THEN RETURN: ' init
CLIPBOARD_PASTE p%: IF term% = 1 THEN FILE_SAVE p%,fsv$: ' sauvegarde préalable
2D_LINE x1%,y1%,x2%,y2%
IF term% = 1 THEN sx1%=x1%: x1% = -1
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Deslib:
2D_PEN_SOLID: 2D_PEN_COLOR tr%,tg%,tb%: 2D_PEN_WIDTH POSITION(f%+4)
2D_LINE x1%,y1%,x2%,y2%: x1%=x2%: y1%=y2%
IF term% = 1 THEN sx1%=x1%: x1% = -1
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desrec:
CLIPBOARD_PASTE p%: IF term% = 1 THEN FILE_SAVE p%,fsv$: ' sauvegarde préalable
2D_LINE x1%,y1%,x2%,y1%:2D_POLY_TO x2%,y2%:2D_POLY_TO x1%,y2%:2D_POLY_TO x1%,y1%
IF term% = 1
    IF CHECKED(co%+4) = 1: ' rectangle plein
        2D_FILL_COLOR tr%,tg%,tb%: 2D_RECTANGLE x1%,y1%,x2%,y2%
    END_IF
    sx1%=x1%: x1% = -1
END_IF
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desron:
CLIPBOARD_PASTE p%: IF term% = 1 THEN FILE_SAVE p%,fsv$: ' sauvegarde préalable
k% = SQR((y2%-y1%)*(y2%-y1%) + (x2%-x1%)*(x2%-x1%)): ' rayon du cercle
2D_POLY_FROM x1%+k%,y1%
FOR an = 0 TO 8*ATN(1)+.1 STEP .1
    2D_POLY_TO x1%+k%*COS(an), y1%+k%*SIN(an)
NEXT an
IF term% = 1
    IF CHECKED(co%+6) = 1: ' cercle plein
        2D_FILL_COLOR tr%,tg%,tb%: 2D_CIRCLE x1%,y1%,k%
    END_IF
    sx1%=x1%: x1% = -1
END_IF
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desell:
CLIPBOARD_PASTE p%
IF term% = 1
    FILE_SAVE p%,fsv$: ' sauvegarde préalable
    IF CHECKED(co%+7) = 1: ' ellipse vide
        i%=(x2%-x1%)/2: j%=(y2%-y1%)/2: x%=x1%+i%: y%=y1%+j%
        2D_POLY_FROM x%+i%,y%
        FOR an = 0 TO 2*pi STEP pi/180
            2D_POLY_TO x%+i%*COS(an),y%+j%*SIN(an)
        NEXT an
    ELSE: ' ellipse pleine
        k% = HANDLE_CANVAS(p%)
        DLL_ON "gdi32.dll"
        i% = DLL_CALL5("Ellipse",k%,x1%,y1%,x2%,y2%)
        DLL_OFF
        2D_FLOOD (x1%+x2%)/2,(y1%+y2%)/2,tr%,tg%,tb%: ' coloriage de l'ellipse
    END_IF
    sx1%=x1%: x1%=-1
ELSE
    ' 2D_LINE x1%,y1%,x2%,y1%:2D_POLY_TO x2%,y2%:2D_POLY_TO x1%,y2%:2D_POLY_TO x1%,y1%
    i%=(x2%-x1%)/2: j%=(y2%-y1%)/2: x%=x1%+i%: y%=y1%+j%
    2D_POLY_FROM x%+i%,y%
    FOR an = 0 TO 2*pi STEP pi/180
        2D_POLY_TO x%+i%*COS(an),y%+j%*SIN(an)
    NEXT an
END_IF
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Deseto:
CLIPBOARD_PASTE p%
k% = SQR((y2%-y1%)*(y2%-y1%) + (x2%-x1%)*(x2%-x1%)): ' rayon du cercle enveloppe
IF term% = 1
    FILE_SAVE p%,fsv$: ' sauvegarde préalable
    2D_POLY_FROM x1%+k%,y1%
    FOR an = 0 TO 4*pi STEP 4*pi/5
        2D_POLY_TO x1%+k%*COS(an),y1%+k%*SIN(an)
    NEXT an
    sx1%=x1%: x1%=-1
ELSE
    2D_POLY_FROM x1%+k%,y1%
    FOR an = 0 TO 4*pi STEP 4*pi/5
        2D_POLY_TO x1%+k%*COS(an),y1%+k%*SIN(an)
    NEXT an
END_IF
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Despol:
CLIPBOARD_PASTE p%
k% = SQR((y2%-y1%)*(y2%-y1%) + (x2%-x1%)*(x2%-x1%)): ' rayon du cercle enveloppe
j% = POSITION(rm%+1): ' nombre de côtés
IF term% = 1
    FILE_SAVE p%,fsv$: ' sauvegarde préalable
    2D_POLY_FROM x1%+k%,y1%
    FOR an = 0 TO 2*pi+.1 STEP 2*pi/j%
        2D_POLY_TO x1%+k%*COS(an),y1%+k%*SIN(an)
    NEXT an
    sx1%=x1%: x1%=-1
ELSE
    2D_POLY_FROM x1%+k%,y1%
    FOR an = 0 TO 2*pi+.1 STEP 2*pi/j%
        2D_POLY_TO x1%+k%*COS(an),y1%+k%*SIN(an)
    NEXT an
END_IF
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desrem:
IF CHECKED(rm%)=0 THEN RETURN
FILE_SAVE p%,fsv$: ' sauvegarde préalable
x% = MOUSE_X_LEFT_DOWN(p%)/r: y% = MOUSE_Y_LEFT_DOWN(p%)/r
2D_FLOOD x%,y%,tr%,tg%,tb%
sx1%=x1%: x1% = -1
CLIPBOARD_COPY p%
RETURN
' ==============================================================================
Desshi:
' décalage de la dernière figure tracée
IF FILE_EXISTS(fsv$)=0 THEN RETURN
TIMER_OFF t%
ps% = POSITION(ad%+7): ' pas de déplacement
FILE_LOAD p%,fsv$: ' raz
CLIPBOARD_COPY p%: 2D_TARGET_IS p%: i% = NUMBER_CLICK
x1% = sx1%: term% = 1: 2D_PEN_SOLID
IF i% = ad%+1: ' gauche
    x1%=x1%-ps%: x2%=x2%-ps%
ELSE
    IF i%=ad%+2: ' droite
        x1%=x1%+ps%: x2%=x2%+ps%
    ELSE
        IF i%=ad%+3: ' haut
            y1%=y1%-ps%: y2%=y2%-ps%
        ELSE
            IF i%=ad%+4: ' bas
                y1%=y1%+ps%: y2%=y2%+ps%
            ELSE
                IF i%=ad%+5: ' zoom plus
                    x2%=x2%+ps%: y2%=y2%+ps%
                ELSE: ' zoom moins
                    x2%=x2%-ps%: y2%=y2%-ps%
                END_IF
            END_IF
        END_IF
    END_IF
END_IF
' FILE_LOAD p%,fsv$
SELECT fig%
    CASE 1: GOSUB Destra
    ' CASE 2: GOSUB Deslib
    CASE 3: GOSUB Desrec
    CASE 4: GOSUB Desron
    CASE 5: GOSUB Desell
    CASE 6: GOSUB Deseto
    CASE 7: GOSUB Despol
    ' CASE 10: GOSUB Desrem
END_SELECT
CLIPBOARD_COPY p%: term% = 0
trac% = 0: 2D_PEN_DOT: 2D_PEN_COLOR 0,0,255
TIMER_ON t%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desanu:
IF FILE_EXISTS(fsv$) = 1 THEN FILE_LOAD p%,fsv$: CLIPBOARD_COPY p%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Descou:
x%=MOUSE_X_LEFT_DOWN(f%+5): y%=MOUSE_Y_LEFT_DOWN(f%+5)
tr%=COLOR_PIXEL_RED(f%+5,x%,y%): tg%=COLOR_PIXEL_GREEN(f%+5,x%,y%)
tb%=COLOR_PIXEL_BLUE(f%+5,x%,y%): COLOR f%+3,tr%,tg%,tb%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Desfin:
ret% = 1
TIMER_OFF t%: DELETE t%: WAIT 100: OFF_CLICK p%: 2D_TARGET_IS n2t%
IF FILE_EXISTS(fsv$)=1 THEN FILE_DELETE fsv$
DELETE f%: CAPTION 0,cap$
ret% = 1
RETURN
END_SUB


Dernière édition par JL35 le Mer 31 Déc 2014 - 19:24, édité 2 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 5928
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Menus et Cartes   Mer 31 Déc 2014 - 19:20

2ème partie:
Code:
' ==============================================================================
SUB Texte(xa%,ya%,p%)
' boîte à outils affichée en xa%,ya% pour apposer du texte sur le picture p%
DIM_LOCAL f%,i%,j%,k%,x%,y%,tr%,tg%,tb%,a$,ret%,lp%,n2t%,n2p%,p1%,wt%,ht%,fst$,co%
DIM_LOCAL r%,g%,b%,mm%,lc%,ld%,sh%,ps%,sx%,sy%,pal%,ap%
fst$ = rtmp$+"Savpre.bmp"
IF FILE_EXISTS(fst$) = 1 THEN FILE_DELETE fst$
DATA "Pal16": ' palette 16 couleurs
DATA "000000","000080","0000FF","008000","008080","00FF00","00FFFF","800000"
DATA "800080","808000","808080","C0C0C0","FF0000","FF00FF","FFFF00","FFFFFF"
n2t% = NUMBER_2D_TARGET: n2p% = NUMBER_PRINT_TARGET
IF LABEL("Texfin")=0 THEN LABEL Texfin
IF LABEL("Texpol")=0 THEN LABEL Texpol
IF LABEL("Texpom")=0 THEN LABEL Texpom
IF LABEL("Texcou")=0 THEN LABEL Texcou
IF LABEL("Texenr")=0 THEN LABEL Texenr
IF LABEL("Texins")=0 THEN LABEL Texins
IF LABEL("Texanu")=0 THEN LABEL Texanu
IF LABEL("Texdim")=0 THEN LABEL Texdim
IF LABEL("Texshi")=0 THEN LABEL Texshi
IF LABEL("Texinss")=0 THEN LABEL Texinss
IF LABEL("Texcen")=0 THEN LABEL Texcen
f% = 950: WHILE OBJECT_EXISTS(f%)=1: f%=f%+1: END_WHILE
FORM f%: TOP f%,ya%: LEFT f%,xa%: HEIGHT f%,524: WIDTH f%,352: BORDER_SMALL f%
         COLOR f%,180,255,255: FONT_BOLD f%: FONT_NAME f%,"Arial": ON_CLOSE f%,Texfin
         CAPTION f%,"- OUTILS  TEXTE -"
i%=f%+1: EDIT i%: PARENT i%,f%: TOP i%,0: LEFT i%,0: WIDTH i%,130
         TEXT i%,"Arial": ON_CLICK i%,Texpol: ' Police
i%=f%+2: SPIN i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,WIDTH(i%-1)+2: WIDTH i%,45
         MIN i%,6: MAX i%,255: POSITION i%,12: ' Taille caractères
         ON_CHANGE f%+2,Texenr
i%=f%+3: PICTURE i%: PARENT i%,f%: TOP i%,1: LEFT i%,LEFT(f%+2)+47: WIDTH i%,25
         HEIGHT i%,20: COLOR i%,0,0,0: ' Témoin de couleur
i%=f%+4: CHECK i%: PARENT i%,f%: TOP i%,3: LEFT i%,LEFT(f%+3)+28: CAPTION i%,"G"
i%=f%+5: CHECK i%: PARENT i%,f%: TOP i%,3: WIDTH i%,25: LEFT i%,LEFT(f%+4)+25: CAPTION i%,"I"
i%=f%+6: CHECK i%: PARENT i%,f%: TOP i%,3: WIDTH i%,25: LEFT i%,LEFT(f%+5)+25: CAPTION i%,"S"
         FOR j%=f%+4 TO f%+6: ON_CLICK j%,Texenr: NEXT j%
i%=f%+7: CHECK i%: PARENT i%,f%: TOP i%,3: WIDTH i%,54: LEFT i%,LEFT(i%-1)+25: CAPTION i%,"Centré"
         ON_CLICK i%,Texcen
i%=i%+1: PICTURE i%: PARENT i%,f%: TOP i%,25: LEFT i%,0: WIDTH i%,WIDTH(f%)-17
         HEIGHT i%,16: 2D_TARGET_IS i%: ON_CLICK i%,Texcou: pal%=i%: ' palette de 16 couleurs
         RESTORE: READ a$: WHILE a$<>"Pal16": READ a$: END_WHILE
         FOR j% = 1 TO 16
             READ a$
             tr%=HEX(LEFT$(a$,2)): tg%=HEX(MID$(a$,3,2)): tb%=HEX(RIGHT$(a$,2))
             2D_FILL_COLOR tr%,tg%,tb%
             2D_RECTANGLE x%,y%,x%+20,y%+15: x%=x%+21
         NEXT j%
         tr% = 0: tg% = 0: tb% = 0: ' couleur de base (noir)
i%=i%+1: ALPHA i%: PARENT i%,f%: TOP i%,TOP(pal%)+30: LEFT i%,2: CAPTION i%,"Aperçu:"
i%=i%+1: EDIT i%: PARENT i%,f%: TOP i%,TOP(pal%)+20: LEFT i%,50: WIDTH i%,WIDTH(f%)-68
         HEIGHT i%,40: COLOR i%,255,255,190: ap%=i%
         FONT_SIZE i%,12: FONT_BOLD_OFF i%: TEXT i%,"ABC xyz 01234"
mm%=i%+1: MEMO mm%: PARENT mm%,f%: TOP mm%,TOP(ap%)+45: WIDTH mm%,WIDTH(f%)-16
          HEIGHT mm%,HEIGHT(f%)-205: FONT_BOLD_OFF mm%: ' memo de saisie du texte
          FONT_NAME mm%,"Arial": FONT_SIZE mm%,10
lp%=mm%+1: LIST lp%: PARENT lp%,f%: TOP lp%,TOP(f%+1)+20: WIDTH lp%,130: HEIGHT lp%,HEIGHT(f%)-130
           HIDE lp%: FONT_NAMES_LOAD lp%: COLOR lp%,255,255,190: ON_CLICK lp%,Texpom
           FOR j%=COUNT(lp%) TO 1 STEP -1: ' liste des polices
               IF LEFT$(ITEM_READ$(lp%,j%),1)="@" THEN ITEM_DELETE lp%,j%
           NEXT j%: ' Polices
p1%=lp%+1: PICTURE p1%: PARENT p1%,f%: LEFT p1%,-2000
i%=p1%+1: BUTTON i%: PARENT i%,f%: TOP i%,TOP(mm%)+HEIGHT(mm%): LEFT i%,20: WIDTH i%,100
          CAPTION i%,"Dimensions ->": ON_CLICK i%,Texdim
i%=i%+1: LIST i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+100: WIDTH i%,200: HEIGHT i%,25
         ld% = i%
co%=i%+1: CONTAINER_OPTION co%: PARENT co%,f%: TOP co%,TOP(i%)+25
           LEFT co%,50: WIDTH co%,220: HEIGHT co%,30: COLOR co%,255,255,190
i%=co%+1: OPTION i%: PARENT i%,co%: TOP i%,10: LEFT i%,10: CAPTION i%,"Fond blanc"
          WIDTH i%,150: MARK_ON i%
i%=i%+1:  OPTION i%: PARENT i%,co%: TOP i%,TOP(i%-1): LEFT i%,105
          CAPTION i%,"Fond transparent"

i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,HEIGHT(f%)-60: LEFT i%,10: WIDTH i%,25: CAPTION i%,CHR$(231): sh%=i%
i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,35: WIDTH i%,25: CAPTION i%,CHR$(232)
i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,60: WIDTH i%,25: CAPTION i%,CHR$(233)
i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,85: WIDTH i%,25: CAPTION i%,CHR$(234)
         FOR j% = i%-3 TO i%: FONT_NAME j%,"Wingdings": ON_CLICK j%,Texshi: NEXT j%
i%=i%+1: SPIN i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+30: WIDTH i%,40
         POSITION i%,5
i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,WIDTH(f%)/2
          CAPTION i%,"Annuler": ON_CLICK i%,Texanu
i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+80
          CAPTION i%,"Quitter": ON_CLICK i%,Texfin
ON_CLICK p%,Texins: ' clic sur le point d'insertion du texte (picture principal)
x% = -1: y% = -1
ret% = 0: WHILE ret% = 0: WAIT 100: END_WHILE
OFF_CLICK p%: 2D_TARGET_IS n2t%: PRINT_TARGET_IS n2p%
DELETE f%
IF FILE_EXISTS(fst$) = 1 THEN FILE_DELETE fst$
EXIT_SUB
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Texpol:
SHOW lp%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Texpom:
TEXT f%+1,ITEM_INDEX$(lp%)
HIDE lp%
FONT_NAME mm%,TEXT$(f%+1)
FONT_NAME ap%,TEXT$(f%+1)
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Texcou:
x%=MOUSE_X_LEFT_DOWN(pal%): y%=MOUSE_Y_LEFT_DOWN(pal%)
tr%=COLOR_PIXEL_RED(pal%,x%,y%): tg%=COLOR_PIXEL_GREEN(pal%,x%,y%)
tb%=COLOR_PIXEL_BLUE(pal%,x%,y%): COLOR f%+3,tr%,tg%,tb%
FONT_COLOR ap%,tr%,tg%,tb%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Texenr:
FONT_BOLD_OFF ap%: FONT_ITALIC_OFF ap%: FONT_UNDERLINE_OFF ap%
IF CHECKED(f%+4) = 1 THEN FONT_BOLD ap%
IF CHECKED(f%+5)=1 THEN FONT_ITALIC ap%
IF CHECKED(f%+6)=1 THEN FONT_UNDERLINE ap%
FONT_SIZE ap%,POSITION(f%+2)
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Texdim:
IF COUNT(mm%) = 0 THEN RETURN
FONT_NAME p1%,TEXT$(f%+1): FONT_SIZE p1%,POSITION(f%+2)
FONT_BOLD_OFF p1%: FONT_ITALIC_OFF p1%: FONT_UNDERLINE_OFF p1%: ' init
IF CHECKED(f%+4) = 1 THEN FONT_BOLD p1%
IF CHECKED(f%+5) = 1 THEN FONT_ITALIC p1%
IF CHECKED(f%+6) = 1 THEN FONT_UNDERLINE p1%
i% = 0
FOR j% = 1 TO COUNT(mm%)
    k% = TEXT_WIDTH(ITEM_READ$(mm%,j%),p1%): IF k%>i% THEN i%=k%
NEXT j%
j% = COUNT(mm%)*TEXT_HEIGHT("Abcxyz",p1%): ' hauteur totale
a$ = STR$(i%)+" x "+STR$(j%)+" pixels = "
wi%=210*i%/wp%: hi%=210*j%/wp%
a$ = a$+STR$(wi%/10)+" x "+STR$(hi%/10)+" cm."
CLEAR ld%: ITEM_ADD ld%,a$
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Texcen:
IF COUNT(mm%)=0 THEN RETURN
IF CHECKED(f%+7) = 1
    GOSUB Texdim: ' -> i% = largeur maxi, j% = hauteur
    FOR j% = 1 TO COUNT(mm%)
        a$ = TRIM$(ITEM_READ$(mm%,j%))
        k%=TEXT_WIDTH(a$,p1%)
        WHILE k%<i%: a$=" "+a$+" ": k%=TEXT_WIDTH(a$,p1%): END_WHILE
        ITEM_DELETE mm%,j%: ITEM_INSERT mm%,j%,RTRIM$(a$)
    NEXT j%
ELSE: ' décentrage (alignement à gauche)
    FOR i% = 1 TO COUNT(mm%)
        a$ = TRIM$(ITEM_READ$(mm%,i%))
        ITEM_DELETE mm%,i%: ITEM_INSERT mm%,i%,a$
    NEXT i%
END_IF
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Texins:
' Insertion du texte au clic souris
IF COUNT(mm%) = 0 THEN RETURN: ' pas de texte
sx% = MOUSE_X_POSITION(p%): sy% = MOUSE_Y_POSITION(p%)
FILE_SAVE p%,fst$: ' sauvegarde préalable
Texinss:
x% = sx%: y% = sy%
IF CHECKED(co%+1) = 1: ' impression directe (fond blanc opaque)
    FONT_NAME p%,TEXT$(f%+1): FONT_SIZE p%,POSITION(f%+2)
    FONT_BOLD_OFF p%: FONT_ITALIC_OFF p%: FONT_UNDERLINE_OFF p%: ' init
    IF CHECKED(f%+4) = 1 THEN FONT_BOLD p%
    IF CHECKED(f%+5) = 1 THEN FONT_ITALIC p%
    IF CHECKED(f%+6) = 1 THEN FONT_UNDERLINE p%
    PRINT_TARGET_IS p%: FONT_COLOR p%,tr%,tg%,tb%
    2D_TARGET_IS p%: 2D_FILL_COLOR 255,255,255
    ht%=TEXT_HEIGHT("ABCxyz",p%)
    FOR k% = 1 TO COUNT(mm%)
        a$ = ITEM_READ$(mm%,k%)
        IF a$ <> "" THEN PRINT_LOCATE x%,y%: PRINT a$
        y% = y% + ht%
    NEXT k%
ELSE: ' texte fond transparent (pixel par pixel)
    FONT_NAME p1%,TEXT$(f%+1): FONT_SIZE p1%,POSITION(f%+2)
    FONT_BOLD_OFF p1%: FONT_ITALIC_OFF p1%: FONT_UNDERLINE_OFF p1%: ' init
    IF CHECKED(f%+4) = 1 THEN FONT_BOLD p1%
    IF CHECKED(f%+5) = 1 THEN FONT_ITALIC p1%
    IF CHECKED(f%+6) = 1 THEN FONT_UNDERLINE p1%
    PRINT_TARGET_IS p1%: FONT_COLOR p1%,tr%,tg%,tb%
    FOR k% = 1 TO COUNT(mm%)
        a$ = ITEM_READ$(mm%,k%)
        IF a$ <> ""
            wt%=TEXT_WIDTH(a$,p1%): ht%=TEXT_HEIGHT(a$,p1%)
            WIDTH p1%,wt%: HEIGHT p1%,ht%
            2D_TARGET_IS p1%: 2D_FILL_COLOR 254,254,254: PRINT_LOCATE 0,0: PRINT a$
            2D_TARGET_IS p%
            FOR j% = 0 TO ht%-1
                FOR i% = 0 TO wt%-1
                    r% = COLOR_PIXEL_RED(p1%,i%,j%)
                    IF r% <> 254
                        g% = COLOR_PIXEL_GREEN(p1%,i%,j%)
                        b% = COLOR_PIXEL_BLUE(p1%,i%,j%)
                        2D_PEN_COLOR r%,g%,b%: 2D_POINT x%+i%,y%+j%
                    END_IF
                NEXT i%
                DISPLAY
            NEXT j%
        END_IF
        y% = y% + ht%
    NEXT k%
END_IF
TO_FOREGROUND f%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Texshi:
IF x%=-1 OR y%=-1 OR COUNT(mm%)=0 THEN RETURN
ps% = POSITION(sh%+4): ' pas du déplacement
CLIPBOARD_COPY p%
2D_TARGET_IS p%
i% = NUMBER_CLICK
IF i%=sh%: ' décalage vers la gauche
    sx% = sx%-ps%
ELSE
    IF i%=sh%+1: ' décalage vers la droite
        sx%=sx%+ps%
    ELSE
        IF i%=sh%+2: ' décalage vers le haut
            sy%=sy%-ps%
        ELSE: ' décalage vers le bas
            sy%=sy%+ps%
        END_IF
    END_IF
END_IF
FILE_LOAD p%,fst$
GOSUB Texinss
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Texanu:
IF FILE_EXISTS(fst$) = 1 THEN FILE_LOAD p%,fst$: CLIPBOARD_COPY p%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Texfin:
ret% = 1
RETURN
END_SUB
' ==============================================================================
SUB Imagin(xa%,ya%,p%)
' boîte à outils, affichée en xa%,ya%, pour apposer une image sur le picture p%
DIM_LOCAL f%,i%,j%,k%,x%,y%,tr%,tg%,tb%,a$,ret%,lp%,n2t%,p1%,wt%,ht%,fsi$,opn%,img%
DIM_LOCAL fcl$,wi%,hi%,fi$,sh%,ps%,sx%,sy%,adi%,pic%,rc$
fi$ = rtmp$+"Ifxwz.txt"
fsi$ = rtmp$+"Savpre.bmp"
fcl$ = rtmp$+"Savcol.bmp"
IF FILE_EXISTS(fsi$) = 1 THEN FILE_DELETE fsi$
rc$ = CHR$(13)+CHR$(10)
n2t% = NUMBER_2D_TARGET: 2D_TARGET_IS p%
IF LABEL("Imgfin")=0 THEN LABEL Imgfin
IF LABEL("Imgchx")=0 THEN LABEL Imgchx
IF LABEL("Imgins")=0 THEN LABEL Imgins
IF LABEL("Imganu")=0 THEN LABEL Imganu
IF LABEL("Imgchw")=0 THEN LABEL Imgchw
IF LABEL("Imgshi")=0 THEN LABEL Imgshi
IF LABEL("Imginss")=0 THEN LABEL Imginss
IF LABEL("Imgcol")=0 THEN LABEL Imgcol
f% = 750: WHILE OBJECT_EXISTS(f%)=1: f%=f%+1: END_WHILE
FORM f%: TOP f%,ya%: LEFT f%,xa%: HEIGHT f%,180: WIDTH f%,352: BORDER_SMALL f%
         COLOR f%,180,255,255: FONT_BOLD f%: FONT_NAME f%,"Arial": ON_CLOSE f%,Imgfin
         CAPTION f%,"- OUTILS  IMAGE -"
i%=f%+1: ALPHA i%: PARENT i%,f%: TOP i%,3: CAPTION i%,"Image:"
i%=f%+2: EDIT i%: PARENT i%,f%: TOP i%,0: LEFT i%,40: WIDTH i%,250: ON_CLICK i%,Imgchx: ' Image
         TEXT i%," (parcourir)": FONT_BOLD_OFF i%: FONT_ITALIC i%
i%=f%+3: BUTTON i%: PARENT i%,f%: TOP i%,0: WIDTH i%,40: LEFT i%,LEFT(i%-1)+WIDTH(i%-1)+5
         CAPTION i%,"Coller": ON_CLICK i%,Imgcol
i%=i%+1: PICTURE i%: PARENT i%,f%: TOP i%,TOP(i%-1)+25: LEFT i%,5: WIDTH i%,120: HEIGHT i%,90
         STRETCH_ON i%: pic%=i%
i%=i%+1: ALPHA i%: PARENT i%,f%: TOP i%,28: LEFT i%,140: CAPTION i%,"Dimensions:"
i%=i%+1: ALPHA i%: PARENT i%,f%: TOP i%,28: LEFT i%,LEFT(i%-1)+80: WIDTH i%,100
         COLOR i%,255,255,0: adi%=i%
        
i%=adi%+1: ALPHA i%: PARENT i%,f%: TOP i%,65: LEFT i%,140
           CAPTION i%,"Redim.: W=                  H="
i%=adi%+2: SPIN i%: PARENT i%,f%: TOP i%,TOP(i%-1)-3: LEFT i%,LEFT(i%-1)+60: WIDTH i%,50
i%=adi%+3: SPIN i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+70: WIDTH i%,50
           ON_CHANGE adi%+2,Imgchw
i%=adi%+4: ALPHA i%: PARENT i%,f%: TOP i%,TOP(i%-1)+25: LEFT i%,LEFT(adi%+2): COLOR i%,255,255,0

i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,HEIGHT(f%)-60: LEFT i%,10: WIDTH i%,25
         CAPTION i%,CHR$(231): sh%=i%
i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,35: WIDTH i%,25: CAPTION i%,CHR$(232)
i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,60: WIDTH i%,25: CAPTION i%,CHR$(233)
i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,85: WIDTH i%,25: CAPTION i%,CHR$(234)
         FOR j% = i%-3 TO i%: FONT_NAME j%,"Wingdings": ON_CLICK j%,Imgshi: NEXT j%
i%=i%+1: SPIN i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+30: WIDTH i%,40
         POSITION i%,5

i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,HEIGHT(f%)-60: LEFT i%,WIDTH(f%)/2
          CAPTION i%,"Annuler": ON_CLICK i%,Imganu
i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,LEFT(i%-1)+80
          CAPTION i%,"Quitter": ON_CLICK i%,Imgfin
i%=i%+1: OPEN_DIALOG i%: opn% = i%
i%=i%+1: IMAGE i%: img% = i%
ON_CLICK p%,Imgins: ' clic sur le point d'insertion de l'image (picture principal)
x%=-1: y%=-1
ret% = 0: WHILE ret% = 0: WAIT 100: END_WHILE
OFF_CLICK p%: 2D_TARGET_IS n2t%
DELETE f%: IF OBJECT_EXISTS(opn%)=1 THEN DELETE opn%
IF OBJECT_EXISTS(img%)=1 THEN DELETE img%
IF FILE_EXISTS(fsi$) = 1 THEN FILE_DELETE fsi$
IF FILE_EXISTS(fcl$) = 1 THEN FILE_DELETE fcl$
EXIT_SUB
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Imgchx:
a$ = FILE_NAME$(opn%): IF LEN(a$)<4 THEN RETURN
TEXT f%+2,a$: FONT_ITALIC_OFF f%+2: FONT_BOLD f%+2
EXECUTE_WAIT irfan$ + " " + a$ + " /info=" + fi$ + " /fullinfo"
FILE_OPEN_READ 9, fi$
WHILE FILE_EOF(9) = 0: FILE_READLN 9, a$
    IF LEFT$(a$,16) = "Image dimensions"
        a$=MID$(a$,20,50): wi%=VAL(LEFT$(a$,INSTR(a$," ")-1))
        a$=MID$(a$,INSTR(a$," ")+3,50): hi%=VAL(LEFT$(a$,INSTR(a$," ")-1))
        EXIT_WHILE
    END_IF
END_WHILE
FILE_CLOSE 9: FILE_DELETE fi$
i% = 10*wi%*21/wp%: j% = 10*hi%*21/wp%: ' en cm
a$ = " "+STR$(wi%)+" x "+ STR$(hi%)+" pixels "
a$=a$+rc$+"= "+STR$(i%/10)+" x "+STR$(j%/10)+" cm"
CAPTION adi%,a$
POSITION adi%+2,wi%: POSITION adi%+3,hi%
IF wi%>hi%
    WIDTH pic%,120: HEIGHT pic%,120*hi%/wi%
ELSE
    HEIGHT pic%,90: WIDTH pic%,90*wi%/hi%
END_IF
FILE_LOAD pic%,TEXT$(f%+2): ' vignette
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Imgins:
IF TEXT$(f%+2) = "" OR LEFT$(TEXT$(f%+2),1)=" " THEN TO_FOREGROUND f%: RETURN: ' pas d'image
sx% = MOUSE_X_POSITION(p%): sy% = MOUSE_Y_POSITION(p%)
FILE_SAVE p%,fsi$: ' sauvegarde préalable
' insertion de l'image au clic souris (coin supérieur gauche)
Imginss:
x% = sx%: y% = sy%
a$ = TEXT$(f%+2)
i% = POSITION(adi%+2)
IF i% <> wi%: ' redimensionnement demandé
    EXECUTE_WAIT irfan$+" "+a$+" /resize=("+STR$(i%)+",0) /aspectratio /clipcopy /killmesoftly"
ELSE
    EXECUTE_WAIT irfan$+" "+a$+" /clipcopy /killmesoftly": ' image telle quelle -> clip
END_IF
CLIPBOARD_PASTE img%
2D_IMAGE_PASTE img%,x%,y%
TO_FOREGROUND f%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Imgchw:
POSITION adi%+3,POSITION(adi%+2)*hi%/wi%: ' largeur proportionnelle à la hauteur
i% = 10*POSITION(adi%+2)*21/wp%: j% = 10*POSITION(adi%+3)*21/wp%
CAPTION adi%+4,"= "+STR$(i%/10)+" x "+STR$(j%/10)+" cm."
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Imgcol:
EXECUTE_WAIT irfan$ + " /clippaste /convert="+fcl$
EXECUTE_WAIT irfan$ + " "+fcl$+" /info=" + fi$ + " /fullinfo"
FILE_OPEN_READ 9, fi$
WHILE FILE_EOF(9) = 0: FILE_READLN 9, a$
    IF LEFT$(a$,16) = "Image dimensions"
        a$=MID$(a$,20,50): wi%=VAL(LEFT$(a$,INSTR(a$," ")-1))
        a$=MID$(a$,INSTR(a$," ")+3,50): hi%=VAL(LEFT$(a$,INSTR(a$," ")-1))
        EXIT_WHILE
    END_IF
END_WHILE
FILE_CLOSE 9: FILE_DELETE fi$
TEXT f%+2,fcl$
CAPTION adi%," "+STR$(wi%)+" x "+ STR$(hi%)+" "
POSITION adi%+2,wi%: POSITION adi%+3,hi%
IF wi%>hi%
    WIDTH pic%,120: HEIGHT pic%,120*hi%/wi%
ELSE
    HEIGHT pic%,90: WIDTH pic%,90*wi%/hi%
END_IF
FILE_LOAD pic%,TEXT$(f%+2): ' vignette
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Imgshi:
IF x%=-1 OR y%=-1 THEN RETURN
ps% = POSITION(sh%+4): ' pas du déplacement
CLIPBOARD_COPY p%
2D_TARGET_IS p%
i% = NUMBER_CLICK
IF i%=sh%: ' décalage vers la gauche
    sx% = sx%-ps%
ELSE
    IF i%=sh%+1: ' décalage vers la droite
        sx%=sx%+ps%
    ELSE
        IF i%=sh%+2: ' décalage vers le haut
            sy%=sy%-ps%
        ELSE: ' décalage vers le bas
            sy%=sy%+ps%
        END_IF
    END_IF
END_IF
FILE_LOAD p%,fsi$
GOSUB Imginss
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Imganu:
IF FILE_EXISTS(fsi$) = 1 THEN FILE_LOAD p%,fsi$: CLIPBOARD_COPY p%
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Imgfin:
ret% = 1
RETURN
END_SUB
' ==============================================================================
SUB Picshift(xa%,ya%,p%)
' Décalage global vertical ou horizontal du contenu du picture p% d'une valeur
' choisie (Attention: les parties débordantes sont perdues)
DIM_LOCAL n2t%,f%,i%,j%,ret%,ps%,bg%,im%
IF LABEL("Pshift")=0 THEN LABEL Pshift
IF LABEL("Pshifta")=0 THEN LABEL Pshifta
IF LABEL("Pshiftq")=0 THEN LABEL Pshiftq
n2t% = NUMBER_2D_TARGET: 2D_TARGET_IS p%
f% = 1050: WHILE OBJECT_EXISTS(f%)=1: f% = f%+1: END_WHILE
FORM f%: TOP f%,ya%: LEFT f%,xa%: WIDTH f%,300: HEIGHT f%,110: BORDER_SMALL f%
         FONT_BOLD f%: COLOR f%,200,255,255: ON_CLOSE f%,Pshiftq
         CAPTION f%,"DÉCALAGE GLOBAL DE LA PAGE-CIBLE"
i%=f%+1: ALPHA i%: PARENT i%,f%: TOP i%,3: LEFT i%,50
         CAPTION i%,"Décalage de:             pixels"
i%=f%+2: SPIN i%: PARENT i%,f%: TOP i%,0: LEFT i%,LEFT(i%-1)+80: WIDTH i%,40
         POSITION i%,5
i%=i%+1: ALPHA i%: PARENT i%,f%: TOP i%,25: LEFT i%,30: CAPTION i%," Attention, ce qui déborde est perdu ! "
         COLOR i%,255,255,0
i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,45: LEFT i%,10: WIDTH i%,25: CAPTION i%,CHR$(231): bg%=i%
i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,35: WIDTH i%,25: CAPTION i%,CHR$(232)
i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,60: WIDTH i%,25: CAPTION i%,CHR$(233)
i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,85: WIDTH i%,25: CAPTION i%,CHR$(234)
         FOR j% = i%-3 TO i%: FONT_NAME j%,"Wingdings": ON_CLICK j%,Pshift: NEXT j%
i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,120: CAPTION i%,"Annuler"
         ON_CLICK i%,Pshifta
i%=i%+1: BUTTON i%: PARENT i%,f%: TOP i%,TOP(i%-1): LEFT i%,200: CAPTION i%,"Quitter"
         ON_CLICK i%,Pshiftq
IMAGE 1060: im% = 1060
ret% = 0: WHILE ret% = 0: WAIT 100: END_WHILE
2D_TARGET_IS n2t%
DELETE f%: IF OBJECT_EXISTS(im%)=1 THEN DELETE im%
EXIT_SUB
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Pshift:
i% = NUMBER_CLICK
ps% = POSITION(f%+2): ' pas du déplacement, en pixels
CLIPBOARD_COPY p%
2D_TARGET_IS p%
IF i%=bg%: ' décalage vers la gauche
    2D_IMAGE_COPY im%,ps%,0,WIDTH(p%),HEIGHT(p%)
    CLS: 2D_IMAGE_PASTE im%,0,0
ELSE
    IF i%=bg%+1: ' décalage vers la droite
        2D_IMAGE_COPY im%,0,0,WIDTH(p%)-ps%,HEIGHT(p%)
        CLS: 2D_IMAGE_PASTE im%,ps%,0
    ELSE
        IF i%=bg%+2: ' décalage vers le haut
            2D_IMAGE_COPY im%,0,ps%,WIDTH(p%),HEIGHT(p%)
            CLS: 2D_IMAGE_PASTE im%,0,0
        ELSE: ' décalage vers le bas
            2D_IMAGE_COPY im%,0,0,WIDTH(p%),HEIGHT(p%)-ps%
            CLS: 2D_IMAGE_PASTE im%,0,ps%
        END_IF
    END_IF
END_IF
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Pshifta:
CLIPBOARD_PASTE p%: ' annul dernier déplacement
RETURN
' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
Pshiftq:
ret% = 1
RETURN
END_SUB
' ==============================================================================
SUB Pr_init(orient%)
' Initialisation imprimante ('début d'impression')
' orient% = 0 Portrait, = 1 Paysage
' Dans les paramètres des fonctions, le positionnement initial doit être fait en
' valeurs absolues: distances par rapport aux bords gauche et haut de la feuille
' A4, sans tenir compte des marges non imprimables.
' Les couleurs sont à exprimer au format BGR (en non pas RGB): B*256*256+G*256+R
IF VARIABLE("phnd%") = 0 THEN DIM phnd%
IF VARIABLE("chnd%") = 0 THEN DIM chnd%
IF VARIABLE("inip%") = 0 THEN DIM inip%
IF VARIABLE("Pr_res%") = 0 THEN DIM Pr_res%
IF VARIABLE("Pr_mmpix") = 0 THEN DIM Pr_mmpix: ' pixels par mm
IF VARIABLE("Pr_lt%") = 0 THEN DIM Pr_lt%: ' largeur totale, en pixels
IF VARIABLE("Pr_ht%") = 0 THEN DIM Pr_ht%: ' hauteur totale, enpixels
IF VARIABLE("Pr_mg%") = 0 THEN DIM Pr_mg%: ' marge gauche
IF VARIABLE("Pr_mh%") = 0 THEN DIM Pr_mh%: ' marge haut
IF VARIABLE("Pr_lu%") = 0 THEN DIM Pr_lu%: ' largeur utile
IF VARIABLE("Pr_hu%") = 0 THEN DIM Pr_hu%: ' hauteur utile
' Orientation portrait (0) ou paysage (1)
Pr_res% = DLL_CALL4("PrinterManager",4,ADR(phnd%),ADR(chnd%),orient%): ' orientation
Pr_res% = DLL_CALL4("PrinterManager",1,ADR(phnd%),ADR(chnd%),0): ' init
Pr_lt% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),3,0,0)
Pr_ht% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),4,0,0)
Pr_mmpix = Pr_hu%/297: ' pixels par mm, à l'impression en 600 dpi
' Marges non imprimables: décalage en pixels à soustraire gauche et haut:
Pr_mg% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),1,0,0): ' marge gauche
Pr_mh% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),2,0,0): ' marge haut
' Dimensions utiles, largeur et hauteur, sans les marges, en pixels:
' ==========
' ATTENTION: Les dimensions sont actualisées en fonction de l'option orientation !
' ==========
Pr_lu% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),7,0,0): ' largeur utile
Pr_hu% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),8,0,0): ' hauteur utile
' Couleur trait noir, épaisseur = 1, arrière-plan transparent:
inip% = -2
Pr_res% = DLL_CALL6("PrinterFunction",6,ADR(phnd%),ADR(chnd%),0,inip%,1)
inip% = 1
END_SUB
' ==============================================================================
SUB Pr_Image(f$,x%,y%,w%,h%,u%)
' Impression de l'image f$ en x%,y%, dimensions w% x h% (sera redimensionnée pour
' tenir dans le cadre donné).
' u% = 0: unités pixels, u% = 1, unités millimètres
' ******** NB: coordonnées d'impression (pixels): de 75,75 à 4811,6862 ********
IF inip% = 0 THEN EXIT_SUB: ' imprimante non initialisée (Sub Pr_Init)
IF u% = 1: ' unités en mm, conversion en pixels
    x% = x%*Pr_mmpix: y% = y%*Pr_mmpix: w% = w%*Pr_mmpix: h% = h%*Pr_mmpix
END_IF
x% = x%-Pr_mg%: y% = y%-Pr_mh%
Pr_res% = DLL_call6("PrinterFunction",4,ADR(phnd%),ADR(chnd%),0,x%,y%): ' positionnement
Pr_res% = DLL_call6("PrinterFunction",7,ADR(phnd%),ADR(chnd%),ADR(f$),w%,h%)
END_SUB
' ==============================================================================
SUB Pr_Impr()
' Lancement de l'impression réelle ('fin d'impression')
IF inip% = 0 THEN EXIT_SUB: ' imprimante non initialisée (Sub Pr_Init)
Pr_res% = DLL_CALL4("PrinterManager",3,ADR(phnd%),ADR(chnd%),0)
inip% = 0
END_SUB
' ==============================================================================
SUB ImgDim(f$)
' Dimensions de l'image f$ -> wi%,hi%
DIM_LOCAL a$, fi$
fi$ = rtmp$+"Infos.txt"
EXECUTE_WAIT irfan$ + " "+f$+" /info=" + fi$ + " /fullinfo"
FILE_OPEN_READ 9, fi$
WHILE FILE_EOF(9) = 0: FILE_READLN 9, a$
    IF LEFT$(a$,16) = "Image dimensions"
        a$=MID$(a$,20,50): wi%=VAL(LEFT$(a$,INSTR(a$," ")-1))
        a$=MID$(a$,INSTR(a$," ")+3,50): hi%=VAL(LEFT$(a$,INSTR(a$," ")-1))
        EXIT_WHILE
    END_IF
END_WHILE
FILE_CLOSE 9: FILE_DELETE fi$
END_SUB
' ==============================================================================
DATA "Debaid"
DATA "  MODE  D'EMPLOI"
DATA "1_ Menu 'Fichier'","2_ Menu 'Edit'","3_ Menu 'Outils'"
DATA "4_ Menu Outils: Dessin","5_ Menu Outils: Textes","6_ Menu Outils: Images"
DATA "7_ Menu Outils: Décalage"
DATA "8_ Menu Outils: Rotations","9_ Menu 'Grilles'","10_ Menu 'Format'","F"

DATA "1_ ","","- Nouveau:    création d'une nouvelle feuille",""
DATA "- Ouvrir:       Choix et affichage d'un fichier existant dans le"
DATA "                     le répertoire de travail",""
DATA "- Enregistrer: enregistrement du dessin actuel (choisir un format"
DATA "                     image, de préférence BMP) dans le répertoire"
DATA "                     de travail.",""
DATA "- Imprimer:    imprimer la page actuelle, ou imprimer deux demi-"
DATA "                     pages préalablement enregistrées."
DATA "                     L'imprimante doit être allumée et connectée"
DATA "                    (pas de dialogue imprimante).",""
DATA "- Quitter:     fermer le programme.",""
DATA " ATTENTION: dans les cas 'Nouveau', 'Ouvrir' et 'Quitter', si le"
DATA " ----------------  dessin actuel éventuel n'a pas été enregistré au"
DATA "                       préalable, il sera définitivement perdu."
DATA "",""
DATA "--------------------------------------------------------------------------------"
DATA "  Il est fortement conseillé d'enregistrer périodiquement la page"
DATA "  en cours de création, ou après chaque insertion importante, pour"
DATA "  éviter de perdre la totalité de son travail en cas de plantage."
DATA "--------------------------------------------------------------------------------"
DATA "F"

DATA "2_ ",""
DATA "- 'Coller': coller le contenu du presse-papier (doit être une image)"
DATA "   à l'emplacement cliqué."
DATA "   L'image gardera ses dimensions d'origine.",""
DATA "- 'Copier toute la page': copier la totalité de la page dans le presse-papier",""
DATA "- 'Coller toute la page': coller le presse-papier (contenant une image)"
DATA "   dans la totalité de la page"
DATA "   ATTENTION: dans ce cas, la page prendra les dimensions de","  l'image.","F"

DATA "3_ "," ","Le menu Outils permet d'insérer dans la page trois types d'objets:"
DATA "- des dessins: lignes ou figures géométriques diverses"
DATA "- des textes"
DATA "- des images: fichiers ou presse-papier",""
DATA "Il sera possible immédiatement après insertion d'un objet de:"
DATA "- déplacer cet objet pour le positionner avec précision"
DATA "- dans le cas de figures dessinées, de redimensionner cet objet.",""
DATA "          NB: on ne peut appeler qu'un seul outil à la fois.","F"

DATA "4_ ","","Dessin: dessiner des figures élémentaires dans la page, après"
DATA "avoir choisi l'épaisseur et la couleur du tracé:"
DATA "- Tracé libre"
DATA "- Trait rectiligne"
DATA "- Rectangle vide ou plein"
DATA "- Cercle vide ou plein"
DATA "- Ellipse vide ou pleine"
DATA "- Étoile"
DATA "- Polygone (en précisant le nombre de côtés).",","
DATA "1) Choisir la figure désirée dans la liste"
DATA "2) Cliquer dans la feuille l'emplacement désisré"
DATA "3) Sans relâcher, déplacer la souris vers la dimension voulue"
DATA "4) Relâcher la souris.",""
DATA "Il est possible ensuite soit d'annuler l'opération ('Annuler'),"
DATA "soit de déplacer ou redimensionner l'objet, en fixant l'ampleur"
DATA "des déplacements (nombre de pixels).",""
DATA "Fermer la fenêtre à la fin des opérations de dessin ('Quitter').","F"

DATA "5_ ","","Insertion Texte: préparer le texte dans la fenêtre affichée, choisir"
DATA "- sa police de caractères: cliquer dans la case, puis sur une police"
DATA "- sa taille de caractères"
DATA "- sa couleur: cliquer dans une des cases de couleurs"
DATA "- ses enrichissements éventuels (G=Gras, I=Italique, S=Souligné)"
DATA "- son mode d'insertion: fond transparent ou non."
DATA "Puis cliquer l'emplacement de l'insertion sur le dessin."
DATA "NB: l'option 'fond transparent' est un peu plus longue à s'effectuer.",""
DATA "L'option 'Centrer' permet de centrer toutes les lignes par rapport"
DATA "à l'ensemble du texte à insérer.",""
DATA "La fenêtre 'Aperçu' donne une image de texte type en fonction des"
DATA "paramètres choisis (police, taille, couleur, enrichissements)."
DATA "Le bouton 'Dimensions' donne les dimensions finales du texte en"
DATA "pixels dans la feuille en fonction des paramètres.",""
DATA "Cliquer la feuille à l'emplacement désiré du coin haut gauche"
DATA "pour insérer le texte dans la feuille",""
DATA "Il est possible ensuite soit d'annuler l'opération (bouton 'Annuler'),"
DATA "soit de déplacer le texte finement à l'aide des flèches.",""
DATA "Bouton 'Quitter' pour valider et fermer la fenêtre d'insertion.","F"

DATA "6_ ","","Insertion Image: choisir une image (parcourir) ou une image du"
DATA "presse-papier 'Coller'). Ses dimensions en pixels sont affichées, ainsi"
DATA "qu'une imagette la représentant."
DATA "On peut la redimensionner pour l'adapter à ses besoins (fixer la"
DATA "valeur W : largeur, en pixels)."
DATA "Pour l'insérer, cliquer dans la feuille l'emplacement de son insertion.",""
DATA "Comme pour les dessins ou textes, il est possible de la repositionner"
DATA "finement à l'aide des boutons flèches.",""
DATA "On peut ensuite, soit annuler l'opération (bouton 'Annuler'), soit"
DATA "insérer une autre image, ou 'Quitter'.","F"

DATA "7_ ","","Décalage global de la page affichée:",""
DATA "L'appui sur un des boutons flèches provoque un décalage de la"
DATA "totalité du contenu de la page dans le sens de la flèche.",""
DATA "On peut fixer la quantité de déplacement, en pixels."
DATA "Ceci peut être utilisé entre autres pour centrer le contenu dans la page.",""
DATA "Attention: si au cours du déplacement une partie du dessin déborde"
DATA "de la feuille, ce qui a débordé est définitivement perdu.","F"

DATA "8_ ","","Rotations de 180 degrés:"
DATA "Mise à l'envers de la partie sélectionnée (pour le cas de cartes,"
DATA "menus etc. à replier en 2 ou 4).",""
DATA "1) Rotation par quart de page (cas de la feuille A4 plein format):"
DATA "NE= haut/droite, NO= haut/gauche, SE= bas/droite, S0= bas/gauche",""
DATA "2) Rotation totale de la page affichée (Format demi A4)"
DATA "- la rotation se fait séparément pour la moitié droite et la moitié"
DATA "   gauche."
DATA "NB: il est recommandé, et plus simple, de ne faire cette rotation,"
DATA "   si nécessaire, qu'au moment de l'impression, où elle sera proposée.",""
DATA "Pour annuler, il suffit de refaire une rotation de 180°.","F"

DATA "9_ ","Menu 'Grilles/Axes/Échelles':",""
DATA "- Grille: affichage ou effacement d'une grille quadrillée en"
DATA "   centimètres, des axes H et V, et des limites de la zone imprimable.",""
DATA "- Axes: tracé ou effacement des deux axes horizontal et vertical.",""
DATA "- Échelles: basculement de l'affichage des échelles gauche et bas en"
DATA "   pixels ou en centimètres.","F"

DATA "10_","Choix du format d'affichage à l'écran :",""
DATA "- Format A4 pleine page, toute la page A4 affichée à l'écran, pour les"
DATA "  écrans suffisamment grands (affichage grandeur nature)."
DATA "  Si l'écran est trop petit, l'image sera agrandie à l'impression"
DATA "  où elle perdra en définition.",""
DATA "- Format demi-page, supérieure ou inférieure, recommandé. Chaque"
DATA "  demi-page sera enregistrée sous un nom spécifique, les deux demi-"
DATA "  pages étant assemblées au moment de l'impression.",""
DATA "Il sera possible au moment de l'impression d'assembler deux demi-"
DATA "pages supérieures ou deux demi-pages inférieures identiques"
DATA "(cas des menus ou cartes avec encart sur feuilles séparées).","F"
' ------------------------------------------------------------------------------
SUB Aide(x%,y%,a$)
' Affichage d'une aide à l'écran, en x%,y%
' Les données sont sous forme de Datas dans le programme principal, le paramètre
' a$ donnant le libellé de la ligne à rechercher. Les Datas sont dans l'ordre:
' - le nom repère (paramètre a$) qui pointe le début des datas
' - le 'Caption' (titre) de la fenêtre d'aide
' - les noms des différents chapitres, numérotés de "1_ " à "n_ "
'      exemple: DATA "1_ Premier chapitre","2_ Deuxième chapitre",etc., la série
'      se terminant par "F"
' - les chapitres successifs, avec leur numéro correspondant
'      exemple: DATA "1_ ","Premier chapitre","Texte du chapitre...","...","..."
'      chaque chapitre se terminant par "F".
'      NB: en-tête rubrique 3 caract., par ex "1_ ", "8_ ", mais "10_" (sans espace)
DIM_LOCAL ar$, aru$, rubx%, fid%, ata%: ata% = 0
IF LABEL("Sortaid") = 0 THEN LABEL Sortaid
IF LABEL("A_Rub") = 0 THEN LABEL A_Rub
fid% = 1100: WHILE OBJECT_EXISTS(fid%) = 1: fid% = fid%+1000: END_WHILE
FORM fid%: TOP fid%,y%: LEFT fid%,x%: HEIGHT fid%,680: WIDTH fid%,600
      BORDER_SMALL fid%: COLOR fid%,190,255,255: FONT_NAME fid%, "Comic Sans MS"
      ON_CLOSE fid%,Sortaid
LIST fid%+1: PARENT fid%+1,fid%: WIDTH fid%+1,150: HEIGHT fid%+1,HEIGHT(fid%)-35
      COLOR fid%+1,255,255,128: ON_CLICK fid%+1,A_Rub: ' liste des rubriques, à gauche
MEMO fid%+2: PARENT fid%+2,fid%: TOP fid%+2,20: LEFT fid%+2,WIDTH(fid%+1)
      WIDTH fid%+2,WIDTH(fid%)-WIDTH(fid%+1)-16: HEIGHT fid%+2,HEIGHT(fid%+1)-42
      COLOR fid%+2,205,255,205: FONT_SIZE fid%+2,10: ' rubriques successives, à droite
ALPHA fid%+3: PARENT fid%+3,fid%: LEFT fid%+3,LEFT(fid%+2)+40: ' titre
      FONT_SIZE fid%+3,12
BUTTON fid%+4: PARENT fid%+4,fid%: TOP fid%+4,HEIGHT(fid%)-59: LEFT fid%+4,330
      CAPTION fid%+4,"OK": ON_CLICK fid%+4,Sortaid: ' sortie de l'aide
RESTORE: READ ar$: WHILE ar$<>a$: READ ar$: END_WHILE
         READ ar$: CAPTION fid%,ar$
         READ ar$: WHILE ar$<>"F": ITEM_ADD fid%+1,ar$: READ ar$: END_WHILE
rubx% = 0: GOSUB A_Rub: ' affichage préalable de la 1ère rubrique
WHILE ata% = 0: WAIT 150: END_WHILE: DELETE fid%: EXIT_SUB
' ------------------------------------------------------------------------------
Sortaid:
    ata% = 1: ' feu vert pour sortir
RETURN
' ------------------------------------------------------------------------------
A_Rub:
    ' affichage d'une rubrique
    rubx% = ITEM_INDEX(fid%+1): IF rubx% = 0 THEN rubx% = 1: ' initial
    aru$ = ITEM_READ$(fid%+1,rubx%)
    CAPTION fid%+3, aru$
    aru$ = LEFT$(aru$,3)
    RESTORE: READ ar$: WHILE ar$<>aru$: READ ar$: END_WHILE
    CLEAR fid%+2
    READ ar$: WHILE ar$<>"F": ITEM_ADD fid%+2,ar$: READ ar$: END_WHILE
RETURN
END_SUB
' ==============================================================================

J'ai édité ci-dessus, le forum avait encore bouffé des antislash...
Je précise que pour IrfanView on peut très bien utiliser une version normale sous Program Files, il suffit de changer le chemin au début du programme.

et... BONNE ANNÉE À TOUS
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 7975
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: Re   Jeu 1 Jan 2015 - 6:12

Ton programme n' est pas passé inaperçu !!!...
Je l' ai vu...
lol!

Je testerai un peu plus tard mais l' idée est très intéressante.
(Jicehel avait raison... Very Happy )
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
mindstorm

avatar

Nombre de messages : 530
Age : 48
Localisation : charente
Date d'inscription : 13/02/2013

MessageSujet: Re: Menus et Cartes   Jeu 1 Jan 2015 - 13:32

+ 1
mais là je vais manger
et oui encore pale
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5849
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Menus et Cartes   Jeu 1 Jan 2015 - 20:53

Ca se confirme JL35... J'espère que tu auras encore plein de bonnes idées en 2015.
Bonne année à tous qu'elle vous apporte santé, bonheur, bonne humeur, bonnes iées et pleins de super programmes.
Merci JL35 pour ce nouvel utilitaire
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 5928
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Menus et Cartes   Jeu 1 Jan 2015 - 22:29

Merci à vous et bonne année également !
Ça arrive sans doute un peu tard pour les fêtes, je me suis servi de ce programme pour faire mes menus de Noël (rien d'original, c'est fait rapido), ça rend pas mal, c'est facile à utiliser, avec dans mon cas impression sur du papier Avery 200g préplié pour cartes/faire-part.
Je conseille quand même de faire une sauvegarde de temps en temps, pour ne pas perdre tout le boulot en cas de plantage imprévu. J'en ai éliminé pas mal, mais l'expérience montre qu'il reste toujours des cas auxquels on n'a pas pensé (le plus délicat a été le timer dans la sub Dessin qui m'a causé quelques soucis).
Image de la feuille imprimée, à replier (1 et 4: couverture, 2 et 3 pages intérieures):
                  ->                  
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Menus et Cartes   

Revenir en haut Aller en bas
 
Menus et Cartes
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Boucle de menus débile
» [Résolu] Pilotes cartes mémoires
» Garmin Edge 605 - conseils pour cartes...
» Nouveau GPS et question déverrouillage cartes
» Garmin zumo 550 - Où sont les cartes sur le Mac ?

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC 32 bits :: Vos sources, vos utilitaires à partager-
Sauter vers: