Attenuer des couleurs rgb

agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006 - 12 déc. 2005 à 17:50
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006 - 13 déc. 2005 à 19:20
Bonjour a tous,

je souhaiterais pouvoir attenué des couleurs.
J'ai un variable color qui à comme couleur Red mais je souhaiterais attenuer pour quel soit un peu moin flash.
Ya t'il une fonction en c# qui permette de faire çà.

Merci d'avance

24 réponses

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
12 déc. 2005 à 18:34
Essaie Color.IndianRed, qui est plus sobre ;)

Autrement, tu peux jouer avec les composantes R G B de la structure Color, pour arriver a quelquechose qui te convient mieux

Mx
0
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006
12 déc. 2005 à 19:29
en Fait je souhaiterais degradé n'importe quel couleur dans une textbox en mode horizontal.
Commencer en blanc puis aller vers la couleur.


Merci d'avance :)
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
12 déc. 2005 à 20:36
Pour faire du dégradé, il te faut utiliser LinearGradientBrush.

Cependant, il va falloir que tu te programmes ta propre TextBox pour faire ce que tu veux faire.

J'ai fait un essai en creant un controle héritant de la classe TextBox et en overridant les méthodes OnPaint et OnPaintBackground , mais rien de concluant, y'a bien un fond dégradé, mais ca bug avec le texte

En esperant que Sebmafate qui est bien plus a l'aise que moi avec les Custom Controls passe par ce sujet et t'apporte une solution...
Voire n'importe quel autre Csharpeur ;)

Mx
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
12 déc. 2005 à 20:47
Je me demande si il ne parlais pas plutôt d'une couleur par lettre, enf esant un dégradé.
D'où la question pour le faire sur Color.
Tu peux préciser ce que tu veux faire exactement agarcia_01 ?

/*
coq
MVP Visual C#
*/
0

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

Posez votre question
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
12 déc. 2005 à 21:07
Quoiqu'il en soit, je pense qu'on va bien se marrer

Mx
0
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006
12 déc. 2005 à 21:09
C'est bien ça que je veux MorpionMx quite a recréer un controle TextBox.
Apres pour la couleur du texte je la changerais en fonction de la couleur du degradé. Que dois je faire pour attirer sur mon probleme ce fameux Sebmafate :)?

Mais comment fait on pour le recréer ?

Merci d'avance
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
12 déc. 2005 à 21:22
Comme coq est la, y'a peut-etre plus besoin de seb
Rapidement, j'avais fait ca (mais ca n'est pas fonctionnel)


<HR>
using System;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Windows.Forms;

namespace WindowsApplication1
{

class
GradientTextBox :
TextBox
{

public GradientTextBox()
{

this.SetStyle(
ControlStyles.UserPaint,
true);
}


protected
override
void OnPaint(
PaintEventArgs e)
{

Graphics g = e.Graphics;

using (
LinearGradientBrush lgb =
new
LinearGradientBrush(
new
Rectangle(
new
Point(0, 0),
this.Size),
Color.White,
Color.IndianRed,
LinearGradientMode.Horizontal))
{
g.FillRectangle(lgb,
new
Rectangle(
new
Point(0, 0),
this.Size));
}
g.DrawString(
this.Text,
this.Font,
new
SolidBrush(
Color.Black), 0f, 0f);
}
}
}

<HR>

J'ai pas envie de passer en mode pessimiste, et te dire qu'il faudra que tu fasses un controle héritant de la classe Control, et reprogrammer le comportement d'un TextBox.
J'ai confiance envers le génie de mes camarades de csharpfr

Mx
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
12 déc. 2005 à 21:28
Si c'est ça pourtant..

public class MyTextBox : Control
{
public MyTextBox( ) : base( )
{
this.SetStyle( ControlStyles .UserPaint, true );
}


protected override void OnPaintBackground( PaintEventArgs e )
{
//base.OnPaintBackground( e );


LinearGradientBrush brush = new LinearGradientBrush( this.ClientRectangle, Color.Beige, Color.Pink, 45.0f );


e.Graphics.FillRectangle( brush, this.ClientRectangle );


brush.Dispose( );



}


protected override void OnResize( EventArgs e )
{
//base.OnResize( e );


this.Invalidate( );
}
}

Eventuellement ajoute le double buffer.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
12 déc. 2005 à 21:30
Oups j'ai pas testé la bonne version.. j'ai derivé de contrôle pour le test
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
12 déc. 2005 à 21:32
Oui, parce que la il faut reprogrammer tout le comportement du TextBox ensuite ^^

Mx
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
12 déc. 2005 à 21:51
Oui oui c'est pas la bonne soluce, je faisais des test en dérivant de Control pour voir la difference de comportement..

En plus on a déja eu cette question je crois.
0
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006
12 déc. 2005 à 23:12
Bon j'ai fait a peu pres comme vous m'avez demander de faire je me suis créer ma textbox je peux meme colorer mes bords enfin celui de gauche et en heut pour le moment pour un raison que j'ignore il veut pas faire le reste enfin je reverifirais mon code.

Par contre Mx j'ai ce probleme lorsque je tape sur le controle le degradé disparait :( Comment faire pour que ça persiste.

ça sert a quoi un double buffer Lutinor ? et comment on le rajoute ?
si je derive de la classe control comme vous me dite je perd toute les propriété d'un textboxe et il faut que je les réécrivent.Comment je fais pour les réecrire ça doit pas etre uniquement des get et set dans ma classe.

Voila ma petite classe si ça peut aussi aider d'autre ....

public class TextBoxAga : TextBox {

//Couleur du Haut
private Color couleurTop ;
//Couleur Gauche
private Color couleurLeft ;
//Couleur du Bas
private Color couleurBottom ;
//Couleur Droite
private Color couleurRigth ;

//geter et seter
public Color BorderColor {

get{return Color.Empty ;}
set{
this.couleurTop = value ;
this.couleurLeft = value ;
this.couleurBottom = value ;
this.couleurRigth = value ;
}
}

public Color BorderColorTop {
get {return this.couleurTop ;}
set {this.couleurTop = value ;}
}

public Color BorderColorLeft {
get {return this.couleurLeft ;}
set {this.couleurLeft = value ;}
}

public Color BorderColorBottom {
get {return this.couleurBottom ;}
set {this.couleurBottom = value ;}
}

public Color BorderColorRigth {
get {return this.couleurRigth ;}
set {this.couleurRigth = value ;}
}

public TextBoxAga(): base() {
this.SetStyle(ControlStyles.UserPaint,true);

}
protected override void OnPaint(PaintEventArgs e) {

//pour avoir mon fond en degradé
LinearGradientBrush brush = new LinearGradientBrush( this.ClientRectangle, Color.Beige, Color.Pink, 45.0f );
e.Graphics.FillRectangle( brush, this.ClientRectangle );

// pour avoir les coin de ma textBox redessiné
//Taille de ma textBox
Rectangle rec = new Rectangle(0,0,this.Bounds.Width, this.Bounds.Height);

//fonction redessinant ma la bordure de ma texte boxe
DrawBorder(e.Graphics,rec,couleurTop, couleurBottom, couleurLeft,couleurRigth);

brush.Dispose();


}

private void DrawBorder(Graphics Graph , Rectangle rec,Color ColorTop,Color ColorBottom, Color ColorLeft, Color ColorRight){

Pen pen= new Pen(ColorLeft,1);
//Bordure Gauche
Graph.DrawLine(pen, rec.X, rec.Y+rec.Height-1, rec.X, rec.Y );
//bordure Top
Graph.DrawLine(pen, rec.X,rec.Y, rec.X+rec.Width-1,rec.Y) ;

//Bordure Droite
Graph.DrawLine(pen, rec.X + rec.Width - 1, rec.Y, rec.X + rec.Width - 1, rec.Top + rec.Height - 1);
//Bordure du Bas
Graph.DrawLine(pen, rec.X + rec.Width - 1, rec.Top + rec.Height - 1, rec.X, rec.Top + rec.Height - 1);
pen.Dispose();

pen.Dispose();


}


Merci de jeter un oeil a ++
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
12 déc. 2005 à 23:28
Je crois que j'ai trouvé je te donne ça dans quelques minutes ; )
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
12 déc. 2005 à 23:40
Je pense que c'est ça que tu voulais:

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;


namespace MySpace
{
class MainForm : Form
{
MyRichTextBox tb;


public MainForm( )
{
tb = new MyRichTextBox( );
tb.Multiline = true;
tb.Dock = DockStyle.Fill;
this.Controls.Add( tb );
}


protected override void OnPaint( PaintEventArgs e )
{
//base.OnPaint( e );


LinearGradientBrush brush = new LinearGradientBrush( this.ClientRectangle, Color.Beige, Color.Pink, 45.0f );


e.Graphics.FillRectangle( brush, tb.ClientRectangle );


brush.Dispose( );
}


[ STAThread ]
private static void Main( )
{
Application.Run( new MainForm( ) );
}
}

public class MyRichTextBox : RichTextBox
{
private const int WS_EX_TRANSPARENT = 0x00000020;


public MyRichTextBox( ) : base( )
{
this.BorderStyle = BorderStyle.None;
}

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= WS_EX_TRANSPARENT;
return cp;
}
}

protected override void OnPaintBackground( PaintEventArgs e )
{
// ..
}
/*
protected override void OnResize( EventArgs e )
{
this.Invalidate( );
}
*/
}
}
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
12 déc. 2005 à 23:47
Y'avait encore 2 petites erreurs :

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;


namespace MySpace
{
class MainForm : Form
{
MyRichTextBox tb;


public MainForm( )
{
tb = new MyRichTextBox( );
tb.Multiline = true;
//tb.Dock = DockStyle.Fill;


tb.Location = new Point( 0, 0 );
tb.Size = new Size( 100, 100 );
this.Controls.Add( tb );
}


protected override void OnPaint( PaintEventArgs e )
{
//base.OnPaint( e );


LinearGradientBrush brush = new LinearGradientBrush( tb.ClientRectangle, Color.Beige, Color.Pink, 45.0f );


e.Graphics.FillRectangle( brush, tb.ClientRectangle );


brush.Dispose( );
}


protected override void OnResize( EventArgs e )
{
this.Invalidate( );
}


[ STAThread ]
private static void Main( )
{
Application.Run( new MainForm( ) );
}
}

public class MyRichTextBox : RichTextBox
{
private const int WS_EX_TRANSPARENT = 0x00000020;


public MyRichTextBox( ) : base( )
{
this.BorderStyle = BorderStyle.None;
}

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= WS_EX_TRANSPARENT;
return cp;
}
}

protected override void OnPaintBackground( PaintEventArgs e )
{
// ..
}
}
}
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
13 déc. 2005 à 00:57
Encore quelques corrections, j'espère que c'est la bonne cette fois, comme ça marche aussi avec une image au lieu d'un dégradé ( suffit de modifier la méthode OnPaint ) ça peut donner des choses vraiment sympa.

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;


namespace MySpace
{
class MainForm : Form
{
private MyRichTextBox tb;


private MainForm( ) : base( )
{
tb = new MyRichTextBox( );
tb.Multiline = true;
tb.Location = new Point( 100, 100 );
tb.Size = new Size( 400, 400 );


this.SetStyle( ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true );
this.Size = new Size( 800, 600 );
this.Controls.Add( tb );
}


protected override void OnPaint( PaintEventArgs e )
{
//base.OnPaint( e );


LinearGradientBrush brush = new LinearGradientBrush( tb.Bounds, Color.Beige, Color.Pink, 45.0f );


e.Graphics.FillRectangle( brush, tb.Bounds );


brush.Dispose( );
}


protected override void OnResize( EventArgs e )
{
//base.OnResize( e );


this.Invalidate( );
}


[ STAThread ]
private static void Main( )
{
Application.Run( new MainForm( ) );
}
}

public class MyRichTextBox : RichTextBox
{
private const int WS_EX_TRANSPARENT = 0x00000020;


public MyRichTextBox( ) : base( )
{
this.BorderStyle = BorderStyle.None;
}

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= WS_EX_TRANSPARENT;
return cp;
}
}

protected override void OnPaintBackground( PaintEventArgs e )
{
// ..
}
}
}
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
13 déc. 2005 à 07:14
euh... besoin de moi ?

Sébastien FERRAND
[MVP C#]
0
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006
13 déc. 2005 à 09:39
J'ai toujours ce meme probleme lorsque je créé mon objet textbox :( c'est quoi le probleme dans ma classe.

J'ai bien la bonne couleur de fond mais quand j'ercris dedans la ligne blanche apparait .

Merci pour ton aide et codes Lutinor.

Est ce que ça viendrait que j'herite ma classe de textBox au lieu de ritchTextBox


public class TextBoxAga : TextBox {

//Couleur du Haut
private Color couleurTop ;
//Couleur Gauche
private Color couleurLeft ;
//Couleur du Bas
private Color couleurBottom ;
//Couleur Droite
private Color couleurRigth ;

//Constante pour la méthode OnPaint
private const int WM_PAINT = 0xF;

private const int WS_EX_TRANSPARENT = 0x00000020;

//Couleur de fond de textBox
private Color couleurBack;

//geter et seter
public Color BorderColor {

get{return Color.Empty ;}
set{
this.couleurTop = value ;
this.couleurLeft = value ;
this.couleurBottom = value ;
this.couleurRigth = value ;
}
}

public Color backColor {
get {return this.couleurBack;}
set {this.couleurBack = value ;}
}
public Color BorderColorTop {
get {return this.couleurTop ;}
set {this.couleurTop = value ;}
}

public Color BorderColorLeft {
get {return this.couleurLeft ;}
set {this.couleurLeft = value ;}
}

public Color BorderColorBottom {
get {return this.couleurBottom ;}
set {this.couleurBottom = value ;}
}

public Color BorderColorRigth {
get {return this.couleurRigth ;}
set {this.couleurRigth = value ;}
}

public TextBoxAga(): base() {
//this.SetStyle(ControlStyles.UserPaint,true);
this.SetStyle( ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer, true );


}
protected override void OnPaint(PaintEventArgs e) {

//pour avoir mon fond en degradé
LinearGradientBrush brush = new LinearGradientBrush( this.Bounds, Color.Beige, Color.Pink, 45.0f );
e.Graphics.FillRectangle( brush, this.ClientRectangle );

// pour avoir les coin de ma textBox redessiné
//Taille de ma textBox
Rectangle rec = new Rectangle(0,0,this.Bounds.Width, this.Bounds.Height);

//fonction redessinant ma la bordure de ma texte boxe
DrawBorder(e.Graphics,rec,couleurTop, couleurBottom, couleurLeft,couleurRigth);

brush.Dispose();

}

private void DrawBorder(Graphics Graph , Rectangle rec,Color ColorTop,Color ColorBottom, Color ColorLeft, Color ColorRight){

Pen pen= new Pen(ColorLeft,1);
//Bordure Gauche
Graph.DrawLine(pen, rec.X, rec.Y+rec.Height-1, rec.X, rec.Y );
//bordure Top
Graph.DrawLine(pen, rec.X,rec.Y, rec.X+rec.Width-1,rec.Y) ;

//Bordure Droite
Graph.DrawLine(pen, rec.X + rec.Width - 1, rec.Y, rec.X + rec.Width - 1, rec.Top + rec.Height - 1);
//Bordure du Bas
Graph.DrawLine(pen, rec.X + rec.Width - 1, rec.Top + rec.Height - 1, rec.X, rec.Top + rec.Height - 1);
pen.Dispose();

pen.Dispose();


}

protected override void OnResize( EventArgs e ) {
//base.OnResize( e );
this.Invalidate();
}

protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= WS_EX_TRANSPARENT;
return cp;
}
}
0
agarcia_01 Messages postés 51 Date d'inscription mardi 8 février 2005 Statut Membre Dernière intervention 25 août 2006
13 déc. 2005 à 09:43
bon ok la j'ai changer herité ma classe de richtextBox, le probleme maintenant quei se pose c'est que je ne vois plus le texte que je tape meme en mettant.
this.ForColor= Color.Black;

C'est quoi le bleme a votre avis.
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
13 déc. 2005 à 12:14
en fait, j'ai une bonne et une mauvaise nouvelle...

il est possible de dessiner un fond dégradé (ou autre) dans une textbox (c'était la bonne nouvelle), malheureusement (donc, pour ceux qui suivent toujours, c'est la mauvaise), ca implique de gérer tout l'affichage de celui-ci.

Donc :
- Dessin du fond,
- Dessin du texte,
- Dessin de la sélection (si elle existe),
- Dessin du caret (cursor)

Donc l'idée est de passer par un override de WndProc et d'intercepter le message WM_PAINT (0xF), récupérer le handle (m.HWnd) et dessiner...

J'essaye... et je vous tiens au courant

Sébastien FERRAND
[MVP C#]
0
Rejoignez-nous