cs_epson1
Messages postés89Date d'inscriptiondimanche 12 novembre 2000StatutMembreDernière intervention29 mars 2013
-
6 juin 2007 à 18:01
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
7 juin 2007 à 09:23
Bonjours à tous,
J'ai un problême que Jmfmarques a gentiment essayé de m'aider à résoudre (voir
mais je crois qu'il n'a pas compris d'ou venait le soucis.
J'ai planché pas mal de temps sur ses exemples,mais ça n'a rien résolu.
Je me permet donc de reposer la question en essayant d'être le plus clair possible.
J'ai Picture1 qui est vide et Picture2 qui contient une image + grande que Picture1.
Voila un example de mon code simplifié :
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 Form_Load()
HScroll1.Min = 0
HScroll1.Max = 30
Me.ScaleMode = 1
With Picture1
.ScaleMode = 1
.AutoRedraw = True
.AutoSize = False
.FillStyle = vbFSSolid
.FillColor = RGB(128, 128, 255)
End With
With Picture2
.ScaleMode = 1
.AutoRedraw = True
.AutoSize = True
.Picture = .Image
.Visible = False
End With
'Picture1.Scale (-30, 30)-(30, -30)
End Sub
Private Sub HScroll1_Scroll()
Dim Result As Long
Picture1.Cls
Result = StretchBlt(Picture1.hdc, ScaleX(HScroll1.Value, vbTwips, vbPixels), ScaleY(10, vbTwips, vbPixels), 1000, 1000,
Quand je bouge HScroll1, le centre du cercle et le coin haut gauche de l'image coincident en se déplaçant.Tout va bien.
Maintenant, si je réactive la ligne " Picture1.Scale (-30, 30)-(30, -30) ", le cercle est plus grand et se déplace + vite,
normal vu que les nouvelles coordonnées limitent le déplacement horizontal à 30.
Mais l'image continue à prendre pour point de départ le coin haut gauche de Picture1 et se deplace trés peu.Rien ne change.
C'est comme si StretchBlt continue à travailler en twip et ne prends pas en compte le changement de scale,alors que
le centre du cercle et le coin haut gauche de l'image devraient coincider en se déplaçant.C'est du moins ce que je voudrais.
Je précise que l'echelle en twip et le Scale (-30, 30)-(30, -30) sont necéssaires au reste du code.
J'en suis à me demander si il ne s'agit pas d'un bug de l'API !
Voila, j'espére avoir été assez clair et que tout est compréensible,et que surtout le problême apparait bien.
Si quelqu'un a la solution à ça, je suis vivement interressé .
Merci à tous ceux qui voudront bien m'aider.
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 6 juin 2007 à 18:48
Salut,
pas de bug de L'API, StretchBlt travaille en pixels comme le font toutes les APIs graphiques
point de départ 0,0 en haut à gauche et ton Scalemode n'est pas pris en compte
à toi de donner les bons paramètres en jouant avec les x et les y, et les width et height
en faisant la conversion avec le Scalemode User et les pixels standard.
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 6 juin 2007 à 20:02
Re,
parce que je sais pas trop ce que tu veux faire
bon je fais un essai
en supposant qu'il y a une HScroll et une VScroll
Dim W As Long
Dim H As Long
Private Sub Form_Load()
Picture1.ScaleMode = vbPixels
Picture2.ScaleMode = vbPixels
W = Picture1.ScaleWidth
H = Picture1.ScaleHeight
Picture1.Scale (-30, 30)-(30, -30)
End Sub
Private Sub HScroll1_Change()
Dim x As Long
Dim y As Long
x = W * (HScroll1.Value + 30) / 60
y = H * (VScroll1.Value + 30) / 60
Picture1.Cls
StretchBlt Picture1.hdc, x, y, W, H, Picture2.hdc, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, vbSrcCopy
Picture1.Circle (HScroll1.Value, -VScroll1.Value), 5
End Sub
Private Sub VScroll1_Change()
Dim x As Long
Dim y As Long
x = W * (HScroll1.Value + 30) / 60
y = H * (VScroll1.Value + 30) / 60
Picture1.Cls
StretchBlt Picture1.hdc, x, y, W, H, Picture2.hdc, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight, vbSrcCopy
Picture1.Circle (HScroll1.Value, -VScroll1.Value), 5
jmfmarques
Messages postés7668Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 6 juin 2007 à 19:22
Bonjour (et salut à Daniel),
Je t'ai parfaitement compris, epson1...
Comme Gobillot vient de le faire, je t'ai également rappelé que StrechtBlt travaille en Pixels et que les coordonnées de départ d'une pictureBix sont 0,0 (coin supérieur gauche du contrôle)
Tout le reste n'est (une fois de plus) que du calcul arithmétique (VB ne corrigera pas tes calculs ! Il les exécutera, tels que tu lui demandes de les faire).
Si tu as des difficultés avec le résiuktat obtenu avec les calculs que tu lui demandes de faire, tu auras exactement les mêmes difficultés en utilisant une feuille de papier millimétré et un crayon ... et VB n'est pour rien dans ton raisonnement ... il l'exécute sagement.
cs_epson1
Messages postés89Date d'inscriptiondimanche 12 novembre 2000StatutMembreDernière intervention29 mars 2013 6 juin 2007 à 19:24
Bien, bin je suis pas dans la M... avec tout ça.J'ai plus qu'a m'y mettre.
En tous cas, merci Gobillot pour ton aide, ça va me faire gagner du temps en recherches inutiles.
Bonne prog à tous.
@+
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_epson1
Messages postés89Date d'inscriptiondimanche 12 novembre 2000StatutMembreDernière intervention29 mars 2013 6 juin 2007 à 19:30
Salut Jmfmarques,
En fait c'est moi qui ne savais pas que le scalemode n'étais pas pris en compte par les APIs, par contre je savais qu'elles travaillaient en pixel.
On apprends tous les jours, la preuve ... :)