Domanda

Esiste un modo per acquisire MouseDown anche dal controllo TextBox .NET 2.0?So che la classe Control ereditata ha l'evento, ma non è esposto in TextBox.C'è un modo per sovrascrivere il gestore eventi?

Ho anche provato il controllo OpenNETCF TextBox2 che ha esposto l'evento MouseDown, ma qualunque cosa faccia, non attiva il gestore.

Eventuali suggerimenti?


Che tipo di pazzo dispositivo mobile hai che ha un mouse?:)

Sì, Windows Mobile non ha un vero mouse, ma sbagli perché Windows Mobile .NET non supporta gli eventi del mouse.Un clic o un movimento sullo schermo è comunque considerato un evento "Mouse".È stato fatto in questo modo in modo che il codice potesse essere facilmente trasferito da Windows completo.E questo non è un problema specifico di Windows Mobile.Anche il controllo TextBox su Windows non dispone di eventi nativi del mouse.In questo caso mi è capitato di utilizzare Windows Mobile.

Modificare:E una nota a margine... poiché Windows Mobile è costruito con il core WindowsCE che viene spesso utilizzato per sistemi desktop incorporati e client Slim Terminal Services o "WinTerms", supporta un mouse hardware e lo ha da molto tempo.La maggior parte dei dispositivi semplicemente non dispone delle porte per collegarne uno.


Secondo .NET Framework, è supportato il gestore di eventi Mousedown su una casella di testo.Cosa succede quando provi a eseguire il codice?

In realtà, è lì solo perché lo eredita da "Control", come fa ogni altro controllo del modulo.Tuttavia, viene sovrascritto (e credo che sia cambiato in privato) nella classe TextBox.Pertanto non verrà visualizzato in IntelliSense in Visual Studio.

Tuttavia, in realtà puoi scrivere il codice:

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

e verrà compilato ed eseguito perfettamente, l'unico problema è che textBox1_MouseDown() non verrà attivato quando tocchi il controllo TextBox.Presumo che ciò sia dovuto al fatto che l'evento viene sovrascritto internamente.Non voglio nemmeno cambiare ciò che sta accadendo all'evento internamente, voglio solo aggiungere il mio gestore di eventi a quell'evento in modo da poter attivare del codice personalizzato come faresti con qualsiasi altro evento.

È stato utile?

Soluzione

Sembra che tu abbia ragione.Peccato.Nessun evento MouseOver.

Uno dei fallback che funziona sempre con .NET, tuttavia, è P/Invoke.Qualcuno si è già preso il tempo di farlo per .NET CF TextBox.Ho trovato questo su CodeProject:

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

Spero che questo ti aiuti

Altri suggerimenti

So che questa risposta è molto tardi, ma spero che finisca per essere utile per qualcuno che la trova.Inoltre, non l'ho inventato del tutto da solo.Credo di aver trovato originariamente la maggior parte delle informazioni sulle schede OpenNETCF, ma ciò che è scritto di seguito è estratto da una delle mie applicazioni.

Puoi ottenere un evento di mousedown implementando l'interfaccia OpenNETCF.Windows.Forms.IMessageFilter e allegandolo al filtro dei messaggi dell'applicazione.

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

Ecco come potresti implementare 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;
    }
}

Ora questo MouseUpDownFilter attiverà un evento MouseUp/MouseDown quando si verificano su un controllo osservato, ad esempio la tua casella di testo.Per utilizzare questo filtro aggiungi alcuni controlli controllati e assegnali agli eventi che potrebbe attivarsi nell'evento di caricamento del modulo:

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 :)
    }

}

Abbastanza giusto.Probabilmente ne sai più di me su Windows Mobile.:) Ho appena iniziato a programmarlo.Ma in WinForms normale, puoi sovrascrivere i metodi del gestore eventi OnXxx quanto desideri.Un rapido sguardo a Reflector con il CF mostra che Control, TextBoxBase e TextBox non ti impediscono di sovrascrivere il gestore eventi OnMouseDown.

Hai provato questo?:

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

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

esiste invece un evento "OnEnter" che potresti acquisire?

presumibilmente catturerebbe anche quando si passa alla casella di testo e si accede alla casella di testo toccandola/facendo clic su di essa, ma se ciò non è un problema, questa potrebbe essere una soluzione più semplice

Secondo .Net Framework, il Gestore eventi MouseDown su una casella di testo è supportato.Cosa succede quando provi a eseguire il codice?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top