2011-05-14 5 views
8

Pendant la création de mon jeu de correspondance génial;) J'ai trouvé un problème qui est complètement hors de portée.Couleur du texte du contrôle désactivé - comment le changer

Lorsque le joueur choisit deux étiquettes avec des symboles, je veux verrouiller toutes les autres étiquettes pendant 4 secondes.

Mais quand je fais cela, la couleur de toutes les étiquettes change en gris et les symboles sont visibles. Ma question est - existe-t-il une méthode pour changer le ForeColor d'un label désactivé dans visual C#?

Le projet est une application WinForm.

Au moment où je mis la couleur d'une étiquette dans le code de cette façon:

label1.ForeColor = lable1.BackColor; 

Lorsque l'utilisateur clique sur l'étiquette que je change à:

lable1.ForeColor = Color.Black; 
+3

Quel type de projet? WinForms, WPF, ASP.NET? –

+0

Comment définissez-vous la couleur pour le moment? Pouvez-vous envoyer votre code? – Oded

+4

Les étiquettes sont ** toujours ** "verrouillées", du moins dans le sens où les utilisateurs ne peuvent pas éditer leur texte ou les manipuler autrement. Il n'est pas nécessaire de les désactiver pour obtenir cet effet. –

Répondre

7

Way plus simple que d'essayer Pour modifier la façon dont Windows dessine les contrôles désactivés, il suffit de définir un indicateur lorsque vous voulez que le Label soit effectivement désactivé, puis vérifiez la valeur de cet indicateur dans votre méthode de gestionnaire d'événements Click avant de prendre w hatever l'action que vous voulez. Si le contrôle a été "désactivé", ne prenez aucune mesure.

Quelque chose comme ceci:

private bool labelDisabled = false; 

private void myLabel_Click(object sender, EventArgs e) 
{ 
    if (!labelDisabled) 
    { 
     this.ForeColor = SystemColors.ControlText; 
    } 
} 

Notez également que vous devez toujours utiliser le SystemColors au lieu de quelque chose comme Color.Black.
Si vous codez en dur des valeurs de couleur spécifiques, elles entreront souvent en conflit lorsque l'utilisateur personnalise son thème Windows par défaut. Raymond Chen discute des dangers de ceci dans un article sur son blog.

+0

Merci c'était génial et simple – Mqati

+7

Juste un commentaire sur le "toujours utiliser SystemColors" conseils - je dirais que ce devrait être toujours ou jamais - comme dans, hardcode toutes les couleurs pour tout ou rien d'entre eux. Parfois, vous voulez contrôler vous-même l'apparence des choses au lieu d'être un esclave du thème Windows. Mais ne les mélangez pas, c'est quand vous obtenez des choses contradictoires. –

+1

Oui, c'est définitivement une affaire de «tout ou rien». Mais je conteste votre phrasé "esclave du thème Windows". Cela aide si vous le voyez comme "esclave des préférences de votre utilisateur". Une assez bonne idée. –

8

Il suffit de créer votre propre étiquette avec un événement de peinture redéfini:

protected override void OnPaint (System.Windows.Forms.PaintEventArgs e) 
{ 
    if (Enabled) 
    { 
     //use normal realization 
     base.OnPaint (e); 
     return; 
    } 
    //custom drawing 
    using (Brush aBrush = new SolidBrush("YourCustomDisableColor")) 
    { 
     e.Graphics.DrawString(Text, Font, aBrush, ClientRectangle); 
    } 
} 

Soyez prudent avec les drapeaux de format de texte lors du dessin de texte.

+0

Pour tout le monde qui essaie de le faire avec un DateTimePicker: voici la solution http://stackoverflow.com/questions/1595481/datetimepicker-and-userpaint-text-and-button-missing – Breeze

Questions connexes