• 0
الحسين

KeyPreview ?

سؤال

في UserControl Class

كيف يمكن جعل UserControl Component

يحس بالضغط علي زر Tab بدون أنتقال Focus لأداة أخري علي الفورم

أعلم أن Form.KeyPreview المسئولة بحل المشكلة

ولكن لم أجد هذة الخاصية موجودة بالفئة UserControl

ما الحل ؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

8 إجابة على هذا السؤال .

  • 0

أن كان مافيش خاصية تدعم هذا , إلا يوجد دوال API .

للأهمية

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

خاصية KeyPreview تكون للـ Container والتي غالبا ماتكون عبارة Form .. وهي تعني أن أي حدث يتم تمريره على الـ Form قبل أن يتم تنفيذ الحدث ..

حاول استخدام WndProc الخاص بـالـ Form !

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله الرحمن الرحيم

بعد محاولات كثيرة وجدت حل هذة المشكلة

public class CSmartGrid : System.Windows.Forms.UserControl{ . . . .	private const int WM_CHAR  = 0x0102;	private const int WM_SCHAR = 0x0100;	private const int VK_TAB    = 0x09;	// ASCII Code in Hexadecimal	public override bool PreProcessMessage(ref Message msg)	{  char cTest = (char)msg.WParam;  if( msg.Msg == WM_CHAR || msg.Msg == WM_SCHAR )  { 	 switch(cTest) 	 {    case (char) VK_TAB    :   	 MessageBox.show("right key or back key is send");   	 break; 	 }  }  return false;	} . . .}
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جميل أخي الكريم ..

أنت قمت باستخدام PreProcessMessage بدلا من استخدام WndProc ..

لو اضفت بدلا من return false التالي لكان أفضل:

return base.PreProcessMessage(ref msg);

:)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

كلامك صحيح أخي أبوفهد وشكرا لك

ولكن هذا سوف يؤدي لأنتقال focus لأداة أخري

ولكني كنت أريد عدم أنتقال ال focus من ال control

لذلك قمت بأرجاع القيمة false

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
public class CSmartGrid : System.Windows.Forms.UserControl

{

.

.

.

.



private const int WM_CHAR  = 0x0102;

private const int WM_SCHAR = 0x0100;



private const int VK_TAB    = 0x09; // ASCII Code in Hexadecimal



public override bool PreProcessMessage(ref Message msg)

{

 char cTest = (char)msg.WParam;

 if( msg.Msg == WM_CHAR || msg.Msg == WM_SCHAR )

 {

 switch(cTest)

 {

   case (char) VK_TAB    :

   MessageBox.show("right key or back key is send");

   break;

 }

 }

[B]                                else

                               {

                                     return base.PreProcessMessage(ref msg);

                               }[/B]

}



.

.

.

}

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مشكور أخي للتوضيح

ولكن الدالة PreProcessMessage يجب أن يكون لها returning

public class CSmartGrid : System.Windows.Forms.UserControl

{

.

.

.

.



private const int WM_CHAR  = 0x0102;

private const int WM_SCHAR = 0x0100;



private const int VK_TAB    = 0x09; // ASCII Code in Hexadecimal



public override bool PreProcessMessage(ref Message msg)

{

 char cTest = (char)msg.WParam;

 if( msg.Msg == WM_CHAR || msg.Msg == WM_SCHAR )

 {

 switch(cTest)

 {

   case (char) VK_TAB    :

   MessageBox.show(" Tab Key is pressed");

               return false;

   break;

 }

 }

                               else

                               {

                                     return base.PreProcessMessage(ref msg);

                               }

}



.

.

.

}

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

نعم أخي العزيز كان لا بد من وضع قيمة ارجاع للدالة لكنني نسيت ذلك ..

شكرا لك :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .