Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Faire défiler une image | |
| | Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Faire défiler une image Mar 27 Fév 2018 - 17:44 | |
| Je n'ai pas trouvé de moyen simple (mais j'ai peut-être raté quelque chose) de faire défiler une image dans un Picture qui ne la contient pas entièrement, genre BAR_... pour les MEMOs. J'ai fait une maquette de ce qu'on peut faire pour ça, avec des boutons de défilement dans les 4 directions et un Spin du nombre de pixels de déplacement. Ce n'est qu'une maquette, à adapter. Le principe: copier l'image entière dans un IMAGE, et ne recopier dans le picture que la partie définie en x,y variables: - Code:
-
LABEL Clic DIM f$,fm$,wi%,hi%,wp%,hp%,i%,x%,y%,pas% f$ = "C:\GRAPH\JPG\img_2022.jpg": ' une image quelconque (ici 2592 x 1944) fm$ = "C:\TEMP\Image.bmp": ' fichier provisoire de travail DimJpgBmp(f$): ' -> dimensions de l'image dans wi%,hi%
WIDTH 0,660: HEIGHT 0,550: COLOR 0,180,255,255 BUTTON 1: WIDTH 1,30: CAPTION 1,CHR$(225) BUTTON 2: LEFT 2,35: WIDTH 2,30: CAPTION 2,CHR$(226) BUTTON 3: LEFT 3,LEFT(2)+35: WIDTH 3,30: CAPTION 3,CHR$(227) BUTTON 4: LEFT 4,LEFT(3)+35: WIDTH 4,30: CAPTION 4,CHR$(228) SPIN 5: LEFT 5,LEFT(4)+35: WIDTH 5,50: POSITION 5,100 FOR i% = 1 TO 4: FONT_NAME i%,"Wingdings 3": FONT_SIZE i%,12: ON_CLICK i%,Clic: NEXT i% wp% = 640: hp% = 480 PICTURE 10: TOP 10,25: WIDTH 10,wp%: HEIGHT 10,hp% IF UPPER$(FILE_EXTRACT_EXTENSION$(f$)) <> ".BMP" FILE_LOAD 10,f$: FILE_SAVE 10,fm$: f$ = fm$: ' conversion image jpg en bmp END_IF x% = 0: y% = 0 END ' ============================================ Clic: i% = NUMBER_CLICK: pas% = POSITION(5) SELECT i% CASE 1: x% = x%-pas% CASE 2: x% = x%+pas% CASE 3: y% = y%-pas% CASE 4: y% = y%+pas% END_SELECT IF x% < 0 THEN x% = 0 IF x% > wi%-wp% THEN x% = wi%-wp% IF y% < 0 THEN y% = 0 IF y% > hi%-hp% THEN y% = hi%-hp% Affwin(10,f$,x%,y%) RETURN ' =========================================== SUB Affwin(p%,f$,x%,y%) ' Affichage dans le picture p% de la portion d'image f$ en x%,y% DIM_LOCAL wp%,hp%,im% wp% = WIDTH(p%): hp% = HEIGHT(p%) im% = 900: IMAGE im% FILE_LOAD im%,f$: 2D_TARGET_IS p%: 2D_IMAGE_PASTE im%,0-x%,0-y% DELETE im% END_SUB ' =========================================== SUB DimJpgBmp(f$) ' Image JPG ou BMP exclusivement, dimensions dans wi% et hi% DIM_LOCAL fm$: fm$ = "C:\TEMP\Provy.bmp" PICTURE 1099: HIDE 1099: FILE_LOAD 1099,f$: FILE_SAVE 1099,fm$: DELETE 1099 FILEBIN_OPEN_READ 1,fm$ FILEBIN_POSITION 1,18: wi% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_POSITION 1,22: hi% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_CLOSE 1 FILE_DELETE fm$ END_SUB ' ========================================== | |
| | | Pedro
Nombre de messages : 1596 Date d'inscription : 19/01/2014
| Sujet: Faire défiler une image. Mar 27 Fév 2018 - 18:21 | |
| Bonjour. Personnellement, j'utilise un objet WB, comme suit: - Code:
-
res%=dll_call1("WBCreate",handle(0)) res%=dll_call4("WBLocate",0,0,largeur_ecran/2,height_client(0)) file_open_write 99,"geo.htm" file_writeln 99,"<html><img src='images\espagne.jpg'></html>" file_close 99
url$="file://"+dir_current$+"/geo.htm" res%=dll_call1("WBUrl",adr(url$)) Ce code est extrait de mon logiciel de soutien en langues. Il doit bien sûr être adapté. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Faire défiler une image Mar 27 Fév 2018 - 18:32 | |
| Je peux te proposer ceci: - Code:
-
dim res%, f$, w%, h%
dll_on "KGF.dll"
open_dialog 1 : filter 1,"Images (BMP,JPG)|*.bmp;*.jpg" form 2 : top 2,20 : left 2,20 res% = DLL_call3("SetFormParent",handle(2),handle(0),1) picture 3 : parent 3,2 : full_space 3 f$ = file_name$(1) if f$=" " then terminate res% = dll_call1("LoadAnyImageFile",adr(f$)) w% = dll_call0("GetClipboardPictureWidth") h% = dll_call0("GetClipboardPictureHeight") width 3,w% height 3,w% clipboard_paste 3 end
J'utilise KGF.dll pour charger en fait n'importe quel format d'image (ici, limité à BMP et JPG dans la commande FILTER), et pour récupérer les dimensions de l'image chargée dans le presse-papier par la fonction LoadAnyImageFile. Mais si tu récupères les dimensions de l'image autrement, tu peux de passer de KGF.dll pour cela, et utiliser FILE_LOAD, après avoir imposé les bonnes dimensions de l'image. Par contre, Panoramic n'a pas d'équivalent pour la fonction SetFormParent. En effet, la commande PARENT ne peut pas attacher une form à une autre (on se demande pourquoi, d'ailleurs, puisque Windows le fait très bien...). Cette fonction est écrite comme ceci: - Code:
-
function SetFormParent(child,parent: HWND; flag: integer): integer; stdcall; export; // KGF64 var hnd: HWND; dwStyle : LongWord; begin try hnd := SetParent(child,parent);
if flag=1 then begin dwStyle := GetWindowLong( child, GWL_STYLE ); //GetWindowStyle( h_Wnd ); dwStyle := dwStyle and not (WS_SIZEBOX or WS_CAPTION); SetWindowLong( child, GWL_STYLE, dwStyle ); end; finally end; result := hnd; end; exports SetFormParent; Elle utilise 2 APIs de Windows: SetParent - dans User32.dll SetWindowLong - dans User32.dll Donc, si tu ne veux pas utiliser KGF.dll, tu peux utiliser aussi bien User32.dll. L'idée générale, c'est d'avoir une form hébergeant un picture. La form s'adapte automatiquement aux dimensions du picture, avec des ascenseurs. Sinon, il y a un autre composant (non disponible en Panoramic à ce jour): la ScrollBox. C'est comme un objet Panel, sauf qu'elle gère automatiquement les ascenseurs, comme une form. Si la solution ci-dessus ne convient pas, je pourrais faire la ScrollBox dans KGF.dll. Mais dans ce cas, tout attachement d'objet à la ScrollBox devrait se faire par une fonction DLL. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Faire défiler une image Mar 27 Fév 2018 - 18:34 | |
| On s'est croisé avec Pédro. C'est égament une très bonne solution avec le WebBrowser. Maintenant, tu as le choix... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Faire défiler une image Mar 27 Fév 2018 - 19:43 | |
| Ce qui me rassure (?), c'est qu'il n'y a apparemment pas de solution native en panoramic que j'aurais ratée.
Merci pour vos solutions, cependant elles font toutes deux appel à KGF.dll, ressource externe, souvent incontournable, mais que j'essaie d'éviter dans le mesure du possible, pour une sub comme ici par exemple qui doit être le plus 'universelle' possible...
Mais je vois une possibilité intéressante (sans KGF) dans la fonction de Klaus, je vais étudier ça de plus près. Pour le dimensions de l'image, je ne sais faire qu'avec jpg et bmp, mais l'immense majorité de mes images est du jpg (photos), parfois bmp (plus jamais des gif, png ou autres), donc je peux le faire facilement en panoramic pur.
Merci en tout cas à tous les deux. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Faire défiler une image Mer 28 Fév 2018 - 0:38 | |
| Si tu consens à faire un essai avec KGF.dll, tu peux faire ceci: - télécharge KGF.dll de mon WebDav, dossier DLLs. Il y a quelques nouvelles fonctions pour gérer cela - prends le programme suivant: - Code:
-
' test_TScrollImage.bas
label creer, supprimer, charger, change
dim res%, SI%, img$, no%, no_W%, no_H%
no% = no% + 1 : open_dialog no% : filter no%,"Images (BMP,JPG,GIF,PNG)|*.bmp;*.jpg;*.gif;*.png"
no% = no% + 1 : button no% : caption no%,"Créer" : on_click no%,creer no% = no% + 1 : button no% : left no%,width(no%-1) : caption no%,"Supprimer" : on_click no%,supprimer no% = no% + 1 : button no% : left no%,left(no%-1)+width(no%-1) : caption no%,"Charger" : on_click no%,charger
no% = no% + 1 : scroll_bar no% : no_W% = no% : top no%,30 : left no%,50 : width no%,500 min no%,100 : max no%,1200 : position no%,450 : on_change no%,change no% = no% + 1 : scroll_bar no% : no_H% = no% : vertical no% : top no%,60 : left no%,10 : height no%,350 min no%,100 : max no%,1200 : position no%,300 : on_change no%,change dll_on "KGF.dll"
end
creer: if SI%=0 then SI% = dll_call1("CreateScrollImage",handle(0)) if SI%<>0 then res% = dll_call5("LocateScrollImage",SI%,50,60,position(no_W%),position(no_H%)) ' !!!!!!!!!! activer la ligne suivante pour avoir une image résultante de dimensions fixes: ' res% = dll_call4("FixedSizeScrollImage",SI%,1,1500,1000) return supprimer: SI% = dll_call1("DeleteScrollImage",SI%) return change: if SI%<>0 then res% = dll_call5("LocateScrollImage",SI%,50,60,position(no_W%),position(no_H%)) return charger: img$ = file_name$(1) if img$="_" then return if file_exists(img$)=0 then return res% = dll_call1("LoadAnyImageFile",adr(img$)) res% = dll_call1("LoadScrollImage",SI%) return
- lance ce programe (après avoir adapté le chemin vers KGF.dll) - clic sur "Créer" - un rectangle blanc apparaît - clic sur "Charger" et charhe une grosse photo ==> le coin en haut à gauche de la photo est visible, et tu as les ascenseurs pour faire défiler la photo - utlise les scroll_bars horizontales et verticles pour modifier la taille de la zone de visualisation D'ailleurs, tu peux décommenter la ligne 26 pour avoir une image d'affichage résultante de dimensions fixes. Tel quel, l'image sera toujours affichée avec ses dimensions réelles.Et voilà ce que je peux faire, là, en quelques lignes.
Dernière édition par Klaus le Mer 28 Fév 2018 - 10:56, édité 1 fois | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Faire défiler une image Mer 28 Fév 2018 - 2:54 | |
| Et regarde ceci, dans un contexte similaire: - Code:
-
' test_ScrollPanel.bas
dim SP1%, SP2%, SP3%, SP4% dim res%
full_space 0
dll_on "KGF.dll" SP1% = dll_call1("CreateScrollPanel",handle(0)) res% = dll_call5("LocateScrollPanel",SP1%,0,100,width_client(0),150) SP2% = dll_call1("CreateScrollPanel",handle(0)) res% = dll_call5("LocateScrollPanel",SP2%,0,250,width_client(0)/2,200) SP3% = dll_call1("CreateScrollPanel",handle(0)) res% = dll_call5("LocateScrollPanel",SP3%,width_client(0)/2,250,width_client(0)/2,200) SP4% = dll_call1("CreateScrollPanel",handle(0)) res% = dll_call5("LocateScrollPanel",SP4%,0,450,width_client(0),150)
memo 11 : bar_both 11 : width 11,300 : height 11,600 : font_names_load 11 res% = dll_call6("AttachToScrollPanel",SP1%,handle(11),0,0,300,600) memo 12 : bar_both 12 : width 12,300 : height 12,600 : font_names_load 12 res% = dll_call6("AttachToScrollPanel",SP1%,handle(12),400,100,300,600)
memo 21 : bar_both 21 : width 21,300 : height 21,600 : font_names_load 21 res% = dll_call6("AttachToScrollPanel",SP2%,handle(21),0,0,300,600)
memo 31 : bar_both 31 : width 31,300 : height 31,600 : font_names_load 31 res% = dll_call6("AttachToScrollPanel",SP3%,handle(31),0,0,300,600)
memo 41 : bar_both 41 : width 41,300 : height 41,600 : font_names_load 41 res% = dll_call6("AttachToScrollPanel",SP4%,handle(41),500,100,300,600)
end
Ce programme crée 4 zones de scrolling indépendantes (des "view") dans lesquelles on peut placer n'importe quel objet Panoramic ayant un handle, et même des objets KGF.dll ayant un handle comme un WebBrowser, par exemple. En le plaçant, on indique la position qu'il devrait avoir dans la zone de scrolling, ainsi que des dimensions. Et voilà: on peut avoir des zones de scrolling totalement indépendantes. Ceci réalise un effet similaire à ce qu'on connaît sur une page WEB où l'on peut quelques fois scroller des portions de la page sans toucher à ce qui est autour. Ca intéresse quelqu'un ? Pour le moment, c'est simpliste. On pourrait sophistiquer avec des couleurs ou images de fond, faire glisser la zone en la "tirant" par la souris, etc. Petit rappel: Cette version est pour le moment uniquement sur mon WebDav, dossier DLL, pas sur les sites Web ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Faire défiler une image Mer 28 Fév 2018 - 13:59 | |
| Bonjour Klaus, j'arrive... Je teste ton 1er exemple, oui, ça marche, j'approfondis un peu... Effectivement, avec les barres de défilement c'est plus séduisant et plus pratique que ma solution à moi... | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Faire défiler une image Mer 28 Fév 2018 - 14:36 | |
| Tu peux "ancrer" le picture avec le bouton gauche de la souris pour le faire défiler(100% panoramic): - Code:
-
full_space 0 label load_image_dans_picture1000,bouge dim null, lastX,lastY
' ' génère une image gosub load_image_dans_picture1000
' évènement sur le picture qui contient l'image on_mouse_move 1000,bouge
' un panel qui contient le picture panel 10 : parent 1000,10 : width 10,550 : height 10,550 : top 10,50 : left 10,50
END load_image_dans_picture1000: create_hide picture 1000 : width 1000,1000 : height 1000,1000 dim i,x1,y1,x2,y2,r,g,b 2d_target_is 1000 for i=1 to 100 x1=int(rnd(500)) y1=int(rnd(500)) x2=int(rnd(500)+500) y2=int(rnd(500)+500) r=int(rnd(255)) g=int(rnd(255)) b=int(rnd(255)) 2d_pen_color r,g,b 2d_fill_color r,g,b 2d_rectangle x1,y1,x2,y2 next i create_show show 1000 return
bouge: off_mouse_move 1000 ' souris bouton gauche null=scancode :' rafraichir le scancode if scancode=1 left 1000,left(1000)+mouse_x_position(1000)-lastX top 1000,top(1000)+mouse_y_position(1000)-lastY else lastX=mouse_x_position(1000) lastY=mouse_y_position(1000) end_if ' if left(1000)>width(10)-10 then left 1000,width(10)-10 if left(1000)<10-width(1000) then left 1000,10-width(1000) if top(1000)<10-height(1000) then top 1000,10-height(1000) if top(1000)>height(10)-10 then top 1000,height(10)-10 on_mouse_move 1000,bouge :' pb(bug?) avec bouton gauche: si le bouton est enfoncé dans le picture 1000, l'évènement est :' détecté même si la souris est en dehors du picture 1000!!! Pas génant mais bon à connaitre return EDIT : ce code convient mieux pour "ancrer" un objet plutot qu'une image. EDIT2: voir plus loin un code spécifique pour déplacer sans clignotement une image dans un picture
Dernière édition par silverman le Mer 28 Fév 2018 - 18:49, édité 1 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Faire défiler une image Mer 28 Fév 2018 - 15:13 | |
| Merci silverman, c'est un truc intéressant à connaître. Et un moyen élégant de naviguer dans une image, je note. Mais finalement grâce à Klaus et à l'utilisation des Scroll_bar (c'est ça qui m'avait échappé au début), j'ai une solution en tout Panoramic, très simple, qui me satisfait. On dispose d'un Picture de dimensions quelconques (mais fixes), et si l'image choisie dépasse ces dimensions on fait apparaître des Scroll_bar pour naviguer dans l'image. C'est fluide, et ça me convient (par contre, contrairement à Klaus, c'est limité aux images jpg ou bmp, mais bon, c'est la très grande majorité des cas). Un exemple : - Code:
-
' Parcourir une image LABEL Chimg,Scrol DIM f$,fm$,im%,wi%,hi%,p%,sh%,sv%,wp%,hp%,i%,x%,y%,pas% fm$ = "C:\TEMP\Image.bmp": ' fichier provisoire de travail BORDER_SMALL 0: COLOR 0,180,255,255 p% = 10: wp% = 640: hp% = 480: ' Picture de base WIDTH 0,wp%+50: HEIGHT 0,hp%+100: font_bold 0 ALPHA 4: TOP 4,3: CAPTION 4,"Image:" EDIT 5: LEFT 5,40: WIDTH 5,300: ON_CLICK 5,Chimg OPEN_DIALOG 6: FILTER 6,"Images JPG,BMP|*.jpg;*.bmp" ALPHA 7: TOP 7,3: LEFT 7,LEFT(5)+WIDTH(5)+10 PICTURE p%: TOP p%,25: WIDTH p%,wp%: HEIGHT p%,hp% sh%=p%+1: SCROLL_BAR sh%: TOP sh%,TOP(p%)+hp%: LEFT sh%,LEFT(p%): WIDTH sh%,wp% ON_CHANGE sh%,Scrol sv%=sh%+1: SCROLL_BAR sv%: VERTICAL sv%: TOP sv%,TOP(p%): LEFT sv%,LEFT(p%)+wp%: HEIGHT sv%,hp% ON_CHANGE sv%,Scrol HIDE sh%: HIDE sv% im%=sv%+1: IMAGE im% END ' ============================================ Chimg: ' Choix de l'image de fond f$ = FILE_NAME$(6): TEXT 5,f$ DimJpgBmp(f$):CAPTION 7,STR$(wi%)+" x "+STR$(hi%)+" pixels." IF UPPER$(FILE_EXTRACT_EXTENSION$(f$)) <> ".BMP" FILE_LOAD p%,f$: FILE_SAVE p%,fm$: f$ = fm$: ' conversion image jpg en bmp END_IF FILE_LOAD p%,f$: HIDE sh%: HIDE sv% IF wi%>wp% THEN SHOW sh%: MIN sh%,0: MAX sh%,wi%-wp%: POSITION sh%,0 IF hi%>hp% THEN SHOW sv%: MIN sv%,0: MAX sv%,hi%-hp%: POSITION sv%,0 RETURN ' ============================================ Scrol: ' Déplacement des curseurs x% = 0: y% = 0 IF HIDE(sh%) = 0 THEN x% = POSITION(sh%): ' horizontal IF HIDE(sv%) = 0 THEN y% = POSITION(sv%): ' vertical FILE_LOAD im%,f$: 2D_TARGET_IS p%: 2D_IMAGE_PASTE im%,0-x%,0-y% RETURN ' =========================================== SUB DimJpgBmp(f$) ' Image JPG ou BMP exclusivement, -> dimensions dans wi% et hi% DIM_LOCAL fm$: fm$ = "C:\TEMP\Provy.bmp" PICTURE 1099: HIDE 1099: FILE_LOAD 1099,f$: FILE_SAVE 1099,fm$: DELETE 1099 FILEBIN_OPEN_READ 1,fm$ FILEBIN_POSITION 1,18: wi% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_POSITION 1,22: hi% = FILEBIN_READ(1)+256*FILEBIN_READ(1) FILEBIN_CLOSE 1 FILE_DELETE fm$ END_SUB ' ========================================== | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Faire défiler une image Mer 28 Fév 2018 - 18:10 | |
| Merci, JL35 !
J'ai apporté une petite modif à la DLL sur mon WebDav. Comme je l'avais déjà suggéré au début de ma proposition, j'ai ajouté le mode "pan": on peut tirer l'image dans l'objet ScrollImage par la souris, en maintenant me bouton gauche enfoncé. | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Faire défiler une image Mer 28 Fév 2018 - 18:59 | |
| Le code posté plus haut est plus adapté à l'ancrage d'un objet. J'en ai fait un autre qui déplace une image sans clignotement dans un picture, à la souris (elle ne sors pas du picture en cas de dépassement) C'est vraiment pas mal, et pour ne pas gacher, je le poste, ça pourra intéresser quelqu'un d'autre, à tout hasard - Code:
-
full_space 0 ' label load_image_dans_picture1000,bouge2 dim null,lastX,lastY,pastX,pastY,imx,imy,taille_imx,taille_imy
' génère une image gosub load_image_dans_picture1000
' déplace l'image dans le picture on_mouse_move 1000,bouge2
END load_image_dans_picture1000: create_hide picture 123 : width 123,1000 : height 123,1000 :' fabrique un picture temporaire pour générer une image de 1000*1000 create_show color 123,0,0,0 dim i,x1,y1,x2,y2,r,g,b 2d_target_is 123 for i=1 to 100 x1=int(rnd(500)) y1=int(rnd(500)) x2=int(rnd(500)+500) y2=int(rnd(500)+500) r=int(rnd(255)) g=int(rnd(255)) b=int(rnd(255)) 2d_pen_color r,g,b 2d_fill_color r,g,b 2d_rectangle x1,y1,x2,y2 next i clipboard_copy 123 2d_target_is 0 : delete 123 :' plus besoin du picture temporaire ' ' image 2000 : clipboard_paste 2000 :' charge l'image (file_load)
taille_imx=1000 taille_imy=1000
picture 1000 : width 1000,550 : height 1000,550 : top 1000,50 : left 1000,150 :' un picture de 550*550 2d_target_is 1000 : 2d_image_paste 2000,0,0 :' colle l'image dans le picture
return
bouge2: off_mouse_move 1000 ' null=scancode :' rafraichir le scancode if scancode=1 2d_clear pastX=mouse_x_position(1000) pastY=mouse_y_position(1000) imx=imx+(pastx-lastx) imy=imy+(pasty-lasty) if imx<width(1000)-taille_imx then imx=width(1000)-taille_imx :' <--- taille_imx if imx>0 then imx=0 if imy<height(1000)-taille_imy then imy=height(1000)-taille_imy :' <--- taille_imy if imy>0 then imy=0 2d_image_paste 2000,imx,imy lastx=pastx lasty=pasty else lastX=mouse_x_position(1000) lastY=mouse_y_position(1000) end_if ' on_mouse_move 1000,bouge2 :' pb(bug?) avec bouton gauche: si le bouton est enfoncé dans le picture 1000, l'évènement est :' détecté même si la souris est en dehors du picture 1000!!! Pas génant mais bon à connaitre return | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Faire défiler une image Mer 28 Fév 2018 - 19:31 | |
| En effet, Silverman, c'est excellent ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Faire défiler une image Mer 28 Fév 2018 - 20:56 | |
| C'est vrai que c'est pas mal du tout, très fluide et agréable à manipuler. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Faire défiler une image Jeu 1 Mar 2018 - 2:18 | |
| J'ai actualisé ma version actuelle de KGF.dll sur le WebDav, avec un déplacement fluide d'une image dans l'objet ScrollImage. Je ne sais pas si cet objet peut avoir un intérêt, et j'invite tous ceux qui s'y intéressent, à jeter un coup d'oeil sur le programme de démo: - Code:
-
' test_TScrollImage.bas
label creer, supprimer, charger, change
dim res%, SI%, img$, no%, no_W%, no_H%
no% = no% + 1 : open_dialog no% : filter no%,"Images (BMP,JPG,GIF,PNG)|*.bmp;*.jpg;*.gif;*.png"
no% = no% + 1 : button no% : caption no%,"Créer" : on_click no%,creer no% = no% + 1 : button no% : left no%,width(no%-1) : caption no%,"Supprimer" : on_click no%,supprimer no% = no% + 1 : button no% : left no%,left(no%-1)+width(no%-1) : caption no%,"Charger" : on_click no%,charger
no% = no% + 1 : scroll_bar no% : no_W% = no% : top no%,30 : left no%,50 : width no%,500 min no%,100 : max no%,1200 : position no%,450 : on_change no%,change no% = no% + 1 : scroll_bar no% : no_H% = no% : vertical no% : top no%,60 : left no%,10 : height no%,350 min no%,100 : max no%,1200 : position no%,300 : on_change no%,change dll_on "KGF.dll"
end
creer: if SI%=0 then SI% = dll_call1("CreateScrollImage",handle(0)) if SI%<>0 then res% = dll_call5("LocateScrollImage",SI%,50,60,position(no_W%),position(no_H%)) ' !!!!!!!!!! activer la ligne suivante pour avoir une image résultante de dimensions fixes: ' res% = dll_call4("FixedSizeScrollImage",SI%,1,1500,1000) return supprimer: SI% = dll_call1("DeleteScrollImage",SI%) return change: if SI%<>0 then res% = dll_call5("LocateScrollImage",SI%,50,60,position(no_W%),position(no_H%)) return charger: img$ = file_name$(1) if img$="_" then return if file_exists(img$)=0 then return res% = dll_call1("LoadAnyImageFile",adr(img$)) res% = dll_call1("LoadScrollImage",SI%) return
Dans la mpeme veine, j'ai créé l'objet ScrollPanel qui réalise quelque chose qui ressemble à ce qui se fait dans des pages Web, où l'on peut faire défiler le contenu d'un cadre sans bouger le reste de la page. Maintenant, on peut faire cela aussi, et on peut créer plusieurs zones de ce genre simultanément. Mon programme de démo ci-après en contient 4. Dans une telle zone, on peut placer tous les objets Panoramic ayant un handle, en les plaçant exactement comme si c'était une form ou un panel, sauf que veur visualisation se fait dans une fenêtre définie par les dimensions du ScrollPanel, et on déplace la vue avec les ascenseurs. On peut même y placer des objets visuels sans handle comme un picture: on place le picture dans on panel de même dimension, puis un place ce panel dans le ScrollPanel. Voici la démo: - Code:
-
' test_ScrollPanel.bas
dim SP1%, SP2%, SP3%, SP4% dim res%
full_space 0
dll_on "KGF.dll" SP1% = dll_call1("CreateScrollPanel",handle(0)) res% = dll_call5("LocateScrollPanel",SP1%,0,100,width_client(0),150) SP2% = dll_call1("CreateScrollPanel",handle(0)) res% = dll_call5("LocateScrollPanel",SP2%,0,250,width_client(0)/2,200) SP3% = dll_call1("CreateScrollPanel",handle(0)) res% = dll_call5("LocateScrollPanel",SP3%,width_client(0)/2,250,width_client(0)/2,200) SP4% = dll_call1("CreateScrollPanel",handle(0)) res% = dll_call5("LocateScrollPanel",SP4%,0,450,width_client(0),150)
memo 11 : bar_both 11 : width 11,300 : height 11,600 : font_names_load 11 res% = dll_call6("AttachToScrollPanel",SP1%,handle(11),0,0,300,600) memo 12 : bar_both 12 : width 12,300 : height 12,600 : font_names_load 12 res% = dll_call6("AttachToScrollPanel",SP1%,handle(12),400,100,300,600)
memo 21 : bar_both 21 : width 21,300 : height 21,600 : font_names_load 21 res% = dll_call6("AttachToScrollPanel",SP2%,handle(21),0,0,300,600)
memo 31 : bar_both 31 : width 31,300 : height 31,600 : font_names_load 31 res% = dll_call6("AttachToScrollPanel",SP3%,handle(31),0,0,300,600)
memo 41 : bar_both 41 : width 41,300 : height 41,600 : font_names_load 41 res% = dll_call6("AttachToScrollPanel",SP4%,handle(41),500,100,300,600)
end
Qu'est-ce que vous pensez de ces deux objets ? Est-ce que ça vaut le coup de les garder et de les documenter ? Je rappelle que seule KGF.dll sur mon WebDav dossier DLLs, contient cette version. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 1 Mar 2018 - 3:39 | |
| Même si je n' en ai pas l' utilité immédiate, ces deux objets sont très intéressant. un graphique plus grand que l' écran, une carte géographique... Comme tout objet, puisqu' il existe autant le garder. C' est toujours un plus. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Faire défiler une image Jeu 1 Mar 2018 - 10:19 | |
| Merci, Yannick !
J'ai apporté une amélioration dans ces fonctions dans KGF.dll sur mon WebDav.
Jusqu'à maintenant, le déplacement des ascenseurs de ces objets n'avait d'effet visible que lorsqu'on relâchait le bouton. Maintenant, le déplacement du bouton de scrollbar déplace l'image de façon synchrone, souplement. C'est beaucoup mieux. | |
| | | Contenu sponsorisé
| Sujet: Re: Faire défiler une image | |
| |
| | | | Faire défiler une image | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |