Maison > développement back-end > C++ > Comment puis-je faire en sorte qu'un contrôle de panneau C# reçoive le focus clavier ?

Comment puis-je faire en sorte qu'un contrôle de panneau C# reçoive le focus clavier ?

Patricia Arquette
Libérer: 2025-01-21 00:08:09
original
920 Les gens l'ont consulté

How Can I Make a C# Panel Control Receive Keyboard Focus?

Solution au problème de focus du clavier du panneau en C#

Dans la programmation GUI, il est souvent nécessaire qu'un contrôle soit mis au point pour faciliter l'interaction avec le clavier. Cependant, la classe Panel dans une application Windows.Forms C# a tendance à déplacer le focus vers ses contrôles enfants, ce qui rend difficile la gestion de la saisie au clavier directement dans le panneau lui-même.

Problème : Le panneau ne parvient pas à obtenir le focus

Un développeur a rencontré un problème où les contrôles personnalisés dérivés du Panel ne parvenaient pas à recevoir le focus clavier. Pour ce contrôle, les événements tels que KeyUp/KeyDown/KeyPress et GotFocus/LostFocus ne se déclenchent toujours pas.

Solution : Convertir le panneau en un contrôle utilisateur pouvant être focalisé

Pour résoudre ce problème, ce développeur a proposé une solution élégante qui étend les fonctionnalités de Panel :

<code class="language-csharp">using System;
using System.Drawing;
using System.Windows.Forms;

class SelectablePanel : Panel {
    public SelectablePanel() {
        this.SetStyle(ControlStyles.Selectable, true);
        this.TabStop = true;
    }
    protected override void OnMouseDown(MouseEventArgs e) {
        this.Focus();
        base.OnMouseDown(e);
    }
    protected override bool IsInputKey(Keys keyData) {
        if (keyData == Keys.Up || keyData == Keys.Down) return true;
        if (keyData == Keys.Left || keyData == Keys.Right) return true;
        return base.IsInputKey(keyData);
    }
    protected override void OnEnter(EventArgs e) {
        this.Invalidate();
        base.OnEnter(e);
    }
    protected override void OnLeave(EventArgs e) {
        this.Invalidate();
        base.OnLeave(e);
    }
    protected override void OnPaint(PaintEventArgs pe) {
        base.OnPaint(pe);
        if (this.Focused) {
            var rc = this.ClientRectangle;
            rc.Inflate(-2, -2);
            ControlPaint.DrawFocusRectangle(pe.Graphics, rc);
        }
    }
}</code>
Copier après la connexion

Ce code a quelques modifications clés effectuées :

  • ControlStyles.Selectable : Ce style active le focus clavier pour le panneau.
  • TabStop : Définir cette propriété sur true permet au panneau de recevoir le focus sur les touches de tabulation.
  • OnMouseDown : Lorsque la souris clique à l'intérieur d'un panneau, elle force le focus sur le panneau, garantissant qu'il devient le récepteur d'entrée actif.
  • IsInputKey : Ce remplacement permet au panneau d'interpréter des touches spécifiques (haut, bas, gauche, droite) comme touches de saisie, activant la fonctionnalité de navigation au clavier.
  • OnEnter/OnLeave : Ces événements remplacent l'apparence du contrôle de mise à jour pour indiquer quand il gagne ou perd le focus.
  • OnPaint : Cela redessine le contrôle afin que le rectangle de focus apparaisse lorsque le panneau a le focus.

Avantages de l'utilisation de SelectablePanel

En appliquant ce code, le développeur a amélioré son contrôle personnalisé dérivé du panneau avec une acquisition et une navigation transparentes du focus clavier. Il résout intelligemment le problème de l'incapacité de Panel à obtenir la mise au point, permettant à ses programmes graphiques d'interagir efficacement avec le clavier.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal