StretchBlt et Scale

Résolu
cs_epson1 Messages postés 89 Date d'inscription dimanche 12 novembre 2000 Statut Membre Dernière intervention 29 mars 2013 - 6 juin 2007 à 18:01
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 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



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

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

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

End Sub

Daniel
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
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.
0
cs_epson1 Messages postés 89 Date d'inscription dimanche 12 novembre 2000 Statut Membre Dernière intervention 29 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.
@+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_epson1 Messages postés 89 Date d'inscription dimanche 12 novembre 2000 Statut Membre Dernière intervention 29 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 ... :)

En tous cas merci à toi pour ton aide.
@+
0
cs_epson1 Messages postés 89 Date d'inscription dimanche 12 novembre 2000 Statut Membre Dernière intervention 29 mars 2013
6 juin 2007 à 21:02
Merci beaucoup Gobillot, je m'empresse d'essayer ça et je reviens te dire ce qu j'en pense.
Merci pour l'effort

@+
0
cs_epson1 Messages postés 89 Date d'inscription dimanche 12 novembre 2000 Statut Membre Dernière intervention 29 mars 2013
6 juin 2007 à 21:12
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 !!
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 juin 2007 à 09:23
possible aussi de régler ton SetStretchBltMode  sur STRETCH_HALFTONE  (par exemple)

pour améliorer le rendu

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
Rejoignez-nous