Problème get pixel stupide vb

Résolu
retaks666 Messages postés 286 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 16 juillet 2007 - 3 janv. 2005 à 17:19
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 - 3 janv. 2005 à 21:42
Bonjourn j'ai un problème: Je veux obtenir le code couleur d'une form, donc je procède ainsi:

MsgBox GetPixel(Me.hdc, 100, 100)

la ça marche, mais si je fait par exemple

MsgBox GetPixel(Me.hdc, 100, 300) ça ne marches pas.

Alors que les propriétés height et width de ma de ma form sont toutes
les deux a plus > 4000 et il n'y a aucun controles ou image . La
vraiment je vois pas AIDEZ MOI SVP!!!!!

10 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
3 janv. 2005 à 18:14
tu met Me.ScaleMode = vbPixels
les limites sont:
pour X de 0 à Me.ScaleWidth-1
pour Y de 0 à Me.ScaleHeight-1

tout autre valeur provoque une erreur

Daniel
3
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
3 janv. 2005 à 21:18
Public Sub transparenceformpicture(objet As Object, formcontenant As Form, Optional ByVal couleur As Long = -1)
Dim x As Long
Dim y As Long
Dim c As Long
Dim px As Long
Dim py As Long

If couleur = -1 Then
' le premier pixel est en position 0,0
couleur = GetPixel(objet.hdc, 0, 0)
End If

objet.ScaleMode = 3
objet.AutoRedraw = False
formcontenant.ScaleMode = 3


px = objet.Left
py = objet.Top
' je déplace l'objet pour rendre visible le dessous
' j'ajoute 2 parce que si pas de bordure ça plante
objet.Left = px + objet.Width + 2
' attendre pour que l'object se mette en place
DoEvents
For x = 0 To objet.ScaleWidth - 1
For y = 0 To objet.ScaleHeight
If GetPixel(objet.hdc, x, y) = couleur Then
' +2 c'est la bordure de l'object (dépend du BorderStyle)
c = GetPixel(formcontenant.hdc, (x + px + 2), (y + py + 2))
' il y a erreur si on est plus sur la Forme
If c = -1 Then MsgBox x & " " & y: Exit Sub
SetPixel objet.hdc, x, y, c
End If
Next y
Next x
' on remet l'object en place
objet.Left = px
End Sub

Daniel
3
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
3 janv. 2005 à 17:37
les unités sont en pixels donc tu dépasse de ta Forme.

Daniel
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
3 janv. 2005 à 17:39
Salut,



Si ton height et ton width sont supérieur à 4000, c'est soit que tu
travaille en twips (bizare, vu que les API n'accepte que des unités en
pixels, ou alors, ton getpixel ne renverra pas les couleurs aux mêmes
coordonnées qu'utilise VB !), soit ta feuille est trop petite, et donc
n'affiche pas les pixels que tu veux récupèrer.



Je te suggère d'utiliser ma classe de gestion d'image (voir dans mes
sources celle qui s'appelle DKS_Gestion_Image) : tu y gagneras pas mal
en rapidité (30x plus rapide en moyenne que GetPixel !), et peut-être
que ca résoluera ton problème.

DarK Sidious
0

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

Posez votre question
cs_ITALIA Messages postés 2169 Date d'inscription vendredi 20 avril 2001 Statut Membre Dernière intervention 30 juin 2009 9
3 janv. 2005 à 17:42
l'origine de la Form se trouve au coin haut / gauche et non bas / gauche il faut peut être des signes -

It@li@
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
3 janv. 2005 à 17:49
les valeurs négatives sont pas acceptées
dans le cas d'erreur GetPixel renvoie la constante CLR_INVALID qui est égale à -1

Daniel
0
retaks666 Messages postés 286 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 16 juillet 2007
3 janv. 2005 à 18:01
Et L'api get pixel accepte quoi comme valeur pour x et y ?

Note, j'ai aussi fait le test lors de l'évènement mousedown ((...), x as simple, y as simple)

msgbox getpixel(me.hdc, x,y) et ça marche pas.

je vais essayer ta source dark sidious
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
3 janv. 2005 à 18:05
L'api GetPixel demande des coordonnées en pixel, et te renverrant
la couleur correspondante au pixel donné. Si tu lui envoie des twips,
elle croiras que c'est des pixels !


DarK Sidious
0
retaks666 Messages postés 286 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 16 juillet 2007
3 janv. 2005 à 20:08
Bon voila ça marche, par contre j'ai un problème

en fait, mon but était de remplacer les pixels d'un objet par les
pixels d'en dessous de la forms, de façons a faire de la transparence
sur une couleur, j'ai donc fait cette fonction :


Public Sub transparenceformpicture(objet As Object, formcontenant As Form, Optional ByVal couleur As Long = -1)

If couleur -1 Then couleur GetPixel(objet.hdc, 1, 1) 'si la couleur
n'est pas modifiée, on prends la couleur du premier pixel

objet.ScaleMode = 3 'on met en pixel

objet.AutoRedraw = False

formcontenant.ScaleMode = 3

For X = 0 To objet.ScaleWidth - 1 'ici on commenceau premier pixel de la ligne x de l'objet

    For Y = 0 To objet.ScaleHeight 'ici on commenceau premier pixel de la colone y de l'objet

    If GetPixel(objet.hdc, X, Y) = couleur Then

    SetPixel objet.hdc, X, Y, GetPixel(formcontenant.hdc, (X + objet.ScaleLeft), (Y + objet.ScaleTop))

    End If

    Next Y

Next X

End Sub



mais évidemment ça ne marche pas...
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
3 janv. 2005 à 21:42
il est possible de ne pas déplacer l'object mais de le rendre invisible mais pour cela il faut l'AutoRedraw à True.

objet.AutoRedraw = True
objet.Visible = False
' le code de transparence
objet.Visible = True

Daniel
0
Rejoignez-nous