cs_Willi
Messages postés2375Date d'inscriptionjeudi 12 juillet 2001StatutModérateurDernière intervention15 décembre 2018
-
29 mars 2006 à 16:01
Hackdevil
Messages postés28Date d'inscriptiondimanche 2 janvier 2005StatutMembreDernière intervention 5 mai 2014
-
26 juil. 2011 à 23:49
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Hackdevil
Messages postés28Date d'inscriptiondimanche 2 janvier 2005StatutMembreDernière intervention 5 mai 2014 26 juil. 2011 à 23:49
Bonjour, j'essaye d'utiliser votre code en vb.net mais je n'y arrive pas :s
Le but pour moi est de créer un effet de loupe quand on passe la souris sur une image.
En gros, j'essaye de faire un jeu du genre où est Charlie et quand on passe la souris sur l'image, on cherche en zoom.
J'ai cherché de l'aide un peu partout mais je ne trouve quasi rien en vb.net.
J'ai essayer de retranscrire votre code vb 6 en vb.net, ça se lance mais il n'y a pas de loupe ni rien...
Je suis plutôt débutant donc ne soyez pas trop sévères ;)
Désolé de déterrer un topic mais votre source m'intéresse vraiment.
Le code :
Private Declare Function GetWindowDC Lib "user32" (ByVal HWnd As Long) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Dim PosX As Long
Dim PosY As Long
Private Sub PictureBox1_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseEnter
Timer1.Start()
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
PosX = MousePosition.X
PosY = MousePosition.Y
StretchBlt(PictureBox1.CreateGraphics.GetHdc, 0, 0, PictureBox1.Width, PictureBox1.Height, GetWindowDC(0), MousePosition.X - 15, MousePosition.Y - 15, 30, 30, &HCC0020)
End Sub
cs_Warny
Messages postés473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 juin 2015 15 juil. 2009 à 10:29
Salut,
Sous windows (sauf vista avec aero) il y a deux principes pour dessiner :
- un principe lent, mais général, les programmes demandent à windows de dessiner sur la sortie écran standard. C'est ce que tu vois avec la loupe.
- un principe rapide qui consiste à écrire directement et au dernier moment en mémoire mais qui pose un problème de gestion de conflits, c'est le cas de winamp, de toutes les vidéos en général et de directX. Là, tu vois du noir avec la loupe, puisque l'image est apposée après la composition de windows.
PS: je considère personnelement que quand on sépare des instructions avec ":" ça fait toujours 2 lignes de code.
zemetafyzik
Messages postés117Date d'inscriptionjeudi 17 juin 2004StatutMembreDernière intervention 3 novembre 20071 30 mars 2006 à 21:57
Merci
t'en fait pas pour la clarté, si je comprend pas tout maintenant je comprendrais plus tard, mais c'est deja plus clair ^^
clementio
Messages postés432Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 février 20141 30 mars 2006 à 19:50
Le prog utilise l'API GetWindowDC qui renvoie le DC d'une fenêtre. C'est une zone contenant l'aperçu graphique d'une fenêtre.
Avec GetWindowDC(0) (le paramètre passé est zéro), on demande le DC "général". C'est-à-dire qu'au lieu de demander le DC d'une fenêtre particulière grâce à son handle, on obtient toute la partie visible à l'écran (un peu un genre d'Impr Ecran).
Mais le problème que tu constates est que certaines fenêtres (comme WinAmp en mode vidéo) n'imprime pas de zone visible dans le DC "général". C'est du au fait du rendu utilisé par WinAmp donc impossible de voir cette zone. C'est pareil pour les infos bulles.
Je ne sais pas si c'est très clair pour toi et je pense ne pas être trop loin de la vérité dans mon explication...
zemetafyzik
Messages postés117Date d'inscriptionjeudi 17 juin 2004StatutMembreDernière intervention 3 novembre 20071 30 mars 2006 à 19:24
Je sais que c'est pas un bug du programme, mais pourquoi quand je deplace le curseur sur les vidéos de winamp (meme sur pause) sa ne s'affiche pas ? et pourquoi ça affiche certaine infobulle, mais pas toutes ???
merci
clementio
Messages postés432Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 février 20141 30 mars 2006 à 08:46
eheheh....
cs_moustachu
Messages postés1079Date d'inscriptionjeudi 14 novembre 2002StatutMembreDernière intervention 1 janvier 2012 30 mars 2006 à 08:31
Bonjour,
et en une ligne sans ":"
Private Sub Loupe
Shell magnify
End Sub
C'est bon, j'ai gagné, hein, dites ??!?
++
Moustachu
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 29 mars 2006 à 23:45
BruNews> lol ouai de toute façon on s'en tape c'est du VB !
non non je deconne pour le coup on rajoute une api et une variable mais de toute façon avec des ":" ça tient encore sur une ligne :p
mcs2006
Messages postés58Date d'inscriptiondimanche 19 mars 2006StatutMembreDernière intervention 1 mai 2006 29 mars 2006 à 22:58
Petit oubli : le "type" ANY n'existe plus en VB.NET. A remplacer par le vrai type des valeurs passées.
mcs2006
Messages postés58Date d'inscriptiondimanche 19 mars 2006StatutMembreDernière intervention 1 mai 2006 29 mars 2006 à 22:56
<M4ndrax> : Pour le .NET, dans la mesure de mes connaissances embryonnaires, je dirais :
- Oublier le 'Option Explicit' du VB6, en VB.NET c'est par défaut et ce n'est pas un mal (bien qu'on puisse le désactiver) et pas besoin de le déclarer dans le code.
- Oublier aussi les Screen.TwipsPerPixelX et Screen.TwipsPerPixelY. Dans la mesure de mes connaissances en VB.NET, par exemple, Picture1.Width suffit en VB.NET, pas besoin de Picture1.Width / Screen.TwipsPerPixelX. Bon, ça c'est encore à voir.
- pour les API's utilisées, traduction :
GetCursorPos = System.Windows.Forms.Cursor.Current.Position
GetWindowDC = System.Windows.Forms.Form.CreateGraphics.GetHdc
StretchBlt = System.Drawing.Graphics.DrawImage
Le reste, je te laisse le traduire. Peut-être même qu'il existe une fonction loupe intégrée dans le FrameWork ? Pour le coup, question nombre de lignes de code (y compris les déclarations) tu pourras faire mieux que <EBArtSoft> lol.
M4ndrax
Messages postés5Date d'inscriptionmardi 28 mars 2006StatutMembreDernière intervention12 décembre 2006 29 mars 2006 à 22:15
Si quelqu'un pouvait retrenscire le code en .net sa serait geniale, merci d'avance.
clementio
Messages postés432Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 février 20141 29 mars 2006 à 21:38
Eheheh, il faut bien de temps en temps...
Pour le .NET, c'est mort, autant VB je peux t'aider que .Net je connais absolument rien...
Mais peut-être que quelqu'un peut te le traduire et le déposer ici en commentaire, avis aux amateurs...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 29 mars 2006 à 21:26
Alors on fait bien mumuse par ici ?
EB > ReleaseDC correspondant au GetWindowDC, il est caché où ???
M4ndrax
Messages postés5Date d'inscriptionmardi 28 mars 2006StatutMembreDernière intervention12 décembre 2006 29 mars 2006 à 21:00
sa a l'aires super mais moi j'ai vb.net et sa me di deja que :
le code
Option Explicit n'est pas déclarer donc je pense que cété juste une remarque mais par contre il me dit que Pt et Picture1.hdc ainsi que Screen.TwipsPerPixelX ne sont pas déclarer du moin les hdc... alors que si, alors peut tu remasteriser ton code pour vb.net plz
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 29 mars 2006 à 20:57
Oui lol mais c'est aussi facile que de ne pas compter les declaration de variable et d'api ! ;)
Et on pourrais encore aller plus loin en utilisant une tlb
@+
clementio
Messages postés432Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 février 20141 29 mars 2006 à 20:52
Lol
Eh ben en plus tu m'a appris un truc!!!!
Je ne savais pas que dans une décalaration d'API on pouvait remplacer le type attendu du paramètre par Any et utiliser l'API avec un tableau de valeurs. Merci pour l'info...
Pour ce qui est d'homologuer ton record, c'est quand même un peu facile les ":", non???
Enfin bref, on est là pour s'amuser et si d'autres on des solutions à proposer, ils sont les bienvenus!!!
cs_EBArtSoft
Messages postés4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 29 mars 2006 à 20:39
Ok defit relevé !
Deja je vire la picture box je mets scalemode en pixel puis je degare point api j'ajoute des ":" et me voila avec 1 seule "ligne de code" (selon ton principe) :p :
Option Explicit
Private Declare Function GetCursorPos Lib "user32" (lpPoint As Any) As Long
Private Declare Function GetWindowDC Lib "user32" (ByVal HWnd As Long) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Private Sub Timer1_Timer()
Dim Pt(1) As Long: GetCursorPos Pt(0): StretchBlt Me.hdc, 0, 0, Me.ScaleWidth, Me.ScaleHeight, GetWindowDC(0), Pt(0) - 15, Pt(1) - 15, 30, 30, &HCC0020
End Sub
@+
clementio
Messages postés432Date d'inscriptionsamedi 18 mai 2002StatutMembreDernière intervention17 février 20141 29 mars 2006 à 16:15
Poutant je l'ai trouvé tout seul en combinant des API...
C'est simple, on récupère la position du curseur et on dessine en agrandi le rectangle autour de cette position dans une PictureBox...
cs_Willi
Messages postés2375Date d'inscriptionjeudi 12 juillet 2001StatutModérateurDernière intervention15 décembre 201822 29 mars 2006 à 16:01
Tient, j'ai exactement le même code dans mes archives de codes sources.
Sinon un petit commentaire quand même pour 2 lignes :D
26 juil. 2011 à 23:49
Le but pour moi est de créer un effet de loupe quand on passe la souris sur une image.
En gros, j'essaye de faire un jeu du genre où est Charlie et quand on passe la souris sur l'image, on cherche en zoom.
J'ai cherché de l'aide un peu partout mais je ne trouve quasi rien en vb.net.
J'ai essayer de retranscrire votre code vb 6 en vb.net, ça se lance mais il n'y a pas de loupe ni rien...
Je suis plutôt débutant donc ne soyez pas trop sévères ;)
Désolé de déterrer un topic mais votre source m'intéresse vraiment.
Le code :
Private Declare Function GetWindowDC Lib "user32" (ByVal HWnd As Long) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Dim PosX As Long
Dim PosY As Long
Private Sub PictureBox1_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseEnter
Timer1.Start()
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
PosX = MousePosition.X
PosY = MousePosition.Y
StretchBlt(PictureBox1.CreateGraphics.GetHdc, 0, 0, PictureBox1.Width, PictureBox1.Height, GetWindowDC(0), MousePosition.X - 15, MousePosition.Y - 15, 30, 30, &HCC0020)
End Sub
15 juil. 2009 à 10:29
Sous windows (sauf vista avec aero) il y a deux principes pour dessiner :
- un principe lent, mais général, les programmes demandent à windows de dessiner sur la sortie écran standard. C'est ce que tu vois avec la loupe.
- un principe rapide qui consiste à écrire directement et au dernier moment en mémoire mais qui pose un problème de gestion de conflits, c'est le cas de winamp, de toutes les vidéos en général et de directX. Là, tu vois du noir avec la loupe, puisque l'image est apposée après la composition de windows.
PS: je considère personnelement que quand on sépare des instructions avec ":" ça fait toujours 2 lignes de code.
30 mars 2006 à 21:57
t'en fait pas pour la clarté, si je comprend pas tout maintenant je comprendrais plus tard, mais c'est deja plus clair ^^
30 mars 2006 à 19:50
Avec GetWindowDC(0) (le paramètre passé est zéro), on demande le DC "général". C'est-à-dire qu'au lieu de demander le DC d'une fenêtre particulière grâce à son handle, on obtient toute la partie visible à l'écran (un peu un genre d'Impr Ecran).
Mais le problème que tu constates est que certaines fenêtres (comme WinAmp en mode vidéo) n'imprime pas de zone visible dans le DC "général". C'est du au fait du rendu utilisé par WinAmp donc impossible de voir cette zone. C'est pareil pour les infos bulles.
Je ne sais pas si c'est très clair pour toi et je pense ne pas être trop loin de la vérité dans mon explication...
30 mars 2006 à 19:24
merci
30 mars 2006 à 08:46
30 mars 2006 à 08:31
et en une ligne sans ":"
Private Sub Loupe
Shell magnify
End Sub
C'est bon, j'ai gagné, hein, dites ??!?
++
Moustachu
29 mars 2006 à 23:45
non non je deconne pour le coup on rajoute une api et une variable mais de toute façon avec des ":" ça tient encore sur une ligne :p
29 mars 2006 à 22:58
29 mars 2006 à 22:56
- Oublier le 'Option Explicit' du VB6, en VB.NET c'est par défaut et ce n'est pas un mal (bien qu'on puisse le désactiver) et pas besoin de le déclarer dans le code.
- Oublier aussi les Screen.TwipsPerPixelX et Screen.TwipsPerPixelY. Dans la mesure de mes connaissances en VB.NET, par exemple, Picture1.Width suffit en VB.NET, pas besoin de Picture1.Width / Screen.TwipsPerPixelX. Bon, ça c'est encore à voir.
- pour les API's utilisées, traduction :
GetCursorPos = System.Windows.Forms.Cursor.Current.Position
GetWindowDC = System.Windows.Forms.Form.CreateGraphics.GetHdc
StretchBlt = System.Drawing.Graphics.DrawImage
Le reste, je te laisse le traduire. Peut-être même qu'il existe une fonction loupe intégrée dans le FrameWork ? Pour le coup, question nombre de lignes de code (y compris les déclarations) tu pourras faire mieux que <EBArtSoft> lol.
29 mars 2006 à 22:15
29 mars 2006 à 21:38
Pour le .NET, c'est mort, autant VB je peux t'aider que .Net je connais absolument rien...
Mais peut-être que quelqu'un peut te le traduire et le déposer ici en commentaire, avis aux amateurs...
29 mars 2006 à 21:26
EB > ReleaseDC correspondant au GetWindowDC, il est caché où ???
29 mars 2006 à 21:00
le code
Option Explicit n'est pas déclarer donc je pense que cété juste une remarque mais par contre il me dit que Pt et Picture1.hdc ainsi que Screen.TwipsPerPixelX ne sont pas déclarer du moin les hdc... alors que si, alors peut tu remasteriser ton code pour vb.net plz
29 mars 2006 à 20:57
Et on pourrais encore aller plus loin en utilisant une tlb
@+
29 mars 2006 à 20:52
Eh ben en plus tu m'a appris un truc!!!!
Je ne savais pas que dans une décalaration d'API on pouvait remplacer le type attendu du paramètre par Any et utiliser l'API avec un tableau de valeurs. Merci pour l'info...
Pour ce qui est d'homologuer ton record, c'est quand même un peu facile les ":", non???
Enfin bref, on est là pour s'amuser et si d'autres on des solutions à proposer, ils sont les bienvenus!!!
29 mars 2006 à 20:39
Deja je vire la picture box je mets scalemode en pixel puis je degare point api j'ajoute des ":" et me voila avec 1 seule "ligne de code" (selon ton principe) :p :
Option Explicit
Private Declare Function GetCursorPos Lib "user32" (lpPoint As Any) As Long
Private Declare Function GetWindowDC Lib "user32" (ByVal HWnd As Long) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Private Sub Timer1_Timer()
Dim Pt(1) As Long: GetCursorPos Pt(0): StretchBlt Me.hdc, 0, 0, Me.ScaleWidth, Me.ScaleHeight, GetWindowDC(0), Pt(0) - 15, Pt(1) - 15, 30, 30, &HCC0020
End Sub
@+
29 mars 2006 à 16:15
C'est simple, on récupère la position du curseur et on dessine en agrandi le rectangle autour de cette position dans une PictureBox...
29 mars 2006 à 16:01
Sinon un petit commentaire quand même pour 2 lignes :D