Une loupe en 2 lignes de code!!!

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 582 fois - Téléchargée 29 fois

Contenu du snippet

Record à battre 2 lignes de code pour une loupe!!!

Bon, c'est sans compter les déclarations d'API mais c'est pas mal quand même...

Juste 3 API, un Timer (intervalle = 200), une PictureBox et c'est parti, facile non???

Source / Exemple :


Option Explicit

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) 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 Type POINTAPI
    X As Long
    Y As Long
End Type

Dim Pt As POINTAPI

Private Sub Timer1_Timer()

   GetCursorPos Pt
   StretchBlt Picture1.hdc, 0, 0, Picture1.Width / Screen.TwipsPerPixelX, Picture1.Height / Screen.TwipsPerPixelY, GetWindowDC(0), Pt.X - 15, Pt.Y - 15, 30, 30, &HCC0020

End Sub

A voir également

Ajouter un commentaire Commentaires
Messages postés
28
Date d'inscription
dimanche 2 janvier 2005
Statut
Membre
Dernière intervention
5 mai 2014

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
Messages postés
473
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

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.
Messages postés
117
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
3 novembre 2007
1
Merci
t'en fait pas pour la clarté, si je comprend pas tout maintenant je comprendrais plus tard, mais c'est deja plus clair ^^
Messages postés
432
Date d'inscription
samedi 18 mai 2002
Statut
Modérateur
Dernière intervention
17 février 2014

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...
Messages postés
117
Date d'inscription
jeudi 17 juin 2004
Statut
Membre
Dernière intervention
3 novembre 2007
1
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
Afficher les 19 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.