Question

Existe-t-il un moyen de capturer MouseDown même à partir du contrôle TextBox .NET 2.0 ?Je sais que la classe Control héritée a l'événement, mais elle n'est pas exposée dans TextBox.Existe-t-il un moyen de remplacer le gestionnaire d'événements ?

J'ai également essayé le contrôle OpenNETCF TextBox2 qui expose l'événement MouseDown, mais quoi que je fasse, il ne déclenche pas le gestionnaire.

Aucune suggestion?


Quel genre d'appareil mobile fou avez-vous qui a une souris?:)

Oui, Windows Mobile n'a pas de véritable souris, mais vous vous trompez en disant que Windows Mobile .NET ne prend pas en charge les événements de souris.Un clic ou un déplacement sur l'écran est toujours considéré comme un événement « Souris ».Cela a été fait de cette façon afin que le code puisse facilement être transféré depuis Windows complet.Et ce n'est pas un problème spécifique à Windows Mobile.Le contrôle TextBox sous Windows n'a pas non plus d'événements de souris natifs.Il se trouve que j'utilisais Windows Mobile dans ce cas.

Modifier:Et en passant... comme Windows Mobile est construit à partir du noyau WindowsCE qui est souvent utilisé pour les systèmes de bureau intégrés et les clients Slim Terminal Services ou "WinTerms", il prend en charge une souris matérielle et ce depuis longtemps.La plupart des appareils n’ont tout simplement pas de ports pour en brancher un.


Selon le Framework .NET, le gestionnaire d'événements Mousedown sur une zone de texte est pris en charge.Que se passe-t-il lorsque vous essayez d'exécuter le code?

En fait, ce n'est là que parce qu'il hérite de "Control", tout comme chaque autre contrôle de formulaire.Il est cependant remplacé (et changé en privé, je crois) dans la classe TextBox.Il n'apparaîtra donc pas dans IntelliSense dans Visual Studio.

Cependant, vous pouvez réellement écrire le code :

textBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.textBox1_MouseDown);

et il se compilera et fonctionnera très bien, le seul problème est que textBox1_MouseDown() ne sera pas déclenché lorsque vous appuyez sur le contrôle TextBox.Je suppose que cela est dû au fait que l'événement a été remplacé en interne.Je ne veux même pas changer ce qui se passe sur l'événement en interne, je veux juste ajouter mon propre gestionnaire d'événements à cet événement afin de pouvoir lancer du code personnalisé comme vous le feriez avec n'importe quel autre événement.

Était-ce utile?

La solution

On dirait que tu as raison.Déception.Aucun événement MouseOver.

L’une des solutions de secours qui fonctionne toujours avec .NET est P/Invoke.Quelqu'un a déjà pris le temps de le faire pour le .NET CF TextBox.J'ai trouvé ça sur CodeProject :

http://www.codeproject.com/KB/cs/TextBox_subclassing.aspx

J'espère que cela t'aides

Autres conseils

Je sais que cette réponse est bien tardive, mais j'espère qu'elle finira par être utile à quelqu'un qui trouvera cela.De plus, je ne l’ai pas entièrement inventé moi-même.Je pense avoir initialement trouvé la plupart des informations sur les cartes OpenNETCF, mais ce qui est tapé ci-dessous est extrait d'une de mes applications.

Vous pouvez obtenir un événement mousedown en implémentant l'interface OpenNETCF.Windows.Forms.IMessageFilter et en l'attachant au filtre de messages de votre application.

static class Program {
    public static MouseUpDownFilter mudFilter = new MouseUpDownfilter();
    public static void Main() {
        Application2.AddMessageFilter(mudFilter);
        Application2.Run(new MainForm());
    }
}

Voici comment implémenter MouseUpDownFilter :

public class MouseUpDownFilter : IMessageFilter {
    List ControlList = new List();

    public void WatchControl(Control buttonToWatch) {
        ControlList.Add(buttonToWatch);
    }

    public event MouseEventHandler MouseUp;
    public event MouseEventHandler MouseDown;

    public bool PreFilterMessage(ref Microsoft.WindowsCE.Forms.Message m) {
        const int WM_LBUTTONDOWN = 0x0201;
        const int WM_LBUTTONUP = 0x0202;

        // If the message code isn't one of the ones we're interested in
        // then we can stop here
        if (m.Msg != WM_LBUTTONDOWN && m.Msg != WM_LBUTTONDOWN) {
            return false;
        }

        //  see if the control is a watched button
        foreach (Control c in ControlList) {
            if (m.HWnd == c.Handle) {
                int i = (int)m.LParam;
                int x = i & 0xFFFF;
                int y = (i >> 16) & 0xFFFF;
                MouseEventArgs args = new MouseEventArgs(MouseButtons.Left, 1, x, y, 0);

                if (m.Msg == WM_LBUTTONDOWN)
                    MouseDown(c, args);
                else
                    MouseUp(c, args);

                // returning true means we've processed this message
                return true;
            }
        }
        return false;
    }
}

Désormais, ce MouseUpDownFilter déclenchera un événement MouseUp/MouseDown lorsqu'ils se produiront sur un contrôle surveillé, par exemple votre zone de texte.Pour utiliser ce filtre, vous ajoutez des contrôles surveillés et les affectez aux événements qu'il pourrait déclencher dans l'événement de chargement de votre formulaire :

private void MainForm_Load(object sender, EventArgs e) {
    Program.mudFilter.WatchControl(this.textBox1);
    Program.mudFilter.MouseDown += new MouseEventHandler(mudFilter_MouseDown);
    Program.mudFilter.MouseUp += new MouseEventHandler(mudFilter_MouseUp);
}

void mudFilter_MouseDown(object sender, MouseEventArgs e) {
    if (sender == textBox1) {
        // do what you want to do in the textBox1 mouse down event :)
    }

}

Assez juste.Vous en savez probablement plus que moi sur Windows Mobile.:) Je viens de commencer à programmer pour cela.Mais dans les WinForms classiques, vous pouvez remplacer les méthodes du gestionnaire d'événements OnXxx autant que vous le souhaitez.Un rapide coup d'œil dans Reflector avec le CF montre que Control, TextBoxBase et TextBox ne vous empêchent pas de remplacer le gestionnaire d'événements OnMouseDown.

Avez-vous essayé ceci ? :

public class MyTextBox : TextBox
{
    public MyTextBox()
    {
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        //do something specific here
        base.OnMouseDown(e);
    }
}

existe-t-il un événement « OnEnter » que vous pourriez capturer à la place ?

il capturerait probablement également le moment où vous tapez dans la zone de texte et que vous entrez dans la zone de texte en appuyant/cliquant dessus, mais si ce n'est pas un problème, cela peut être une solution de contournement plus simple

Selon le .Net Framework, le Gestionnaire d'événements MouseDown sur une TextBox est pris en charge.Que se passe-t-il lorsque vous essayez d'exécuter le code ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top