سؤال

هل هناك أي طريقة لالتقاط MouseDown حتى من عنصر تحكم .NET 2.0 TextBox؟أعلم أن فئة التحكم الموروثة تحتوي على الحدث، لكن لم يتم عرضه في TextBox.هل هناك طريقة لتجاوز معالج الحدث؟

لقد جربت أيضًا عنصر التحكم OpenNETCF TextBox2 الذي كشف عن حدث MouseDown، ولكن بغض النظر عما أفعله، فإنه لا يطلق المعالج.

أي اقتراحات؟


ما نوع الأجهزة المحمولة المجنونة التي لديك فأر؟:)

نعم، لا يحتوي Windows Mobile على ماوس فعلي، ولكنك مخطئ في أن Windows Mobile .NET لا يدعم أحداث الماوس.لا يزال النقر أو التحرك على الشاشة يعتبر حدث "ماوس".تم ذلك بهذه الطريقة حتى يمكن نقل التعليمات البرمجية من Windows الكامل بسهولة.وهذه ليست مشكلة خاصة بنظام Windows Mobile.لا يحتوي عنصر التحكم TextBox في Windows على أحداث الماوس الأصلية أيضًا.لقد صادف أنني كنت أستخدم Windows Mobile في هذه الحالة.

يحرر:وفي ملاحظة جانبية... نظرًا لأن Windows Mobile مبني على نظام WindowsCE الأساسي الذي يُستخدم غالبًا لأنظمة سطح المكتب المضمنة وعملاء Slim Terminal Services أو "WinTerms"، فهو يدعم ماوس الأجهزة ويظل موجودًا لفترة طويلة.لا تحتوي معظم الأجهزة على منافذ لتوصيل أحدها.


وفقًا لـ .NET Framework ، يتم دعم معالج أحداث Mousedown على مربع نص.ماذا يحدث عندما تحاول تشغيل الرمز؟

في الواقع، هذا موجود فقط لأنه يرثه من "التحكم"، كما هو الحال كل التحكم في النموذج الآخر.ومع ذلك، تم تجاوزه (وتغييره إلى خاص على ما أعتقد) في فئة TextBox.لذلك لن يظهر في IntelliSense في Visual Studio.

ومع ذلك، يمكنك في الواقع كتابة الكود:

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

وسيتم تجميعه وتشغيله بشكل جيد، والمشكلة الوحيدة هي أن textBox1_MouseDown() لن يتم تشغيله عند النقر فوق عنصر التحكم TextBox.أفترض أن هذا بسبب تجاوز الحدث داخليًا.لا أريد حتى تغيير ما يحدث في الحدث داخليًا، أريد فقط إضافة معالج الحدث الخاص بي إلى هذا الحدث حتى أتمكن من إطلاق بعض التعليمات البرمجية المخصصة كما تفعل مع أي حدث آخر.

هل كانت مفيدة؟

المحلول

يبدو أنك على حق.الخسارة.لا يوجد حدث MouseOver.

أحد الإجراءات الاحتياطية التي تعمل دائمًا مع .NET هو P/Invoc.لقد أخذ شخص ما الوقت الكافي للقيام بذلك من أجل .NET CF TextBox.لقد وجدت هذا في CodeProject:

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

أتمنى أن يساعدك هذا

نصائح أخرى

أعلم أن هذه الإجابة متأخرة جدًا، ولكن آمل أن تكون مفيدة في النهاية لمن يجدها.كما أنني لم أتوصل إلى ذلك بنفسي تمامًا.أعتقد أنني عثرت في الأصل على معظم المعلومات الموجودة على لوحات OpenNETCF، ولكن ما هو مكتوب أدناه مستخرج من أحد تطبيقاتي.

يمكنك الحصول على حدث mousedown عن طريق تنفيذ واجهة OpenNETCF.Windows.Forms.IMessageFilter وإرفاقها بمرشح رسائل التطبيق الخاص بك.

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

هذه هي الطريقة التي يمكنك من خلالها تنفيذ 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;
    }
}

الآن سيقوم MouseUpDownFilter بإطلاق حدث MouseUp/MouseDown عند حدوثه على عنصر تحكم مراقب، على سبيل المثال مربع النص الخاص بك.لاستخدام هذا الفلتر، يمكنك إضافة بعض عناصر التحكم المُراقبة وتعيين الأحداث التي قد يتم تشغيلها في حدث تحميل النموذج الخاص بك:

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

}

عادلة بما فيه الكفاية.من المحتمل أنك تعرف أكثر مما أعرفه عن Windows Mobile.:) لقد بدأت للتو البرمجة لذلك.ولكن في WinForms العادية، يمكنك تجاوز أساليب معالج الأحداث OnXxx كما تريد.نظرة سريعة في Reflector مع CF توضح أن Control وTextBoxBase وTextBox لا تمنعك من تجاوز معالج الأحداث OnMouseDown.

هل جربت هذا؟:

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

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

هل هناك حدث "OnEnter" يمكنك التقاطه بدلاً من ذلك؟

من المفترض أيضًا أن يتم التقاطه عند الضغط على علامة التبويب في مربع النص وكذلك الدخول إلى مربع النص عن طريق النقر/النقر عليه، ولكن إذا لم تكن هذه مشكلة، فقد يكون هذا حلاً أكثر وضوحًا

وفقًا لـ .Net Framework، فإن معالج الأحداث MouseDown على TextBox مدعوم.ماذا يحدث عند محاولة تشغيل الكود؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top