Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Décalage image/pointeur dans StretchBlt

2 réponses
Avatar
Charles Cournault
Bonsoir,
Je cherche à faire un zoom d'une zone centrée sur le pointeur.
J'utilise le bout de code suivant :

Call GetCursorPos(lhpst) 'Déterminer les coordonnées du pointeur
picture1.Cls
Z = 2 'Définir la valeur du Zoom
Call StretchBlt(picture1.hdc, 0, 0, 100,100, _
Me.hdc, lhpst.x - 100 / Z, lhpst.y - 100 / Z, 100 / Z, 100 / Z, SRCCOPY)

'NB : Picture1 a une taille fixe de 1500/1500 twips soit 100/100 pixels

Ca marche bien... sauf que je suis décalé !
Ce n'est pas l'image sous le pointeur qui s'affiche, et ça décale encore si
je déplace ma UserForm.

Je pensais que les paramètres xSrc et ySrc de la fonction StretchBlt étaient
les coordonnées
haut/gauche de l'image source (donc la position du pointeur - 1/2 de la
taille de l'image source)

Qu'en est-il exactement et comment corriger ce décalage ?

2 réponses

Avatar
Christophe
Bonjour

Comment le DC est-il mappé ?( Me.hdc )
lhpst doit être exprimé en coordonnées logique
du DC. ici tu l'exprimes en pixel donc on doit avoir
picture1.scalemode=pixel. qui correspont au mode de mapping MM_TEXT
(une unité logique = une unité de périphérique) avec origine en haut à
gauche.

Pour passer d'unité logique en unité de periphérique et inversement utilises
les fonctions API DpToLp et LpToDp.

Attention getcurseurpos donne les coordonnées sur l'ecran, ce qui n'a rien à
voir avec les coordonnées client d'un pictureBox

utilise getclientrect pour obtenir le rectangle client de ton controle
utilise clienttoscreen et screentoclient pour passer d'un systeme à l'autre.

Pour évité se genre de pbs j'utilise mouse_down sur le pictureBox et je
récupère X et Y attention à convertir en long pour utilisation dans les API.

Christophe VERGON

"Charles Cournault" a écrit dans le message de
news: 3fd7995f$0$244$
Bonsoir,
Je cherche à faire un zoom d'une zone centrée sur le pointeur.
J'utilise le bout de code suivant :

Call GetCursorPos(lhpst) 'Déterminer les coordonnées du pointeur
picture1.Cls
Z = 2 'Définir la valeur du Zoom
Call StretchBlt(picture1.hdc, 0, 0, 100,100, _
Me.hdc, lhpst.x - 100 / Z, lhpst.y - 100 / Z, 100 / Z, 100 / Z, SRCCOPY)

'NB : Picture1 a une taille fixe de 1500/1500 twips soit 100/100 pixels

Ca marche bien... sauf que je suis décalé !
Ce n'est pas l'image sous le pointeur qui s'affiche, et ça décale encore


si
je déplace ma UserForm.

Je pensais que les paramètres xSrc et ySrc de la fonction StretchBlt


étaient
les coordonnées
haut/gauche de l'image source (donc la position du pointeur - 1/2 de la
taille de l'image source)

Qu'en est-il exactement et comment corriger ce décalage ?






Avatar
Charles Cournault
Merci pour tes pistes
Il s'avère que la première fut la plus intéressante

J'ai ajouté : HdcEcran = GetDC(0)
que j'utilise dans StretchBlt
et j'ai donc les coordonnées de ma souris par rapport à l'écran

Call GetCursorPos(lhpst)
picture1.Cls
Z = 2
Call StretchBlt(picture1.hdc, 0, 0, 100,100, _
HdcEcran , lhpst.x - 100 / Z, lhpst.y - 100 / Z, 100 / Z, 100 / Z,
SRCCOPY)

Call DeleteDC(HdcEcran)

Encore merci

Charles

"Christophe" a écrit dans le message de news:
br9e1c$kqs$
Bonjour

Comment le DC est-il mappé ?( Me.hdc )
lhpst doit être exprimé en coordonnées logique
du DC. ici tu l'exprimes en pixel donc on doit avoir
picture1.scalemode=pixel. qui correspont au mode de mapping MM_TEXT
(une unité logique = une unité de périphérique) avec origine en haut à
gauche.

Pour passer d'unité logique en unité de periphérique et inversement


utilises
les fonctions API DpToLp et LpToDp.

Attention getcurseurpos donne les coordonnées sur l'ecran, ce qui n'a rien


à
voir avec les coordonnées client d'un pictureBox

utilise getclientrect pour obtenir le rectangle client de ton controle
utilise clienttoscreen et screentoclient pour passer d'un systeme à


l'autre.

Pour évité se genre de pbs j'utilise mouse_down sur le pictureBox et je
récupère X et Y attention à convertir en long pour utilisation dans les


API.

Christophe VERGON

"Charles Cournault" a écrit dans le message de
news: 3fd7995f$0$244$
> Bonsoir,
> Je cherche à faire un zoom d'une zone centrée sur le pointeur.
> J'utilise le bout de code suivant :
>
> Call GetCursorPos(lhpst) 'Déterminer les coordonnées du pointeur
> picture1.Cls
> Z = 2 'Définir la valeur du Zoom
> Call StretchBlt(picture1.hdc, 0, 0, 100,100, _
> Me.hdc, lhpst.x - 100 / Z, lhpst.y - 100 / Z, 100 / Z, 100 / Z, SRCCOPY)
>
> 'NB : Picture1 a une taille fixe de 1500/1500 twips soit 100/100 pixels
>
> Ca marche bien... sauf que je suis décalé !
> Ce n'est pas l'image sous le pointeur qui s'affiche, et ça décale encore
si
> je déplace ma UserForm.
>
> Je pensais que les paramètres xSrc et ySrc de la fonction StretchBlt
étaient
> les coordonnées
> haut/gauche de l'image source (donc la position du pointeur - 1/2 de la
> taille de l'image source)
>
> Qu'en est-il exactement et comment corriger ce décalage ?
>
>
>
>