[R] Faire défiler une image

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

[R] Faire défiler une image

#1

Message par aulus »

Bonjour,

Je souhaiterais afficher une image dans une GUI, affichage se limitant à la zone que je lui attribue (mais en conservant ses dimensions d'origine, sans les adapter à la taille de la GUI FILLE), avec possibilité pour l'utilisateur de faire défiler cette image horizontalement et verticalement afin de la visionner dans son intégralité.

J'ai codé ceci :

Code : Tout sélectionner

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIScrollBars.au3>
#include <ScrollBarConstants.au3>
#include "GUIScrollbars_Ex.au3" ; joindre ce fichier pour la compilation

$gui = GUICreate("Essai", 800, 400, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_SIZEBOX))

$fille = GUICreate("fille", 700, 300, 15, 70, $WS_POPUP, $WS_EX_MDICHILD, $gui

$n = GUICtrlCreatePic("image.jpg", 10, 10, 1942, 2067)
_GUIScrollbars_Generate($fille, 1942, 2067)
GUISetState()
GUISwitch($gui)
GUISetState()

While 1
    $GUIMsg = GUIGetMsg()

    Switch $GUIMsg
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd
 
Je ne parviens pas à choisir les bonnes dimensions à donner dans les fonctions $n = GUICtrlCreatePic("image.jpg", 10, 10, 1942, 2067) et _GUIScrollbars_Generate($fille, 1942, 2067) pour que les barres de défilement permettent de visualiser l'intégralité de l'image. Les dimensions 1942 et 2067 sont les dimensions exactes de l'image, mais les barres de défilement ne permettent pas de tout voir. Et cette manière de faire ne conviendra plus car l'image affichée n'aura pas toujours ces dimensions.

Je vous remercie de vos conseils.
Modifié en dernier par aulus le ven. 20 déc. 2013 14:10, modifié 1 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] faire défiler une image

#2

Message par mikell »

aulus a écrit :l'image affichée n'aura pas toujours ces dimensions
Donc il te faut récupérer les dimensions de l'image pour les utiliser ensuite comme variables
► Afficher le texte
aulus a écrit :... pour que les barres de défilement permettent de visualiser l'intégralité de l'image
Le problème avec les scrollbars c'est qu'elles ne font pas un défilement pixel par pixel, elles ont un 'pas' qu'il faut rajouter dans l'instruction

Code : Tout sélectionner

$n = GUICtrlCreatePic("image.jpg", 0, 0, $iX, $iY)
_GUIScrollbars_Generate($fille, $iX+30, $iY+30)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] faire défiler une image

#3

Message par aulus »

Bonjour et merci, Mikell, pour cette aide. J'étais loin d'imaginer le pourquoi du problème. Celui-ci n'est toutefois pas complètement résolu. L'image reste tronquée très légèrement. C'est ennuyeux du fait que l'image qui sera affichée est la photo d'un texte, et une ligne manquante (verticalement) et une fin de ligne rognée (horizontalement) ...
Je me demande si ce rognage n'est pas dû à la place prise par les barres de défilement.
J'ai pallié à ce problème en jouant sur le pas. Je ne sais pas si le pas choisi conviendra pour toutes les images :

Code : Tout sélectionner

_GUIScrollbars_Generate($fille, $iX+50, $iY+200)
 
Je profite de ce message pour demander si Autoit offre des fonctions de modification d'une image, telles que la netteté, contraste, ...

Merci encore.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] faire défiler une image

#4

Message par mikell »

Pour un défilement propre essaie ça
► Afficher le texte
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] faire défiler une image

#5

Message par aulus »

Merci Mikell pour ce code qui ne pose pas de problème d'intégrité d'affichage.

L'objet IE est affiché sur une GUI contenant aussi des onglets. Lorsque je change d'onglet l'image disparaît. De même l'image disparaît lorsque je ferme tous les onglets pour réafficher d'autres controles. Que conviendrait-il de faire pour que l'image reste en permanence dans l'objet ou, au moins, se réaffiche lorsque je réaffiche à nouveau l'ensemble des onglets ?
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] faire défiler une image

#6

Message par mikell »

Tu dois avoir un souci quelque part dans ton code parce que l'objet IE ne pose pas de problème particulier avec des tabs
► Afficher le texte
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] faire défiler une image

#7

Message par aulus »

Je me suis mal exprimé. L'objet IE n'est pas dans un onglet, mais sur la même GUI que les onglets. Objet IE et les onglets sont l'un au-dessous de l'autre.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] faire défiler une image

#8

Message par mikell »

► Afficher le texte
Je maintiens, c'est un problème de code et sans un script-exemple de ce qui ne marche pas ça va être dur de te répondre autre chose ...
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] faire défiler une image

#9

Message par aulus »

Effectivement, c'est mon code qui ne va pas. Je ne peux tout afficher ici, mon code étant trop long et complexe. Voici son fonctionnement :
- J'ouvre des tabs, l'emplacement de l'objet IE sur la même GUI étant réservé.
- Je clique sur un bouton appelant une fonction qui permet de choisir une image par un FileOpenDialog
- L'image choisie s'installe dans l'objet IE.
- A l'affichage d'un autre onglet, l'image disparaît. Elle semble liée à cet onglet. J'ai testé avec chacun des onglets. L'image s'affiche uniquement lorsque je ré-ouvre l'onglet ouvert à l'appel de l'image.

J'ai tenté de placer l'objet IE dans une GUI indépendante de la GUI contenant les onglets, et dans ce cas la GUI indépendante conserve bien son image aux changements d'onglet. Mais ce n'est pas le but que je me suis fixé. En cas d'échec avec la première manière, je me rabattrai sur celle-là.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Faire défiler une image

#10

Message par mikell »

Hum quelque chose comme ça ?
► Afficher le texte
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Faire défiler une image

#11

Message par aulus »

Oui, l'effet est celui-là. Toutefois, dans mon cas, l'image s'affiche lorsque l'onglet qui était ouvert à l'appel de l'image par le bouton, est à nouveau ouvert. Dans votre exemple, c'est toujours à l'ouverture de l'onglet 3.

En comparant vos deux derniers codes, j'ai vu la différence de position de la ligne GUICtrlCreateTabItem(""). J'ai essayé de rajouter cette ligne en tête de la fonction affichant l'objet IE, et cette-fois-ci l'image ne disparaît plus.
Je crois que vous avez trouvé la solution...
A demain, je vais au lit... j'ai la tête qui va exploser après une journée de tests... Mille mercis pour votre patience...
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Faire défiler une image

#12

Message par aulus »

Bonjour,

Maintenant que l'objet IE s'affiche bien et ne pose plus de problème, je voudrais ... le détruire afin de ne plus l'afficher quand il devient inutile. Ne trouvant pas de GUICtrlDeleteObj() comme il existe un GUICtrlCreateObj(), j'ai tenté un GUICtrlDelete() mais cette fonction est sans effet. Quelle fonction ferait l'affaire ?

Je vous remercie.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Faire défiler une image

#13

Message par mikell »

Bigre ...
► Afficher le texte
:mrgreen:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Faire défiler une image

#14

Message par aulus »

J'ai honte... Je m'évertuais à supprimer $oIE !

Tout est parfait. Vous m'avez encore apporté une aide efficace en me proposant un ensemble de fonctions dont je ne doutais pas l'existence jusqu'à hier. Grand merci.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] Faire défiler une image

#15

Message par mikell »

Super
NB : Pour des raisons de pinaillage (et de cohérence/logique) vaudrait mieux mettre le

Code : Tout sélectionner

GUICtrlCreateTabItem("")[i]; end tabitem definition[/i]
en clôture de définition des tabitems plutôt qu'en début d'une quelconque autre fonction :wink:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [R] Faire défiler une image

#16

Message par aulus »

J'ai tenu compte de votre conseil.
Répondre