Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
2 juil. 2007 à 06:22
djgab21
Messages postés66Date d'inscriptionvendredi 15 juin 2007StatutMembreDernière intervention19 mai 2011
-
4 avril 2008 à 16:16
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
djgab21
Messages postés66Date d'inscriptionvendredi 15 juin 2007StatutMembreDernière intervention19 mai 2011 4 avril 2008 à 16:16
Pas mal 8/10
BERGOUGNOUX
Messages postés40Date d'inscriptionmercredi 14 septembre 2005StatutMembreDernière intervention16 mars 2008 7 août 2007 à 10:03
C'est pas mal mais un peu lent... tu devrais réaliser ton prog en utilisant les APIs. Je mets 9/10 pour l'encouragement xD...!
XelectroX
Messages postés209Date d'inscriptionsamedi 11 novembre 2000StatutMembreDernière intervention 6 novembre 2009 6 juil. 2007 à 23:25
Juste un petit détail, je pense qu'une source comme celle-ci serait mieux avec une capture ;). lol
@++
neamar
Messages postés26Date d'inscriptionvendredi 9 septembre 2005StatutMembreDernière intervention12 avril 2009 4 juil. 2007 à 22:32
Oui, c'est vrai PCPT..j'ai juste utilisé cette source dans une appli et je l'ai copié collée ici..
Dans ce cas, il vaudrait mieux remplacer :
Me.Line (X1, Y1)-(X1 + X2, Y1 + Y2), RGB(192, 192, 192), B
par :
bord_X=x1+x2
bord_Y=y1+y2
couleur=RGB(192,192,192)
for x=x1 to bord_X
SetPixel Me_DC,x,Y1,Couleur
SetPixe Me_DC,X,Bord_Y,Couleur
next
for y=y1 to Bord_Y
SetPixel Me_DC,X1,Y,Couleur
SetPixe Me_DC,Bord_X,Y,Couleur
next
Voili voilou, c'est plus rapide qu'un object.line...et ca fonctionne avec tout les contrôles ayant un hwnd.
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 4 juil. 2007 à 22:18
bien plus rapide oui ;)
nb neamar -> hdc en param long ok mais avec un me.line à la fin çà colle plus trop...
l'objet en param est le plus approprié
++
neamar
Messages postés26Date d'inscriptionvendredi 9 septembre 2005StatutMembreDernière intervention12 avril 2009 4 juil. 2007 à 21:56
J'oubliais, voilà le code de la fonction Min : (pas forcément optimisé, mais on s'en fiche :)
'Renvoie le minimum entre deux nombres...
Public Function Min(nb1 As Long, nb2 As Long) As Long
If nb1 < nb2 Then
Min = nb1
Else
Min = nb2
End If
End Function
neamar
Messages postés26Date d'inscriptionvendredi 9 septembre 2005StatutMembreDernière intervention12 avril 2009 4 juil. 2007 à 21:55
Dans le but d'améliorer cette source, voici quelques points :
-Utilise GetPixel (http://docvb.free.fr/apidetail.php?idapi=150 )
-Utilise SetPixel (http://docvb.free.fr/apidetail.php?idapi=149) -Crée une fonction Min, et tu n'as pas besoin de tester V<0 puisque c'est impossible avec les opérations que tu effectues.
-Au lieu de faire 4 line, fais en une seule avec l'argument B (cf aide de line sur VB)
Voilà le résultat : plus rapide, plus concis, plus clair...et plus agréable !
Private Sub Glass(X1 As Long, Y1 As Long, X2 As Long, Y2 As Long, Optional Me_DC As Long)
Dim X As Long, Y As Long, P As Byte, NV As Byte, V As Long, T As Long
Dim iRGB As vRGB
If Me_DC 0 Then Me_DC Me.hDC
For Y = 0 To 10
For X = X1 To X1 + X2
'Haut
V = GetPixel(Me_DC, X, Y1 + Y)
CopyMemory iRGB, V, LenB(iRGB)
iRGB.R = Int(Min(iRGB.R + (15 - Y) * (10 - Y / 2), 255))
iRGB.G = Int(Min(iRGB.G + (15 - Y) * (10 - Y / 2), 255))
iRGB.B = Int(Min(iRGB.B + (15 - Y) * (10 - Y / 2), 255))
SetPixel Me_DC, X, Y1 + Y, RGB(iRGB.R, iRGB.G, iRGB.B)
Next
Next
For Y = 11 To Y2 - 5
For X = X1 To X1 + X2
V = GetPixel(Me_DC, X, Y1 + Y)
CopyMemory iRGB, V, LenB(iRGB)
iRGB.R = Int(Min(iRGB.R + 20, 255))
iRGB.G = Int(Min(iRGB.G + 20, 255))
iRGB.B = Int(Min(iRGB.B + 20, 255))
SetPixel Me_DC, X, Y1 + Y, RGB(iRGB.R, iRGB.G, iRGB.B)
Next
Next
T = 2
For Y = Y2 - 5 To Y2
T = T + 2
For X = X1 To X1 + X2
V = GetPixel(Me_DC, X, Y1 + Y)
CopyMemory iRGB, V, LenB(iRGB)
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 3 juil. 2007 à 19:50
le résultat rend vraiment pas mal ;)
dommage que çà soit si long même compilé
cf précédents comms
tu prévois de mettre ce code à jour?
++
wtor
Messages postés59Date d'inscriptiondimanche 23 novembre 2003StatutMembreDernière intervention18 mars 2011 3 juil. 2007 à 18:20
merci pour vos remarques
et merci VBGenesis pour le 8 points
VBGenesis
Messages postés292Date d'inscriptionsamedi 25 février 2006StatutMembreDernière intervention22 février 2009 3 juil. 2007 à 15:13
C'est assez sympa comme effet mais c'est vrai que c'est un peu lent... je met 8/10 et t'encourage à faire ça en API comme l'a dit Renfield. Sinon pour une appli aussi graphique une petite capture serait la bienvenue!
VBGenesis
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 2 juil. 2007 à 06:22
utilises les APIs pour faire ça, ce sera instantanné...
.Point et .Pset sont a n'utiliser que si tu n'as qu'un seul pixel a traiter, deux ou trois, tout au plus
4 avril 2008 à 16:16
7 août 2007 à 10:03
6 juil. 2007 à 23:25
@++
4 juil. 2007 à 22:32
Dans ce cas, il vaudrait mieux remplacer :
Me.Line (X1, Y1)-(X1 + X2, Y1 + Y2), RGB(192, 192, 192), B
par :
bord_X=x1+x2
bord_Y=y1+y2
couleur=RGB(192,192,192)
for x=x1 to bord_X
SetPixel Me_DC,x,Y1,Couleur
SetPixe Me_DC,X,Bord_Y,Couleur
next
for y=y1 to Bord_Y
SetPixel Me_DC,X1,Y,Couleur
SetPixe Me_DC,Bord_X,Y,Couleur
next
Voili voilou, c'est plus rapide qu'un object.line...et ca fonctionne avec tout les contrôles ayant un hwnd.
4 juil. 2007 à 22:18
nb neamar -> hdc en param long ok mais avec un me.line à la fin çà colle plus trop...
l'objet en param est le plus approprié
++
4 juil. 2007 à 21:56
'Renvoie le minimum entre deux nombres...
Public Function Min(nb1 As Long, nb2 As Long) As Long
If nb1 < nb2 Then
Min = nb1
Else
Min = nb2
End If
End Function
4 juil. 2007 à 21:55
-Utilise GetPixel (http://docvb.free.fr/apidetail.php?idapi=150 )
-Utilise SetPixel (http://docvb.free.fr/apidetail.php?idapi=149)
-Crée une fonction Min, et tu n'as pas besoin de tester V<0 puisque c'est impossible avec les opérations que tu effectues.
-Au lieu de faire 4 line, fais en une seule avec l'argument B (cf aide de line sur VB)
Voilà le résultat : plus rapide, plus concis, plus clair...et plus agréable !
Private Sub Glass(X1 As Long, Y1 As Long, X2 As Long, Y2 As Long, Optional Me_DC As Long)
Dim X As Long, Y As Long, P As Byte, NV As Byte, V As Long, T As Long
Dim iRGB As vRGB
If Me_DC 0 Then Me_DC Me.hDC
For Y = 0 To 10
For X = X1 To X1 + X2
'Haut
V = GetPixel(Me_DC, X, Y1 + Y)
CopyMemory iRGB, V, LenB(iRGB)
iRGB.R = Int(Min(iRGB.R + (15 - Y) * (10 - Y / 2), 255))
iRGB.G = Int(Min(iRGB.G + (15 - Y) * (10 - Y / 2), 255))
iRGB.B = Int(Min(iRGB.B + (15 - Y) * (10 - Y / 2), 255))
SetPixel Me_DC, X, Y1 + Y, RGB(iRGB.R, iRGB.G, iRGB.B)
Next
Next
For Y = 11 To Y2 - 5
For X = X1 To X1 + X2
V = GetPixel(Me_DC, X, Y1 + Y)
CopyMemory iRGB, V, LenB(iRGB)
iRGB.R = Int(Min(iRGB.R + 20, 255))
iRGB.G = Int(Min(iRGB.G + 20, 255))
iRGB.B = Int(Min(iRGB.B + 20, 255))
SetPixel Me_DC, X, Y1 + Y, RGB(iRGB.R, iRGB.G, iRGB.B)
Next
Next
T = 2
For Y = Y2 - 5 To Y2
T = T + 2
For X = X1 To X1 + X2
V = GetPixel(Me_DC, X, Y1 + Y)
CopyMemory iRGB, V, LenB(iRGB)
iRGB.R = Int(Min(iRGB.R + (T + 2) * (T / 2), 255))
iRGB.G = Int(Min(iRGB.G + (T + 2) * (T / 2), 255))
iRGB.B = Int(Min(iRGB.B + (T + 2) * (T / 2), 255))
V = iRGB.G + (T + 2) * (T / 2)
SetPixel Me_DC, X, Y1 + Y, RGB(iRGB.R, iRGB.G, iRGB.B)
Next
Next
Me.Line (X1, Y1)-(X1 + X2, Y1 + Y2), RGB(192, 192, 192), B
End Sub
Sinon, l'effet est très sympa..je l'ai déjà réutilisé !
3 juil. 2007 à 20:16
3 juil. 2007 à 20:11
Ca veux juste réussir que pendant que je préparai ma réponse tu poste également. Hi
A+
3 juil. 2007 à 20:08
Si tu veux quelque idées avec API, voir l'excellente source de PCPT qui (entre-autre) traite de l'opacité de la forme et d'un texte. Beaucoup d'autre idées sont aussi très bien exposées.
Suivre ce lien..
http://www.vbfrance.com/codes/ALERTER-UTILISATEUR-SANS-PASSER-HORRIBLE-MSGBOX-ERRORPROVIDER-OCX_42822.aspx
A+
3 juil. 2007 à 19:50
dommage que çà soit si long même compilé
cf précédents comms
tu prévois de mettre ce code à jour?
++
3 juil. 2007 à 18:20
et merci VBGenesis pour le 8 points
3 juil. 2007 à 15:13
VBGenesis
2 juil. 2007 à 06:22
.Point et .Pset sont a n'utiliser que si tu n'as qu'un seul pixel a traiter, deux ou trois, tout au plus