Problème de dessin après un zoom

Résolu
Shadowbiwan Messages postés 5 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 30 août 2009 - 23 sept. 2006 à 16:25
Shadowbiwan Messages postés 5 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 30 août 2009 - 23 sept. 2006 à 19:32
Bonjour.
Quelques informations sur mon programme:
Après la demande d'un ami, j'ai voulu essayer de creer un Paint ammélioré. Pour y arriver, j'ai voulu, pour commencer, recreer Paint (en VB6) pour essayer de l'amméliorer. J'ai donc actuellement, pour ce qui est des méthodes graphiques, déjà réussi à programmer la sélection (avec les APIs BitBlt et TransparentBlt), la gomme (avec la méthode Line ou l'API rectangle), le pot de peinture (avec l'API ExtFloodFill), la pipette (avec la méthode Point), la loupe (avec PaintPicture), le crayon (avec la méthode Line), la brosse (avec la méthode Line ou l'API rectangle, l'API Ellipse, etc), le sprai (avec la méthode pset), le texte (avec la méthode Print), la ligne (avec la méthode Line), le rectangle (avec la méthode Line ou l'API rectangle), le poligone (avec la méthode Line), l'ellipse (avec l'API Ellipse) et le rectangle arrondi (avec l'API RoundRect). J'ai trouvé le code pour les lignes courbes mais je ne l'ai pas encore implanté. J'ai un petit problème au niveau de la gomme et de la brosse (le même problème que le crayon avec la méthode pset) mais ce n'est pas ma priorité.

Mon problème (enfin :p) :
Mon problème vien du zoom. Mon zoom marche très bien mais le problème vien des méthodes graphiques et APIs. En effet, alors que, en utilisant la propriété PaintPicture de ma PictureBox, les pixels qui "mesuraient" avant 1 pixel, en "mesurent" maintenant 2; la taille des pixels que je trace (par exemple avec la méthode Line) ne mesurent qu'un pixel. Je voudrais donc savoir si il y avait un moyen pour "redéfinir" la taille d'un pixel ou de faire en sorte que 1 pixel dans la réalité fasse 2 pixels dans ma PictureBox.

Ce que j'ai essayé :
   -J'ai déjà essayé d'utiliser la méthode Line pour représenter un carré de 2 pixels comme il suit (il y a déjà eu le zoom x2 ):





<hr />

Private Sub PictureZoom_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    
    'Si on ne clique pas, sortir
    If Button = 0 Then Exit Sub
    
    'Je converti en pixel pour etre sur que je pourrais dézoomé par 2
    X1 = X / Screen.TwipsPerPixelX
    Y1 = Y / Screen.TwipsPerPixelY
    
    'je cherche la coordonnée gauche du carré que je vai dessiner. Ce carré représentera
    'donc 1 pixel une fois dézoomé
    If Right(X1 / 2, 2) = ",5" Then
        X2 = X1 - 1
    Else
        X2 = X1
    End If
    'je cherche la coordonnée haute du carré que je vai dessiner. Ce carré représentera
    'donc 1 pixel une fois dézoomé
    If Right(Y1 / 2, 2) = ",5" Then
        Y2 = Y1 - 1
    Else
        Y2 = Y1
    End If
    'je reconvertit en twips
    X3 = PictureZoom.ScaleX(X2, vbPixels, vbTwips)
    Y3 = PictureZoom.ScaleY(Y2, vbPixels, vbTwips)
    'et je dessine le carré
    PictureZoom.Line (X3, Y3)-Step(15, 15), ShapeCouleur(Button).BackColor, BF

End sub
<hr />
   - j'avais aussi essayé de dessiner sur une autre PictureBox que je rezoomait mais c'était trop lent

J'espère donc que vous pourrez m'aider.
En vous remerciant de m'accorder de votre temps et en espérant ne pas avoir été trop long.
Cordialement, Shadowbiwan.

4 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
23 sept. 2006 à 16:56
Arf, mélanger les fonctions de l'API et les méthodes VB pour le tracé, c'est jamais une bonne chose !

Tu aurais dû tout faire par API, ca aurait été bien plus rapide, et surtout, tu aurais un ensemble cohérent !

Voir ma source de création d'icône par exemple pour voir comment gérer un zoom tout en continuant à tracer en mode zoom (tu peux d'ailleurs t'inspirer des outils que je propose dans mon soft, et remplacer les tiens : ils utilisent les API Windows uniquement).
3
Shadowbiwan Messages postés 5 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 30 août 2009
23 sept. 2006 à 17:19
Je vais arrangé l'histoire des apis, merci pour l'information .
J'ai quelque peu regardé ton code que j'ai trouvé très compliqué surtout pour la compréhension. Pas que se soit mal commenté, plutôt à cause des aller-retour entre modules de classe, rechercher, forms... à la fin j'en oublie ce que je cherchais :p
Sinon ton programme peut peut être dessiner en zoom mais il ne résous malheureusement pas le problème du "crayon avec la méthode pset" meme si ça ne se voit pas trop du fait qu'un programme sur les icones travaille forcément sur un nombre de pixel réduit.
Je vais décortiquer plus ton programme car je pense pouvoir apprendre beaucoup.
Merci de m'avoir répondu,
Shadowbiwan.
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
23 sept. 2006 à 17:24
En fait, mon prog tu peux très facilement l'adapter pour un paint élaborée : il suffit de changer la taille du calque...

Mon prog n'était pas fait pour être facile à comprendre, mais pour faire un prog complet. Il contient quelques librairies que j'ai mise en source complète, telle que la gestion d'image et le visualisateur d'icône, qui sont plus faciles à comprendre en dehors du prog original.

Le problème que tu rencontre, avec le PSet, c'est qu'il ne dessine qu'un point ! Il te faut plutôt utiliser un rectangle à tracer que tu peux agrandir ou retrécir à volonté. (surtout que le PSet est TRES LENT !).
0
Shadowbiwan Messages postés 5 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 30 août 2009
23 sept. 2006 à 19:32
J'ai mieu regarder ton programme et j'ai compris pas mal de choses et surtout, du moins pour le crayon, sa marche !!!!!!!!Merci!!!!!!!  comme tes deux réponses sont bonnes, je sais pas la quelle acceptée :p on dit la première est toujours la bonne donc c'est tout choisis.

Encore merci DARKSIDIOUS pour ton aide,
Shadowbiwan.

PS: le code pour le crayon sur la picturebox zoomée :





<hr />

'A savoir : Il y a deux picturebox : PictureDessin, la PB où on dessine quand il n'y a


'pas de zoom et la PB PictureZoom qui apparait quand on zoom.




'dans un module




Public Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long
Public Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Public 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
Public Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long)
As Long




Type POINTAPI
    x As Long
    y As Long

End Type





Public pos As POINTAPI



'dans une form

Private Sub PictureZoom_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)




    'crayon
    'Je converti en pixel pour etre sur que je pourrais dézoomé par 2
    X1 = x / Screen.TwipsPerPixelX
    Y1 = y / Screen.TwipsPerPixelY
    
    'je cherche la coordonnée gauche du carré que je vai dessiner. Ce carré représentera
    'donc 1 pixel une fois dézoomé
    If Right(X1 / 2, 2) = ",5" Then
        X2 = X1 - 1
    Else
        X2 = X1
    End If
    'je cherche la coordonnée haute du carré que je vai dessiner. Ce carré représentera
    'donc 1 pixel une fois dézoomé
    If Right(Y1 / 2, 2) = ",5" Then
        Y2 = Y1 - 1
    Else
        Y2 = Y1
    End If
    
    'Creer un pixel aux coordonnées X, Y en pixel sur la PB d'arrière plan (soit x2 et y2)
    SetPixelV PictureDessin.hdc, X2 / 2, Y2 / 2, ShapeCouleur(Button).BackColor
    
    'Je définie la valeur actuelle de X et Y en pixels pour pouvoir les réutiliser
    X3 = X2
    Y3 = Y2

    'Affiche sur la PB au 1er plan l'image agrandie de la PB du second plan
    'Pareil que la propriété PaintPicture mais en plus rapide
    StretchBlt PictureZoom.hdc, 0, 0, PictureZoom.Width / Screen.TwipsPerPixelX, _ PictureZoom.Height / Screen.TwipsPerPixelY, PictureDessin.hdc, 0, 0, _ (PictureDessin.ScaleWidth / Screen.TwipsPerPixelX) / 2, _
(PictureDessin.ScaleHeight / Screen.TwipsPerPixelY) / 2, vbSrcCopy
    
End Sub
Private Sub PictureZoom_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)


    If Button = 0 Then Exit Sub

    'crayon
    'Je converti en pixel pour etre sur que je pourrais dézoomé par 2
    X1 = x / Screen.TwipsPerPixelX
    Y1 = y / Screen.TwipsPerPixelY
    
    'je cherche la coordonnée gauche du carré que je vai dessiner. Ce carré représentera
    'donc 1 pixel une fois dézoomé
    If Right(X1 / 2, 2) = ",5" Then
        X2 = X1 - 1
    Else
        X2 = X1
    End If
    'je cherche la coordonnée haute du carré que je vai dessiner. Ce carré représentera
    'donc 1 pixel une fois dézoomé
    If Right(Y1 / 2, 2) = ",5" Then
        Y2 = Y1 - 1
    Else
        Y2 = Y1
    End If
    
    'Définie les anciennes coordonnées courantes a celles écrites dans les
    'variables X3 et X3
    MoveToEx PictureDessin.hdc, X3 / 2, Y3 / 2, pos
    
    'Creer une ligne à partir des anciennes coordonnées courantes
    LineTo PictureDessin.hdc, X2 / 2, Y2 / 2

    'Rafraichir et enregistrer l'image courante au cas ou
    PictureDessin.Refresh
    PictureDessin.Picture = PictureDessin.Image    
    'Je redéfinie la valeur actuelle de X et Y en pixels pour pouvoir les réutiliser
    X3 = X2
    Y3 = Y2

    'Affiche sur la PB au 1er plan l'image agrandie de la PB du second plan
    'Pareil que la propriété PaintPicture mais en plus rapide
    StretchBlt PictureZoom.hdc, 0, 0, PictureZoom.Width / Screen.TwipsPerPixelX, _ PictureZoom.Height / Screen.TwipsPerPixelY, PictureDessin.hdc, 0, 0, _ (PictureDessin.ScaleWidth / Screen.TwipsPerPixelX) / 2, _
(PictureDessin.ScaleHeight / Screen.TwipsPerPixelY) / 2, vbSrcCopy
    
End Sub
Private Sub PictureZoom_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)


    IfButton = 0Then Exit Sub

    'crayon
    'Je converti en pixel pour etre sur que je pourrais dézoomé par 2
    X1 = x / Screen.TwipsPerPixelX
    Y1 = y / Screen.TwipsPerPixelY
    
    'je cherche la coordonnée gauche du carré que je vai dessiner. Ce carré représentera
    'donc 1 pixel une fois dézoomé
    If Right(X1 / 2, 2) = ",5" Then
        X2 = X1 - 1
    Else
        X2 = X1
    End If
    'je cherche la coordonnée haute du carré que je vai dessiner. Ce carré représentera
    'donc 1 pixel une fois dézoomé
    If Right(Y1 / 2, 2) = ",5" Then
        Y2 = Y1 - 1
    Else
        Y2 = Y1
    End If
    
    'Définie les anciennes coordonnées courantes a celles écrites dans les
    'variables X3 et X3
    MoveToEx PictureDessin.hdc, X3 / 2, Y3 / 2, pos
    
    'Creer une ligne à partir des anciennes coordonnées courantes
    LineTo PictureDessin.hdc, X2 / 2, Y2 / 2

    'Rafraichir et enregistrer l'image courante au cas ou
    PictureDessin.Refresh
    PictureDessin.Picture = PictureDessin.Image    
    'Je redéfinie la valeur actuelle de X et Y en pixels pour pouvoir les réutiliser
    X3 = X2
    Y3 = Y2

    'Affiche sur la PB au 1er plan l'image agrandie de la PB du second plan
    'Pareil que la propriété PaintPicture mais en plus rapide
    StretchBlt PictureZoom.hdc, 0, 0, PictureZoom.Width / Screen.TwipsPerPixelX, _ PictureZoom.Height / Screen.TwipsPerPixelY, PictureDessin.hdc, 0, 0, _ (PictureDessin.ScaleWidth / Screen.TwipsPerPixelX) / 2, _
(PictureDessin.ScaleHeight / Screen.TwipsPerPixelY) / 2, vbSrcCopy
    
    PictureZoom.Picture = PictureZoom.Image
End Sub
0
Rejoignez-nous