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
» [Résolu] Un prg Panoramic s'abime avec le temps (erreur)
par Oscaribout Aujourd'hui à 13:48

» Planétarium virtuel.
par Pedro Alvarez Aujourd'hui à 9:56

» Dessin 2D: largeur de trait (résolu !)
par Jicehel Hier à 15:16

» Promenade dans le Ciel
par papydall Hier à 3:13

» PanExpress : l'éditeur Panoramic avec création d'objet
par Minibug Sam 23 Juin 2018 - 17:00

» Nouvelle version 0.34
par jean_debord Sam 23 Juin 2018 - 9:39

» Quantité de mémoire utilisée par un exe
par mindstorm Jeu 21 Juin 2018 - 21:22

» Projet de planétarium virtuel.
par Jean Claude Jeu 21 Juin 2018 - 19:02

» Animation: Feux de signalisation
par Minibug Mer 20 Juin 2018 - 20:28

» Problème avec 'file_load'.
par Pedro Alvarez Lun 18 Juin 2018 - 8:12

» Version instantanée V 0.9.28i20 du 13/06/2018
par jjn4 Sam 16 Juin 2018 - 14:25

» string$(0,chr$(32)) sans erreur
par silverman Ven 15 Juin 2018 - 19:56

» Version instantanée V 0.9.28i19 du 13/06/2018
par Minibug Ven 15 Juin 2018 - 19:14

» Mes souhaits d'amélioration de Panoramic.
par Pedro Alvarez Jeu 14 Juin 2018 - 20:17

» [RÉSOLU] Message d'erreur impossible à indentifier
par Minibug Mer 13 Juin 2018 - 20:52

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Juin 2018
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier

Partagez | 
 

 Faire défiler une image

Aller en bas 
AuteurMessage
JL35



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

MessageSujet: 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
' ==========================================
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Pedro Alvarez

avatar

Nombre de messages : 1069
Date d'inscription : 19/01/2014

MessageSujet: 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é.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: 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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: 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...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



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

MessageSujet: 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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: 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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: 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 !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



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

MessageSujet: 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...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
silverman

avatar

Nombre de messages : 645
Age : 46
Localisation : Picardie
Date d'inscription : 18/03/2015

MessageSujet: 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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



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

MessageSujet: 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
' ==========================================
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: 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é.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
silverman

avatar

Nombre de messages : 645
Age : 46
Localisation : Picardie
Date d'inscription : 18/03/2015

MessageSujet: 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 Very Happy
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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Faire défiler une image   Mer 28 Fév 2018 - 19:31

En effet, Silverman, c'est excellent !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



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

MessageSujet: 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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: 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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

Nombre de messages : 8077
Age : 47
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: 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.
Laughing
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: 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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé




MessageSujet: Re: Faire défiler une image   

Revenir en haut Aller en bas
 
Faire défiler une image
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [Resolu] bandeau défilent d'image...saccadé
» [résolu] Sauvegarde W10 sur DDE (fichiers et image système)
» Comment faire déplacer une image
» Faire défiler une partie d'une banniere
» faire un visionneur d'image avec une option zoom

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