Zachytit MouseDown událost pro .NET TextBoxu

hlasů
1

Existuje nějaký způsob, jak zachytit MouseDown iz ovládacího prvku textové pole .NET 2.0? Vím, že zdědil třída Control má událost, ale to není vystavena v textové pole. Existuje způsob, jak potlačit rutiny události?

Také jsem se pokusil kontrolu OpenNETCF TextBox2 který má mít událost MouseDown vystaven, ale bez ohledu na to, co dělám, ale neaktivuje psovoda.

Nějaké návrhy?


Jaký druh bláznivého mobilním zařízení máte, který má myš? :)

Ano, windows mobile nemá skutečný myš, ale mýlíte se, že Windows Mobile .NET nepodporuje události myši. Kliknutím nebo tah na obrazovce je stále považován za „Mouse“ event. Stalo se tak tímto způsobem, takže kód mohl přístavní znovu od úplného Windows snadno. A to není specifický problém se systémem Windows Mobile. Ovládací prvek textové pole v systému Windows nemá nativní události myši jeden. Náhodou jsem se, že používáte Windows Mobile v tomto případě.

Edit: A na straně vědomí ... jako Windows Mobile je postavena na jádru WindowsCE který je často používán pro embedded stolní systémy a klienty Slim Terminálové služby nebo „WinTerms“ to má podporu pro hardwarové myší a má dlouhou dobu. Většina zařízení prostě nemají porty připojte jeden v.


Podle NET Framework, je podporována MouseDown Handler události na textové pole. Co se stane, když se pokusíte spustit kód?

Ve skutečnosti, to je jen tam, protože jej dědí z „Control“, stejně jako každý jiný ovládací prvek formuláře. Je však přepsána (a změněn na soukromé Věřím) ve třídě textové pole. Takže to nebude zobrazovat v IntelliSense ve Visual Studiu.

Nicméně, ve skutečnosti může psát kód:

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

a to bude kompilovat a spouštět v pohodě, jediný problém je, že textBox1_MouseDown () nebude spuštěna, když klepnete na ovládací prvek textové pole. Předpokládám, že to je proto, že z událostí jsou potlačeny interně. Já ani chtít změnit to, co se děje v případě interně, jen chci přidat svůj vlastní rutinu události pro danou událost, takže můžu střílet nějaký vlastní kód, jak byste mohli s jakoukoliv jinou událost.

Položena 11/08/2008 v 13:36
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
2

Vím, že tato odpověď je způsob, jak pozdě, ale doufejme, že to skončí, že jsou užitečné pro někoho, kdo najde to. Také jsem neměl úplně přijít s ním sám. Myslím, že jsem původně našel většinu informací o deskách OpenNETCF, ale to, co je napsané dole se získává z jednoho z mých aplikací.

Můžete získat MouseDown událost provádění OpenNETCF.Windows.Forms.IMessageFilter rozhraní a připojením k filtru zpráv dané aplikace.


statická class Program {
    public static MouseUpDownFilter mudFilter = new MouseUpDownfilter ();
    public static void main () {
        Application2.AddMessageFilter (mudFilter);
        Application2.Run (nový MainForm ());
    }
}

To je, jak byste mohli realizovat MouseUpDownFilter:


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

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

    veřejná akce MouseEventHandler MouseUp;
    veřejná akce MouseEventHandler MouseDown;

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

        // Je-li kód zpráva není jeden z těch se zajímáme
        // pak můžeme zastavit zde
        if (m.Msg! = WM_LBUTTONDOWN && m.Msg! = WM_LBUTTONDOWN) {
            return false;
        }

        // zjistit, zda ovládací prvek je sledoval tlačítko
        foreach (kontrola c v 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);
                jiný
                    MouseUp (c, args);

                // vrací skutečné prostředky jsme zpracovali tuto zprávu
                return true;
            }
        }
        return false;
    }
}

Nyní tento MouseUpDownFilter bude platit událost MouseUp / MouseDown, když k nim dojde na sledované kontrolou, například vaše textové pole. Chcete-li použít tento filtr přidat nějaké sledovali kontrol a přiřadit k událostem by se mohlo požár v případě načítání formuláře:


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

void mudFilter_MouseDown (objekt odesílatele, MouseEventArgs e) {
    if (odesílatel == TextBox1) {
        // dělat, co chcete dělat v TextBox1 událost poslední klepnutí myši :)
    }

}

Odpovězeno 10/08/2009 v 15:38
zdroj uživatelem

hlasů
0

Je tam ‚OnEnter‘ událost, která byste mohli zachytit místo?

to by pravděpodobně také zachytit, když jste kartu do textového pole, stejně jako vstoupit do textového pole poklepáním / kliknutím na něj, ale pokud to není problém, pak to může být přímější práce kolem

Odpovězeno 19/09/2008 v 14:45
zdroj uživatelem

hlasů
0

Vypadá to, že máte pravdu. Průšvih. No MouseOver událost.

Jedním z fallbacks který pracuje vždy s .NET, i když je P / Invoke. Někdo už si našli čas, aby to pro .NET CF textové pole. Našel jsem to na CodeProject:

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

Snad to pomůže

Odpovězeno 11/08/2008 v 15:45
zdroj uživatelem

hlasů
0

fér. Asi víte víc než já o systému Windows Mobile. :) Jen jsem začal programování pro něj. Ale v pravidelných WinForms, můžete přepsat Obsluha události metody OnXxx vše, co chcete. Letmý pohled na reflektor s CF ukazuje, že kontrola, TextBoxBase a TextBox nemají zabránit přepsání onMouseDown rutinu události.

Už jste vyzkoušeli tuto ?:

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

    protected override void OnMouseDown(MouseEventArgs e)
    {
        //do something specific here
        base.OnMouseDown(e);
    }
}
Odpovězeno 11/08/2008 v 15:02
zdroj uživatelem

hlasů
0

Podle NET Framework je MouseDown Handler události na textové pole je podporován. Co se stane, když se pokusíte spustit kód?

Odpovězeno 11/08/2008 v 14:54
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more