Page 1 sur 1
[R] Faire défiler une image
Posté : mer. 18 déc. 2013 19:23
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.
Re: [..] faire défiler une image
Posté : mer. 18 déc. 2013 22:11
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
Code : Tout sélectionner
#include <GDIPlus.au3>
_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile(@scriptdir & "\image.jpg")
$iX = _GDIPlus_ImageGetWidth($hImage)
$iY = _GDIPlus_ImageGetHeight($hImage)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
Msgbox(0,"", $iX & " x " & $iY)
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)
Re: [..] faire défiler une image
Posté : jeu. 19 déc. 2013 11:15
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 :
Je profite de ce message pour demander si Autoit offre des fonctions de modification d'une image, telles que la netteté, contraste, ...
Merci encore.
Re: [..] faire défiler une image
Posté : jeu. 19 déc. 2013 14:15
par mikell
Pour un défilement propre essaie ça
► Afficher le texte
Code : Tout sélectionner
$oIE=ObjCreate("Shell.Explorer.2")
$gui = GUICreate("Essai", 800, 400)
$gX = GUICtrlCreateObj($oIE, 30, 30, 700, 350)
GUISetState()
$tmp = @tempdir & "\aulus.htm"
$f = FileOpen($tmp, 2)
FileWrite($f, '<img src="' & @scriptdir & '\image.jpg">' )
FileClose($f)
$oIE.Navigate($tmp)
While GuiGetMsg()<>-3
Wend
Re: [..] faire défiler une image
Posté : jeu. 19 déc. 2013 17:29
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 ?
Re: [..] faire défiler une image
Posté : jeu. 19 déc. 2013 18:16
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
Code : Tout sélectionner
$Gui = GUICreate("Gui", 625, 450, 190, 122)
$Tab1 = GUICtrlCreateTab(8, 8, 609, 400)
$Tab1 = GUICtrlCreateTabItem("Tab 1")
$Tab2 = GUICtrlCreateTabItem("Site")
$oIE = ObjCreate("Shell.Explorer.2")
GUICtrlCreateObj($oIE, 13, 35, 597, 370)
$oIE.navigate("http://www.google.fr")
$Tab3 = GUICtrlCreateTabItem("Tab 3")
GUICtrlCreateTabItem("")
GUISetState()
While 1
$msg = GuiGetMsg()
If $msg = -3 Then Exit
WEnd
Re: [..] faire défiler une image
Posté : jeu. 19 déc. 2013 18:50
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.
Re: [..] faire défiler une image
Posté : jeu. 19 déc. 2013 19:35
par mikell
► Afficher le texte
Code : Tout sélectionner
$Gui = GUICreate("Gui", 610, 450)
$Tab1 = GUICtrlCreateTab(8, 8, 590, 100)
$Tab1 = GUICtrlCreateTabItem("Tab 1")
$Tab2 = GUICtrlCreateTabItem("Tab 2")
$Tab3 = GUICtrlCreateTabItem("Tab 3")
GUICtrlCreateTabItem("")
$oIE = ObjCreate("Shell.Explorer.2")
GUICtrlCreateObj($oIE, 10, 120, 590, 320)
$oIE.navigate("http://www.google.fr")
GUISetState()
While 1
$msg = GuiGetMsg()
If $msg = -3 Then Exit
WEnd
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 ...
Re: [..] faire défiler une image
Posté : jeu. 19 déc. 2013 21:00
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à.
Re: [..] Faire défiler une image
Posté : jeu. 19 déc. 2013 22:35
par mikell
Hum quelque chose comme ça ?
► Afficher le texte
Code : Tout sélectionner
$Gui = GUICreate("Gui", 610, 450)
$Tab1 = GUICtrlCreateTab(8, 8, 590, 100)
$Tab1 = GUICtrlCreateTabItem("Tab 1")
$Tab2 = GUICtrlCreateTabItem("Tab 2")
$Tab3 = GUICtrlCreateTabItem("Tab 3")
$oIE = ObjCreate("Shell.Explorer.2")
GUICtrlCreateObj($oIE, 10, 120, 590, 320)
$oIE.navigate("http://www.google.fr")
GUICtrlCreateTabItem("")
GUISetState()
While 1
$msg = GuiGetMsg()
If $msg = -3 Then Exit
WEnd
Re: [..] Faire défiler une image
Posté : jeu. 19 déc. 2013 22:59
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...
Re: [..] Faire défiler une image
Posté : ven. 20 déc. 2013 09:52
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.
Re: [..] Faire défiler une image
Posté : ven. 20 déc. 2013 13:52
par mikell
Bigre ...
► Afficher le texte
Code : Tout sélectionner
$Gui = GUICreate("Gui", 625, 450, 190, 122)
$oIE = ObjCreate("Shell.Explorer.2")
$g = GUICtrlCreateObj($oIE, 13, 35, 597, 370)
$oIE.navigate("http://www.google.fr")
GUISetState()
While 1
$msg = GuiGetMsg()
If $msg = -3 Then
GuiCtrlDelete($g)
$oIE = 0
Exit Msgbox(0,"", "objet viré", 3)
EndIf
WEnd

Re: [..] Faire défiler une image
Posté : ven. 20 déc. 2013 14:10
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.
Re: [R] Faire défiler une image
Posté : ven. 20 déc. 2013 14:31
par mikell
Super
NB : Pour des raisons de pinaillage (et de cohérence/logique) vaudrait mieux mettre le
en clôture de définition des tabitems plutôt qu'en début d'une quelconque autre fonction

Re: [R] Faire défiler une image
Posté : ven. 20 déc. 2013 15:47
par aulus
J'ai tenu compte de votre conseil.