Problème get pixel stupide vb [Résolu]

Signaler
Messages postés
286
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
16 juillet 2007
-
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
-
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

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

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 119 internautes nous ont dit merci ce mois-ci

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

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 119 internautes nous ont dit merci ce mois-ci

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
26
les unités sont en pixels donc tu dépasse de ta Forme.

Daniel
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
103
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
Messages postés
2169
Date d'inscription
vendredi 20 avril 2001
Statut
Membre
Dernière intervention
30 juin 2009
8
l'origine de la Form se trouve au coin haut / gauche et non bas / gauche il faut peut être des signes -

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

Daniel
Messages postés
286
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
16 juillet 2007

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
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
103
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
Messages postés
286
Date d'inscription
jeudi 2 janvier 2003
Statut
Membre
Dernière intervention
16 juillet 2007

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