Capturează evenimentul MouseDown pentru .NET TextBox

Există vreo modalitate de a captura MouseDown chiar și de la controlul .NET 2.0 TextBox? Știu că clasa de control moștenită are evenimentul, dar nu este expusă în TextBox. Există o modalitate de a suprascrie procesorul de evenimente?

Am încercat, de asemenea, controlul OpenNETCF TextBox2 care are expus evenimentul MouseDown, dar indiferent de ce fac, nu declanșează manipulatorul.

Orice sugestii?


Ce fel de dispozitiv mobil nebun face   tu ai un mouse? :)

Da, Windows Mobile nu are un mouse real, dar vă înșelați că Windows Mobile .NET nu suportă evenimentele Mouse. Un clic sau o mutare pe ecran este încă considerat un eveniment "Mouse". Acesta a fost făcut în acest fel, astfel încât codul să poată fi pornit din Windows complet cu ușurință. Și aceasta nu este o problemă specifică Windows Mobile. Controlul TextBox pe Windows nu are niciun eveniment nativ al mouse-ului. Am întâmplat să folosesc Windows Mobile în acest caz.

Modificați: Și pe o notă laterală ... deoarece Windows Mobile este construit din nucleul WindowsCE care este adesea folosit pentru sistemele de desktop încorporate și clienții Slim Terminal Services sau "WinTerms" are suport pentru un mouse hardware și are o lungă perioadă de timp. Majoritatea dispozitivelor nu au porturile pentru a conecta unul.


În conformitate cu Cadrul .Net,   MouseDown Event Handler pe o casetă de text   este suportat. Ce se întâmplă atunci când tu   încercați să executați codul?

De fapt, asta e doar pentru că o moștenește de la "Control", la fel ca și altul Formular fiecare . Este, totuși, suprascris (și schimbat în privat cred că) în clasa TextBox. Deci nu va apărea în IntelliSense în Visual Studio.

Cu toate acestea, puteți scrie codul:

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

și se va compila și va funcționa foarte bine, singura problemă este că textBox1_MouseDown() nu va fi concediat când atingeți controlul de text. Presupun că acest lucru se datorează faptului că evenimentul a fost suprasolicitat intern. Nici măcar nu vreau să schimb ceea ce se întâmplă în cadrul evenimentului pe plan intern, vreau doar să-mi adaug propriul handler de eveniment la acel eveniment, ca să pot declanșa un cod personalizat pe cât posibil cu orice alt eveniment.

0
fr hi bn
Ce fel de dispozitiv mobil nebun aveți pe care aveți un mouse? :) Serios, motivul pentru care nu există nici un eveniment MouseDown se datorează faptului că Windows Mobile nu are un mouse. Ce incerci sa faci in handler-ul evenimentului MouseDown? Poate că există o altă cale.
adăugat autor ageektrapped, sursa

5 răspunsuri

According to the .Net Framework, the MouseDown Event Handler on a TextBox is supported. What happens when you try to run the code?

0
adăugat

Destul de corect. Probabil știți mai multe decât mine despre Windows Mobile. :) Am inceput programarea pentru asta. Dar, în WinForms obișnuit, aveți posibilitatea să înlocuiți metodele Handler de evenimente OnXxx tot ce doriți. O privire rapidă în Reflector cu CF indică faptul că Control, TextBoxBase și TextBox nu vă împiedică să suprascrieți procesorul de evenimente OnMouseDown.

Ați încercat asta ?:

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

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

Se pare că ai dreptate. Păcat. Niciun eveniment MouseOver.

Unul dintre cei care lucrează întotdeauna cu .NET, este P/Invoke. Cineva a luat deja timp pentru a face acest lucru pentru .NET CF TextBox. Am gasit acest lucru pe CodeProject:

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

Sper că acest lucru vă ajută

0
adăugat

Știu că acest răspuns este cam târziu, dar, sperăm, sfârșește prin a fi util pentru cineva care găsește acest lucru. De asemenea, eu nu am venit cu totul cu mine. Cred că am găsit inițial cele mai multe informații despre plăcile OpenNETCF, dar ceea ce este scris mai jos este extras dintr-o aplicație.

Puteți obține un eveniment de mousedown implementând interfața OpenNETCF.Windows.Forms.IMessageFilter și atașând-o la filtrul de mesaje al aplicației.

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

Acesta este modul în care puteți implementa 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;
    }
}

Acum, acest MouseUpDownFilter va declanșa un eveniment MouseUp/MouseDown atunci când acestea apar pe un control vizionat, de exemplu caseta de text. Pentru a utiliza acest filtru, adăugați niște comenzi urmărite și alocați evenimentelor pe care le-ar putea declanșa în cazul încărcării formularului:

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

}

0
adăugat

există un eveniment "OnEnter" pe care l-ați putea capta?

ar presupune, de asemenea, captura atunci când ați file în caseta de text, precum și introduceți caseta de text prin atingerea/faceți clic pe ea, dar în cazul în care aceasta nu este o problemă, atunci aceasta poate fi o muncă mai directă în jurul

0
adăugat