StretchBlt et Scale [Résolu]

Signaler
Messages postés
89
Date d'inscription
dimanche 12 novembre 2000
Statut
Membre
Dernière intervention
29 mars 2013
-
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
-
Bonjours à tous,


J'ai un problême que Jmfmarques a gentiment essayé de m'aider à résoudre (voir



http://www.vbfrance.com/infomsg_STRETCHBLT_955524.aspx#11)  

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,


Picture2.hdc, 0, 0, Picture2.Width, Picture2.Height, vbSrcCopy) 


Picture1.Circle (HScroll1.Value, 10), 5


End Sub


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.

8 réponses

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
29
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.

Daniel
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
29
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

End Sub

Daniel
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
26
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.
Messages postés
89
Date d'inscription
dimanche 12 novembre 2000
Statut
Membre
Dernière intervention
29 mars 2013

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.
@+
Messages postés
89
Date d'inscription
dimanche 12 novembre 2000
Statut
Membre
Dernière intervention
29 mars 2013

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 ... :)

En tous cas merci à toi pour ton aide.
@+
Messages postés
89
Date d'inscription
dimanche 12 novembre 2000
Statut
Membre
Dernière intervention
29 mars 2013

Merci beaucoup Gobillot, je m'empresse d'essayer ça et je reviens te dire ce qu j'en pense.
Merci pour l'effort

@+
Messages postés
89
Date d'inscription
dimanche 12 novembre 2000
Statut
Membre
Dernière intervention
29 mars 2013

Merci ,Merci ,Merci beaucoup Gobillot,,

J'aurais pas fais mieux ..... LOL

C'est exactement ce qu'il me fallait !!!

Pour l'instant j'ai fais qu'un copier/coller et ça marche nickel , maintenant je vais décortiquer tout ça et APPRENDRE .


T'es un chef .


Encore un grand MERCI ,tu m'enléve un tronc d'arbre du pied.


@+ et bonne prog !!
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
possible aussi de régler ton SetStretchBltMode  sur STRETCH_HALFTONE  (par exemple)

pour améliorer le rendu

Renfield
Admin CodeS-SourceS- MVP Visual Basic