web-dev-qa-db-fra.com

Comment changer la couleur de police d'une TextBox désactivée?

Est-ce que quelqu'un sait quelle propriété définit la couleur du texte pour le contrôle désactivé? Je dois afficher du texte dans une variable TextBox désactivée et je souhaite définir sa couleur sur le noir.

55
Niko Gamulin

REMARQUE: voir la réponse de Cheetah ci-dessous, car elle identifie un préalable pour que cette solution fonctionne. Définition de la BackColor de la TextBox.


Je pense que ce que vous voulez vraiment faire est d’activer la variable TextBox et de définir la propriété ReadOnly sur true.

Il est un peu difficile de changer la couleur du texte dans une variable TextBox désactivée. Je pense que vous devrez probablement sous-classer et remplacer l’événement OnPaint.

ReadOnly devrait cependant vous donner le même résultat que !Enabled et vous permettre de garder le contrôle de la couleur et du formatage de TextBox. Je pense que cela permettra également de sélectionner et de copier le texte de la variable TextBox, ce qui n’est pas possible avec une variable TextBox désactivée.

Une autre solution simple consiste à utiliser Label au lieu de TextBox.

51
Eric Schoonover

En outre, pour que ForeColor soit obéi sur une zone de texte marquée en lecture seule, vous devez définir explicitement le BackColor. Si vous voulez qu'il utilise toujours le BackColor par défaut, vous devez expliciter le jeu, car le concepteur est trop intelligent pour son bien. Il suffit de définir le BackColor à sa valeur actuelle. Je fais cela dans l'événement Load pour le formulaire, comme suit:

private void FormFoo_Load(...) {
    txtFoo.BackColor = txtFoo.BackColor;
}
52
Cheetah

hi Définissez l'attribut readonly sur true à partir du code ou du temps d'exécution et non du moment de la conception. 

txtFingerPrints.BackColor = System.Drawing.SystemColors.Info;
txtFingerPrints.ReadOnly = true;
5
syed qaiser

Je viens de trouver un bon moyen de le faire. Dans mon exemple, j'utilise un RichTextBox mais cela devrait fonctionner avec n'importe quel Control:

public class DisabledRichTextBox : System.Windows.Forms.RichTextBox
{
    // See: http://wiki.winehq.org/List_Of_Windows_Messages

    private const int WM_SETFOCUS   = 0x07;
    private const int WM_ENABLE     = 0x0A;
    private const int WM_SETCURSOR  = 0x20;

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        if (!(m.Msg == WM_SETFOCUS || m.Msg == WM_ENABLE || m.Msg == WM_SETCURSOR))
            base.WndProc(ref m);
    }
}

Vous pouvez définir en toute sécurité Enabled = true et ReadOnly = false, et cela agira comme une étiquette empêchant le focus, l'entrée utilisateur, le changement de curseur sans être réellement désactivé.

Voyez si cela fonctionne pour vous . Salutations

4
edoedoedo

Vous pouvez essayer ceci . Remplacez l'événement OnPaint de la zone de texte. 

    protected override void OnPaint(PaintEventArgs e)
{
     SolidBrush drawBrush = new SolidBrush(ForeColor); //Use the ForeColor property
     // Draw string to screen.
     e.Graphics.DrawString(Text, Font, drawBrush, 0f,0f); //Use the Font property
}

définir les styles de contrôle sur "UserPaint"

public MyTextBox()//constructor
{
     // This call is required by the Windows.Forms Form Designer.
     this.SetStyle(ControlStyles.UserPaint,true);

     InitializeComponent();

     // TODO: Add any initialization after the InitForm call
}

Référence

Ou vous pouvez essayer ce hack

En entrer événement définir le focus

int index=this.Controls.IndexOf(this.textBox1);

this.Controls[index-1].Focus();

Ainsi, votre contrôle ne sera pas concentré et se comportera comme un handicapé.

2
Zain Ali

Il suffit de gérer Enable modifié et de le définir sur la couleur dont vous avez besoin

private void TextBoxName_EnabledChanged(System.Object sender, System.EventArgs e)
{
    ((TextBox)sender).ForeColor = Color.Black;
}
1
Mahmoud Salah

Si vous souhaitez afficher du texte qui ne peut pas être modifié ou sélectionné, vous pouvez simplement utiliser une étiquette.

0
karl f

En plus des réponses de @ spoon16 et @Cheetah, je règle toujours la propriété tabstop sur False dans la zone de texte pour empêcher la sélection du texte par défaut.

Alternativement, vous pouvez aussi faire quelque chose comme ça:

private void FormFoo_Load(...) {
    txtFoo.Select(0, 0);
}

ou 

private void FormFoo_Load(...) {
    txtFoo.SelectionLength = 0;
}
0
Johnie Karr