سؤال

حسنًا، أنا بصدد إنشاء لعبة Tic-Tac-Toe لمساعدتي في تعلم لغة C#.أحاول إضافة القليل من الوظائف إليه، لذلك أريد أن يتمكن الأشخاص من استخدام NumPad على الكمبيوتر لمحاكاة النقر على الأزرار.

هذا ما لدي ولكن عندما أستخدم NumPad، لا يتم النقر على الأزرار.هل يمكن لأي منكم أن يرى سببًا لماذا؟

    //===============================
    // start NumPad Simulate Clicks
    //   NumPad  MyButtons
    //   7 8 9   1 2 3
    //   4 5 6   4 5 6 
    //   1 2 3   7 8 9
    //===============================
    public void myControl_NumPad7(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad7)
        {
            button1_Click(null, null);
        }
    }
    public void myControl_NumPad8(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad8)
        {
            button2_Click(null, null);
        }
    }
    public void myControl_NumPad9(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad9)
        {
            button3_Click(null, null);
        }
    }
    public void myControl_NumPad4(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad4)
        {
            button4_Click(null, null);
        }
    }
    public void myControl_NumPad5(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad5)
        {
            button5_Click(null, null);
        }
    }
    public void myControl_NumPad6(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad6)
        {
            button6_Click(null, null);
        }
    }
    public void myControl_NumPad1(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad1)
        {
            button7_Click(null, null);
        }
    }
    public void myControl_NumPad2(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad2)
        {
            button8_Click(null, null);
        }
    }
    public void myControl_NumPad3(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.NumPad3)
        {
            button9_Click(null, null);
        }
    }
هل كانت مفيدة؟

المحلول

يحرر
لاحظت أنه يجب أن أكون أوضح فيما أقصده..

من الكود الذي نشرته، أعتقد أن لديك 9 عناصر تحكم أضفت أحداثك الرئيسية إليها.لن تتلقى عناصر التحكم هذه الأحداث الرئيسية إلا عندما يتم التركيز عليها.

للتعامل مع المفاتيح بشكل عام للنموذج، عليك تعيين Form.KeyPreview ل true.أيضًا، لن أتعامل مع المفاتيح بالطريقة التي تتعامل بها، لكن أضف أ Form.KeyDown الحدث واكتب شيئًا مثل:

switch (e.KeyCode)
{
    case Keys.NumPad9:
        e.Handled = true;
        button3.PerformClick();
        break;
    case Keys.NumPad8:
        e.Handled = true;
        button2.PerformClick();
        break;
    // And so on
}

سيؤدي هذا إلى التعامل مع NumPad-Keys داخل النموذج - ويمكنك بعد ذلك إزالة جميع معالجات الأحداث التي نشرتها في سؤالك.

"للنقر" على زر برمجيًا، يجب عليك استخدام الأمر Button.PerformClick() الطريقة، حيث قد تتم إضافة أكثر من معالج حدث إلى حدث النقر، والذي لن يتم استدعاؤه بطريقة أخرى.

تحرير 2
بناء الجملة ل switch-البيان كان غير صالح.بالطبع كل "قضية" يجب أن تبدأ بـ case الكلمة الأساسية...الآن يجب أن تعمل.

نصائح أخرى

وتحتاج إلى استخدام button1.PerformClick(); لكل الزر لاستدعاء الحدث بشكل صحيح، وهنا <لأ href = "http://msdn.microsoft.com/en-us/library/system.windows.forms.button.performclick.aspx" يختلط = "نوفولو noreferrer"> معلومات .

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