الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Win32

مغلقرائج
بدأه خليل أونيس في 12 أبريل 2005 · 59 رد · 6,690 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#51
GameDev4Arab كتب:
و عليكم السلام

بارك لله فيك و المثال رائع و إن شاء الله القادم أروع

و لكن بماذا تريدون أن تبدأ بـبرمجة محركات الألعاب مباشرة أو تريدون إستعمال محركة من المحركات المجانية

انا اقترح ان نبدأ بالدايركت اكس

وذلك لان الجميع يبدأ بالدايركت اكس فاذا تعلمنا صناعة المحركات فلن ننتج شيئا اما اذا بدأنا في الدايركت اكس فسننتج بعض الاشياء ( كما قال بعض الاخوه)

ارجو ان نبدأ بالدايركت اكس

وشكرا ..........................

#52

يبدو امكم مللتم من API

على العموم ساطرح هذا الدرس عن الاحداث او الرسائل.. لاهميته في برمجة الالعاب..

وسوف اختصر قدر الامكان...

اولا احداث الكيبورد(لوحة المفاتيح)

اهم احداث لوحةالمفاتيح

----------------------------

1-WM_KEYDOWN

اذا ضغط على احدى المفاتيح

2-WM_KEYUP

بعد الضغط على احدى المفاتيح

الان لاستخدام احد الرسائل السابقة لابد ان نبين ماهو المفتاح الذي انضغط ..ولكن كيف؟؟

لاحظ

 case WM_KEYDOWN:
        switch(wParam) 
           {
            case VK_F1:

يعني نسأل ماهو الزر المضغوط.. فاذا كان ضغط F1 اعمل عملا ما وهكذا....

لاحظ هذا الثابت VK_F1

فهو من ثوابت لوحة المفاتيح واذا اردت معرفة باقي الثوابت فقم بتظليل VK_F1 في الكومبايلر

واضغط الزر الايمن وتظهر قائمة اختر منها GO TO difinition of VK_F1

سيظهر حول الثابت عدد من الثوابت المشابهة مثل:

#define VK_SUBTRACT 0x6D

#define VK_DECIMAL 0x6E

#define VK_DIVIDE 0x6F

#define VK_F1 0x70

#define VK_F2 0x71

#define VK_F3 0x72

#define VK_F4 0x73

#define VK_DOWN 0x28

#define VK_SELECT 0x29

#define VK_PRINT 0x2A

#define VK_EXECUTE 0x2B

#define VK_SPACE 0x20والعديد من الثوابت... كل زر له ثابت(وهو رقم )

ثانيا احداث الفأرة

اهم احداث الفأرة

------------------------------------------------------

WM_LBUTTONDOWN

عندما يتم النقر على الزر الايسر للماوس

WM_LBUTTONUP

بعد النقر على الزر اليسر للماوس

WM_LBUTTONDBLCLK

عندما يتم النقر مرتين متتاليتين على الزر الايسر للماوس

--

WM_RBUTTONDOWN

عندما يتم النقر على الزر الايمن للماوس

WM_RBUTTONUP

بعد النقر على الزر الايمن للماوس

WM_RBUTTONDBLCLK

عندما يتم النقر مرتين متتاليتين على الزر الايمن للماوس

--

WM_MBUTTONDOWN

عندما يتم النقر على الزر الاوسط للماوس

WM_MBUTTONUP

بعد النقر على الزر الاوسط للماوس

WM_MBUTTONDBLCLK

عندما يتم النقر مرتين متتاليتين على الزر الاوسط للماوس

-------------------------------------------------------

وهناك احداث اخرى كتحريك الفأرة وغيرها لكن علينا بالمهم..

مثلا نأخذ مثال على الزر الايسر

هذا مثال توضيحي

switch(msg)
	{
  case WM_LBUTTONDOWN:
 	 
 	 MessageBox(hwnd, "you press left button", "arab team", MB_OK | MB_ICONINFORMATION);
 	 

	break;

اذا ضغط المستخدم الزر الايسر اظهر له رسالة...

وطبق ذلك على باقي الاحداث..

ثالثا احداث اخرى

مثل

WM_CLOSE

وتعني عند اغلاق النافذة

WM_MOVE

عند التحريك

WM_PAINT

عند اعادة الرسم

وهي من اهم الرسائل..متى تحدث

مثلا عند تصغير النافذة ثن تكبيرها او عندما تاتي نافذة فوقها ثم تعود في اعلى النوافذ ونحو ذلك

فلنفرض قمت برسم نص في النافذة وقلت مثلا

case WM_LBUTTONDOWN:
textout("draw text");

بغض النظر عن الدالة فهي للتوضيح..

لو رسمت النص عند نقر الماوس الايسر فانه عند اعادة سم الناذة(مثل عند اعادة تكبيرها)

فان النص سيختفي ..اذا مالحل ؟

الحل تضع النص عند حدث WM_PAINT

وبالتالي النص لن يزول.......

حمل المرفقات وستجد مثال يوضح الهدف

//******************\\ 

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch(msg)
	{
  case WM_LBUTTONDOWN://1
 	 
 	 MessageBox(hwnd, "you press left button", "arab team", MB_OK | MB_ICONINFORMATION);
 	 
  break;

  case WM_KEYDOWN ://2
 	 {
      switch(wParam)//in the above ""WPARAM wParam""
           {
            case VK_F1:
         MessageBox(NULL,"you press f1 ","arab team ",MB_OK | MB_ICONINFORMATION);
      break;

      case VK_SPACE: 
             MessageBox(NULL,"you press space ","arab team ",MB_OK | MB_ICONINFORMATION);
      break;

      default : MessageBox(NULL,"you   press another key ","arab team ",MB_OK | MB_ICONINFORMATION);
      }


 	 }
 	 break;

  case WM_CLOSE:
 	 {
 	 MessageBox(hwnd,"now we will close the window (wm_close)","arab team",MB_OK | MB_ICONINFORMATION);
 	 DestroyWindow(hwnd);
 	 }

  break;

  case WM_DESTROY:
 	 PostQuitMessage(0);
  break;
  default:
 	 return DefWindowProc(hwnd, msg, wParam, lParam);
	}
	return 0;
}

window_click.zip

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#53
اقتباس
انا اقترح ان نبدأ بالدايركت اكس

وذلك لان الجميع يبدأ بالدايركت اكس فاذا تعلمنا صناعة المحركات فلن ننتج شيئا اما اذا بدأنا في الدايركت اكس فسننتج بعض الاشياء ( كما قال بعض الاخوه)

ارجو ان نبدأ بالدايركت اكس

إن كان ذلك رأي الجميع فلا مشكلة لدي و سأبدأ به في أقرب فرصة إن شاء الله

و تشكر أخي الشمري على التفاعل و الشرح الرائع أشكرك أخي

و أنا متأسف لأن كان يجب أن أشرح البارحة و لكن للأسف ضروف عطلتني على ذلك و لكن سأشرحها عاجلا أم آجلا

#54
GameDev4Arab كتب:
إن كان ذلك رأي الجميع فلا مشكلة لدي و سأبدأ به في أقرب فرصة إن شاء الله

اظن انه راي الجميع ولذلك ابدأ بالدايركت اكس

وشكرا ......

#55
اقتباس
اظن انه راي الجميع ولذلك ابدأ بالدايركت اكس

وشكرا ......

و الله أخي المشكلة هي الوقت و الدراسة

إن شاء الله سيكون ذلك و لكن بعد 20 يوم أو أكثر أي بعد العطلة :)

#56

اخي الشمري او gamedev4arab

ارجو منكم شرح هذه الدوال

PeekMessage()
GetMessage()
TranslateMessage( &msg );
            DispatchMessage( &msg );

وبرامترات كل واحده

تم تعديل هذه المشاركة بواسطة majnona_ في 27 أبريل 2005 في 19:00

#57

بعض الدوال شرحتها في الدروس السابقة وبعضها :

في MSDN

http://msdn.microsoft.com/library/default....peekmessage.asp

هنا شرح لاحد الدوال التي طلبت وابحث عما تريد.

او ستجدها في ملف HELP ممتاز وضعته في موضوع دليلك لتعلم السي .....

/index.ph...=0entry317152

او مباشرة حمله من هنا

http://info.borland.com/devsupport/borland...es/BC52HLP1.ZIP

اذا لم تستطع فهمها سأحاول شرحها

لكن مثل هذه الدوال لاتهم كثيرا معرفة كل التفاصيل.. لانها لن تتغير في جميع برامجك

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#58

اخي انا حاولت ان افهمها من عدة مصادر انجليزيه ولكني حقا لم افهمها

افهمها ومن ثم انساها ( ليس فهم دقيق )

لذلد ارجو منك شرح الدوال التي اعطيتك اياهن

وايضا ارجو منك شرح برامترات هذه الدوال

INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
DefWindowProc( hWnd, msg, wParam, lParam )

وشكرا .........

تم تعديل هذه المشاركة بواسطة majnona_ في 28 أبريل 2005 في 15:34

#59
 int WINAPI WinMain(HINSTANCE  hInst,
      HINSTANCE  hPreInst, 
      LPSTR   lpszCmdLine, 
      int    nCmdShow )

هذه الدالة التي ينطلق منها البرنامج مثل

()main

وبارمتراتها..

1- مقبض برنامجك..

2- هذا البارمتر لافائدة منه فهو للانظمة القديمة

3- لا اذكره بالظبط

4- هذا البارمتر يستخدم عند اظهار النافذة

لاحظ

ShowWindow(hWnd, nCmdShow );

وهو نفسه المكتوب..

----

LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )

اول بارمترين شرحت كثيييرا

1- مقبض النافذة يعني ماهي النافذةالتي نتعامل معها

2- ماهي الرسالة ..

البارمترين الاخرين لست متاكد منهما عشان كذا لا اريد ان اقول شي واعتقد انه خطأ

ولكن تقدم ولاتتوقف من اجل WPARAM wParam, LPARAM lParam ... :)

----

DefWindowProc( hWnd, msg, wParam, lParam )

نفس بارمترات الدالة السابقة لكن معناها

ياويندوز اذا جاك اي رسالة اخرى تعامل معها على كيفك ....

-----

TranslateMessage( &msg );
           DispatchMessage( &msg );

هاالدالتين سرحتها في الدروس السابقة ....

----

PeekMessage()

هذه لم اتعامل معها .. لذا اعتذر .

GetMessage()

احصل على الرسائل..

وهي تتطلب اربع بارمترات

وهي على الصورة التالية

BOOL GetMessage(

    LPMSG lpMsg,	// address of structure with message
    HWND hWnd,	// handle of window
    UINT wMsgFilterMin,	// first message
    UINT wMsgFilterMax  // last message
   );

اول بارمتر هو عنوان التركيب الخاص بالرسالة .. يعني عنوان

 MSG   msg;

الثاني مقبض النافذة .. ووضعناها NULL لان على مافهمت .. يعني احصل على جميع الرسائل من اي نافذة ..تنتمي لتشعبات رسائل معينة

المهم حطها null وخلاص

اخر بارمترين هذا ما وجدت

البارمتر الثالث

Specifies the integer value of the lowest message value to be retrieved.

البارمتر الرابع

Specifies the integer value of the highest message value to be retrieved.

----

ولاتهتم كثيرا لهذا النوع من الدوال .. فهناك الكثير الكثير مما يجب عليك معرفته .. مثل انشاء مربع حوار.. رسم --التعامل مع الصور

لاتحاول ان توقف مسيرتك من اجل دالة وحاول تنظم وقتك بين الدايركت اكس و win api

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#60
الشـمري كتب:
[

لاتحاول ان توقف مسيرتك من اجل دالة وحاول تنظم وقتك بين الدايركت اكس و win api

شكرا لك اخي الشمري

ولكن لدي ملاحظه وهي

من قال لك انني توقفت على مثل هذه الدوال ... ابدا

لم اتوقف ولن اتوقف على مثل هذه الدوال

وشكرا مره اخرى ....

هذا الموضوع مغلق.

مواضيع مشابهة