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

Win32

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

كنت أريد للأعضاء مراجعة بعض الكتب الخاصة في هذا المجال كي نبدأ مباشرة

و أما عن الشرح بعد يوم أو يومين سأرى كيف أغير طريقتي في الشرح و أتمنى أن تكون أحسن من هذه

و شكرا

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

#27

يا اعضائنا الحبايب لاتستعجلون ... حبة حبة .. اذا استطعت فهم اول درسين خلا يومين بس هذه معجزة الن مثل هالمواضيع صعبة شوي.

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#28

يبدو انكم فاهمين كيفية انشاء النافذة.. ولكن زيادة الخير خيرين..

اود اضافة درس مختصر ومبسط عن دوال API

ساركز على التسهيل قدر المستطاع..

لانشاء نافذة باستخدام دوال api

1- تسجيل النافذة

لنسجلها لابد من تعيين خصائصها مثل ايقونة لنافذة لون الخلفية الستايل العام للنافذة ونحوها

2- صنع النافذة وذلك باستخدام دالة معينة سهلة

3- اضهار النافذة وتحديثها

4- ادخل الرسالة في دوامة الرسائل

5- تفسير الرسائل ووضع الاحداث المناسبة

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

لتسجيل النافذة نحتاج الى انشاء struct... جديد هكذا

WNDCLASSEX wc;

وتسميه ماتريد انا سميته wc

نعين خصائصها وهي قرابة 12 خاصية لايلزم كتابتها كلها فقط المهم فمثلا

wc.cbSize = sizeof(WNDCLASSEX);//الحجم
wc.style   = 0;الستايل العام
wc.lpfnWndProc  = WndProc;مهم...وهواسم دالة الرسائل
wc.cbClsExtra  = 0;غالبا صفر
wc.cbWndExtra  = 0;غالبا صفر
wc.hInstance  = hInstanceاسم مقبض  الفئة  وهو مهم  للغاية;  
wc.hIcon   = LoadIcon(NULL, IDI_APPLICATION);..الايقونة 
wc.hCursor = LoadCursor(NULL, IDC_ARROW);مؤشر الماوس
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);لون الخلفية
wc.lpszMenuName  = NULL;هل نريد قوائم ..الان لانريد لذلك وضعناها NULLوممكن لانكتب هذا السطر  نهائيا 
wc.lpszClassName = "myWindowClass"; اسم التركيب 
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

الان نسجل النافذة ولكن نتاكد ان كل شي على مايرام

فنضع جمل شرط فاذا استطاع تسجيل النافذة او يظهر سالة خطا

if(!RegisterClassEx(&wc))
	{
  MessageBox(NULL, "Window Registration Failed!", 

"Error!",
  	MB_ICONEXCLAMATION | MB_OK);
  return 0;
	}

ثانيا

نصنع النافذة باستخدم دالة

CreateWindowEx(
  WS_EX_CLIENTEDGE,
   "myWindowClass",
  "The title of my window",
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
  NULL, NULL, hInstance, NULL);

ولكن قبل ذلك ننشئ مقبض جديد او هاندل

HWND hwnd;

فائدته

لنفرض انك انشئت برنامج مكون من خمسين نافذة كيف يعرف الوندوز ان مثلا ضغطة الماوس

كانت بالنافذة رقم 22 مثلا

الجواب عن طريق المقبض

فكل نافذة لها مقبض وتستطيع انشاء اكثر من نافذة وذلك بانشاء اكثر من مقبض هكذا

HWND hwnd1;

HWND hwnd2;

HWND h3;

ونفس الامر مع مقبض البرنامج فبرنامجك بشكل عام له مقبض

يختلف عن البرامج الاخرى

wc.hInstance = hInstance;

نعود الى دالة صنع النافذة وهي تتطلب عدة بارمترات وهي

اول بارامتر:

الثاني:هو اسم التركيب الذي انشأته

wc.lpszClassName = "myWindowClass";

الثالث: هو اسم النافذة وهو الذي يظهر على شريط العنوان العلوي

الرابع: الستايل العام للنافذة.. الحدود زر التكبير والتصغير وغيرها

فصلها اخي gamdev

--

CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,

هذه تعين موقع النافذة واخترنا الموقع الافتراضي "" السيني والصادي""

و 240 و 120 هي طول وعرض النافذة

بعد ذلك وضعنا NULL حيث يطلب هذا البارمتر ما يسمى بـ hWndParent

وهو خاص بالنافذة من نوع MDI

حيث هناك نوعين (او ثلاث انواع مش متاكد)من النوافذ

الاولىSDI ,وهو البرنامج المكون من نافذة واحدة مثل المفكرة

والنوع الاخر mdi وهو للنوافذ المتعددة مثل برنامج الوورد

--

بم ان برنامجنا لايحتوي على قائمة وضعنا NULL

والبارمتر قبل الاخير وضعنا اسم مقبض البرنامج hInstance

والاخير NULL

------

الان نظهر النافذة ونحدثها

ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd

);

---

الخطوة الثالثة دوامة الرسائل

ماهي الرسائل

نقرة الماوس او تحريكها

ضغطة الكيبورد

تحريك النافذة او تصغيرها ونحو ذلك

وغيرها من الرسائل

---

فنحن ننتظر اي رسالة ترد الى النافذة

ولكن قبل ذلك نحن ننشئ فئة(او structure)

للرسائل هكذا

MSG Msg;

وسمها ماتريد

while(GetMessage(&Msg, NULL, 0, 0) > 0)
	{
  TranslateMessage(&Msg);//تعرف ياويندوز على الرسالة
  DispatchMessage(&Msg);//ارسلها الى من يهمه الامر :)

	}
	return Msg.wParam;
}

الان ندخل بدالة فرعية وهي دالة الرسائل

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM 
wParam, LPARAM lParam)

{
	switch(msg)
	{
  case WM_CLOSE:
  	DestroyWindow(hwnd);
  break;
  case WM_DESTROY:
  	PostQuitMessage(0);
  break;
  default:
  	return DefWindowProc(hwnd, msg, 

wParam, lParam);
	}
	return 0;
}

الشرح

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM 
wParam, LPARAM lParam)

صيغة كتابة الدالة ولاحظ ان اسمها

WndProc

وهو نفس الذي كتبناه عند تسجيل النافذة

wc.lpfnWndProc = WndProc;

وتتطلب اربع بارامترات .. لاتهتم كثيرا بتفاصيل الدالة كل ما عليك التركيز على اسمها فقط..

ولاننسى البارمترات.. من اهم البارامترات الثاني UINT msg وهو يعني نوع الرسالة

الحاضرة... وكما قلت لاتخشى هذه الدالة..

switch(msg)

نقول له اختبر الرسالة الواردة

	case WM_CLOSE:

هل هي رسالة اغلاق النافذة

DestroyWindow(hwnd);

اذا اعدم النافذة :)

case WM_DESTROY:
PostQuitMessage(0);

اذا تم انهاء البرنامج

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

default:
return DefWindowProc(hwnd, msg, wParam, lParam);

خلاص كذا انشأت نافذة

صحيح قد تكون طويلة ولك مع الوقت ستجد انها (( لعب عيال )) لكن

اكتبها مرة مرتين ثالث وحاول تحفظها واجلس عليها يومين او ثلاث لانك اذا فهمت هذا

الدرس فهمت دوال apiكلها واذا حاولت تجاهل هذا الدرس فانصحك بالتوجه للبيسك افضل

-----

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

ايقوناتها والتعامل مع انواع اخرى من الرسائل

اعتذر ان كان هناك اخطاء في الشرح.. ولكن كتبتها على عجلة.. لضيق الوقت.

الدرس القادم رح يكون عن الرسالة وتغيير خصائصها

MessageBox(NULL, "Window Registration Failed!", "Error!",

MB_ICONEXCLAMATION | MB_OK);

ورح نتكلم عنها بتوسع

اي جزئية غير مفهومة عن الدرس اسأل... لكن بعد يوم او يومين حتى تفهم الدرس.. :rolleyes:

ولاتنسى المرفقات

simple_window.zip

تم تعديل هذه المشاركة بواسطة الشـمري في 15 أبريل 2005 في 21:57

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#29

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

حقا ان شرحك هو الشرح المطلوب زيادته لشرح الاخ GAMEDEV4ARAB ولا اظن ان احد لن يفهم بعد شرحك وشرحه ( GAMEDEV4ARAB) شكرا لك اخي وارجو التقدم بنا اكثر واكثر

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

#30

السلام عليكم

بارك الله فيك أخي إبراهيم و مشاء الله عليك و على أسلوبك الرائع في الشرح و أتمنى الإستمرار

و إشاء الله سنبدأ بالتقدم أكثر

و السلام

#31
GameDev4Arab كتب:
السلام عليكم

بارك الله فيك أخي إبراهيم و مشاء الله عليك و على أسلوبك الرائع في الشرح و أتمنى الإستمرار

و إشاء الله سنبدأ بالتقدم أكثر

و السلام

متى ؟؟

ارجو ان نتقدم اكثر من هذا التقدم

ولكن قبل ان نتقدم ارجو شرح كل شيء بدقه ..... فمثلا مثال الكره ارجو شرحه من اي احد من الاخوه ويفضل ان يكون مثل شرح الاخ ( الشمري )

لاني المثالين الاولين فهمتهن وبقي مثال الكره .....................

#32

طبعا التقدم سيكون متواصل أي بلا نهاية

و بالنسبة لمثال الكرة .. راجع كتاب forgers win32 tutorial arabic أضن أن به مثال مشابه لهذا و إن كانت لديك مشكلة فيها أرجو التدقيق في السؤال فيها بمعنى آخر أرجو أن تقول الشىء الذي لم تفهم بالضبط

و هذا ليس المثال الآخر لها بل ستكون أمثلة في المستقبل مشابها لها كي يستطيع الجميع الفهم

و السلام عليكم

#33
GameDev4Arab كتب:
طبعا التقدم سيكون متواصل أي بلا نهاية

و بالنسبة لمثال الكرة .. راجع كتاب forgers win32 tutorial arabic أضن أن به مثال مشابه لهذا و إن كانت لديك مشكلة فيها أرجو التدقيق في السؤال فيها بمعنى آخر أرجو أن تقول الشىء الذي لم تفهم بالضبط

و هذا ليس المثال الآخر لها بل ستكون أمثلة في المستقبل مشابها لها كي يستطيع الجميع الفهم

و السلام عليكم

اخي هذا الكتاب عندي وموجود به المثال ولكن المثال في الصفحات الاخيره وهو بطريقه مختلفه وبدوال مختلفه

فارجو ان تشرح المثال مره اخره لانك وبصراحه شرحك كان ضعيف جدا في مثال الكره

وارجو بعد شرح المثال الاخير التقدم وعدم التوقف ( فمثلا لماذا اليوم ومبارح لم تشرحو شيئا) انا اسف ولكني متحمس ولا اريد ان تطير حماستي

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

تم تعديل هذه المشاركة بواسطة majnona_ في 17 أبريل 2005 في 21:25

#34

جيد لأن الكتاب معك ..إذا لم يبقى إلى أن تدرسه ... و هكذا نستطيع مساعدة بعضنا البعض

و بالنسبة لمثال الكرة فسيتم شرحه في أقرب فرصة إن شاء الله

و لا تستعجل أخي الكريم

و السلام

#35

انا تعمدت تاخير الدروس الان.. حتى يفهم الدرس الاول جيدا...

يجب فهمه كاملا..ان لم يحفظ ...

---------

بالنسبة لمثال الكرة..

هو مثال متقدم.. اقصد من ناحية api

والاخ gamedev4arab عندما وضعه..وضعه لان له علاقة ببرمجة الالعاب ( التصادم)

ونستطيع برمجة نفس المثال بopengl او directx .. وهذا الاسهل....

قبل ان ندرس هذا المثال يجب ان تعرف معنى

HDC

RECT

HBRUSH

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

تذكر..تذكر..تذكر.. ان ليس المهم معرفة كيف رسم دائرة او مربع بواسطة API ولكن المهم معرفة

درس انشاء نافذة

درس وضع النافذة FULL SCREEN

معرفة HDC و RECT

معرفة بعض الرسائل الهامة...

هذا مايفيدنا في برمجة الالعاب..

بالنسبة لمثال الكرة.. اهم مافيه الاصطدام ..يعني. هذا الكود

if(x + 30 > rect.right || x < 0)

{

dX = -dX;

}

if(y + 30 > rect.bottom || y < 0)

{

dY = -dY;

}

--- """لا نريد المزيد من الكلام""" انتظروا يوم وساضيف درس بسيط...

وياليت اللي يقدر يضيف درس عن HDC او RECT اوHBRUSH او الرسائل.. فليساعدنا.

تم تعديل هذه المشاركة بواسطة الشـمري في 17 أبريل 2005 في 23:06

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#36
اقتباس
HDC او RECT اوHBRUSH او الرسائل

سأحوال بعد يوم او يومين إن شاء الله

و شكرا على التفاعل

#37

السلام عليكم

نشرح اليوم كل من ::

HDC
HBRUSH
RECT

مع مثال الكرة

أولا ::

HDC

و التي هي

   Handle Device Context

و هي خاصة بـ

GDI

و نحتاجها في إعداد و تهيئة مقبض أداة البيئة.

أما في المثال الأخير نلاحظ

hdc = GetDC(hWnd);

هنا نقوم بإنشاء أداة البيئة في مقبض النافذة الخاصة بنا أي بمعنى آخر نقوم بالرسم داخل نافذتنا

hWnd

و هذا يعني أننا قمنا بربط نافذتنا بـ

GDI(Graphics Device Interface)

و أما في

FillRect(hDC, &temp, brush);

إستدعين هنا كلا من

HDC

و التي شرحناها من قبل و إستدعين أيظا

Temp

التي

temp.left = oldX;
temp.top = oldY;
temp.right = oldX + 30;
temp.bottom = oldY + 30;

بالنسبة إلى

temp.left = oldX;
temp.top = oldY;

يمكن الإستغناء عنهما و لكنهما يقومان بتحسن البرنامج ... سأقول لك كيف : قم بحذفهما و بعد ذلك في كل من

temp.right = oldX + 30;
temp.bottom = oldY + 30;

إجعلها :

temp.right = oldX;
temp.bottom = oldY;

و ستلاحض الفرق

هي أشياء غير ظاهرة و لكن من الأفضل تحسنها

و إستدعين أيظا

Brush

و هي معرفة كالتالي :

brush=(HBRUSH)SelectObject(hDC,GetStockObject(WHITE_BRUSH));

أي أنها اللون الأبيض و هذا لون خليفية الكرة و كي تلاحظ ذلك قم بتغير

wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

إلى

wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);

أما :

Ellipse(hDC, x, y, 30 + x, 30 + y);

فهي حجم الكرة و

oldX = x;
oldY = y;

فهو تحديث لـ

oldX & oldY

إلى

X & Y

و التي تساعدان على المسح المباشر... قم بحذفهما و لاحظ الفرق.

أما

x += dX;
y += dY;

فهي وضعية أي مكان الكرة التي يتم الزيادة فيها كل 0.02 ثانية بـ 5 درجات و نلاحض أن :

Static int dX = 5;
static int dY = 5;

هذا يعني أنه سيتم حفظ تغير كلا منها و إن قمت بحذف

static

فإن الكرة لن تتحرك من مكانها

و أما هنا ::

if(x + 30 > rect.right || x < 1)
               {
                    dX = -dX;
               }

               if(y + 30 > rect.bottom || y < 1)
               {
                    dY = -dY;
               }

فهي كما قال الأخ الشمري فهي لتصادم و إن أردت التحسين فيها قليلا قم بالإضافة إليها

if(x - 30 < rect.left || x > -1)
               {
                    dX = +dX;
               }
               if(y - 30 < rect.top || y > -1)
               {
                    dY = +dY;
               }

------

هذا المثال معقد قليلا و لكنه يحتاج إلا القليل التركيز و التفكير فيه

أعرف أن شرحي غير كامل و غير كافي لذا أتمنى باقي الأعضاء الزيادة عليه

و سأتوقف أنا هنا إلى يوم الجمعة إن شاء الله و في بداية صناعة المحركات للألعاب الثنائية

الألعاب

و السلام عليكم

#38
GameDev4Arab كتب:
------

و سأتوقف أنا هنا إلى يوم الجمعة إن شاء الله و في بداية صناعة المحركات للألعاب الثنائية

الألعاب

و السلام عليكم

اولا اخي ارجو منك شرح ماذا تعني بمحرك ( محرك ثلاثي ابعاد ومحرك ثنائي ابعاد)

ولماذا سنبدا بالمحرك الثنائي الابعاد؟؟

وثانيا ارجو منك شرح التالي في مثال الكره

if(x - 30 < rect.left || x > -1)
               {
                    dX = +dX;
               }
               if(y - 30 < rect.top || y > -1)
               {
                    dY = +dY;
               }

ماذا تعني dX = +dX; و dY = +dY; و rect.left و rect.top

كما وملاحظه اخرى

وهي انك قلت

" فهي وضعية أي مكان الكرة التي يتم الزيادة فيها كل 0.02 ثانية بـ 5 درجات "

ما ادرانا ان بكل ثانيه 0.02

وايضا انت قلت ان oldX=x and oldY=y

لتحديث القيم

اخي الكل يعرف انه لتغيير القيم ولكن قيم من ولماذا نحن بحاجه لتغيير القيم

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

وشكرا

تم تعديل هذه المشاركة بواسطة majnona_ في 18 أبريل 2005 في 17:21

#39
اقتباس
اولا اخي ارجو منك شرح ماذا تعني بمحرك ( محرك ثلاثي ابعاد ومحرك ثنائي ابعاد)

ولماذا سنبدا بالمحرك الثنائي الابعاد؟؟

محرك ثلاثي الأبعاد ستستعمل فيه كل من دوال الماء و الأبواب و شخصيات ثلاثية الأبعاد و و و ...

أما ثنائي لن نحتاج إلى القليل من الدوال لتركيب الصور و تحريكها و و و ...

و سنبدأ بالثائي الألعاب لأننا في هذه الحالة يمكننا الإستغناء على كل من DirectX & OpenGL

و أما عن التصادم الذي تريد شرحا له فـ غدا إن شاء الله سأضع لك شرحا كافي

...

#40

ارجو منك شرح التالي في مثال الكره

if(x - 30 < rect.left || x > -1)
               {
                    dX = +dX;
               }
               if(y - 30 < rect.top || y > -1)
               {
                    dY = +dY;
               }

ماذا تعني  dX = +dX; و     dY = +dY;  و rect.left  و rect.top

كما وملاحظه اخرى

وهي انك قلت

"  فهي وضعية أي مكان الكرة التي يتم الزيادة فيها كل 0.02 ثانية بـ 5 درجات  "

ما ادرانا ان بكل ثانيه 0.02

وايضا لماذا نحتاج الى هذا الكود

temp.left = oldX;

temp.top = oldY;

temp.right = oldX + 30;

temp.bottom = oldY + 30;

وماذا يعمل ( اهو تصادم ام تحريك ام ماذا) ولماذا نحتاجه

وايضا انت قلت ان  oldX=x and oldY=y

لتحديث القيم

اخي الكل يعرف انه لتغيير القيم ولكن قيم من ولماذا نحن بحاجه لتغيير القيم

ملاحظات :-

1- اخي ارجو منك ان تقول بشرح كل الدوال من البدايه ومن خلال شرحك تجيب عن التالي( لماذا نحتاج هذه الداله وماذا عملها )

2- هل سندخل على المحرك الثلاثي الابعاد قبل الدايركت اكس ( اعتقد لا)

اخي ارجو الاجابه عن هذه الملاحظات ايضا

وشكرا

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

#41

إن شاء الله أخي الكريم سيتم الإجابة على جميع أسألتك في أقرب فرصة و أما بالنسبة للمحركات الثلاثية الأبعاد فهي قبل الدايركت اكس طبعا

#42

اولا اشكرك اخي على شرحك المميز واعتذر عن التاخر لاني واجهت اشغااااال كثيرة.

---

اقتباس
هل سندخل على المحرك الثلاثي الابعاد قبل الدايركت اكس

يا اخي يبدو عندك لبس في الموضوع...

حتى نعمل محرك لا بد من اتقان directx و opengl ...

وحتى نتقن الداريكت اكس او اوبنجل يستحسن البدء مع محركات جاهزة..

ماهو المحرك..

بدلا من كتابة 20 سطر لانشاء نافذة ..نضع هذه الاسطر في كائنات

class

وبالتالي فيسطرين او ثلاث ننشئ نافذة..

--

فما يقصده gamedev4arab

و سأتوقف أنا هنا إلى يوم الجمعة إن شاء الله و في بداية صناعة المحركات للألعاب الثنائية

الألعاب

===

يعني بدل من كتابة عشرات الاسطر سنحاول وضعها في كائنات لنوفر الوقت والجهد..

ليس الامر مخيف لهذا الدرجة من الاسئلة :lol:

واشكرك اخي majnona_ على حماسك

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

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#43

الحقيقة طولت ما اتمعنت فى المنتدى.

لانى كنت اظن انه قد اوقف :( و لكنى بالصدفة وجده قائم بذاته و ليس فرعا

و الدروس جميلة و لكن ارجو ان تواصل الر الامام حتى تلحق ب OpenGL و DirectX

#44

اليوم درسنا سيكون باذن الله عن الرسالة ...

لعمل رسالة تظهر للمستخدم نستخدم الداله التالية:

MessageBox

لاحظ الحروف الكبيرة والصغيرة...

وصيغتها

MessageBox(HWND , LPCTSTR , LPCTSTR  , UINT  );

البارمترات

1- مقبض النافذه

2-نص الرسالة

3-العنوان

4-نوع الرسالة

ملاحظة صغيرة .. LPCTSTR دائما تعني نص كانك تقول*char

فاي دالة في مربعها الاصفر الذ يظهر عندما تفتح اقواس

تطلب بارمتر معرف كـ LPCTSTR اعرف ان هذا البارمتر نص.

===

المقبض له حالتان احيانا

NULL

,واحينا نكتب المقبض

===

نص الرسالة معروف ,وهو الذي يظهر داخل الرسالة

عنوان الرسالة معروف وهو الذي يظهر على الشريط العلوي للرسالة

انواع الرسالة..وهي تعني الازرار التي تظهر على الرسالة فاحيانا تشاهد زر واحيانا اكثر

،،،،

MB_OKزر اوكي بس

MB_OKCANCEL

اوكي وكنسل

MB_ABORTRETRYIGNORE

هنا اذا كتبنا هذا الثابت تظهر رسالة فيها ثلاث خيارات جربها وشف

MB_YESNOCANCEL

أو

MB_YESNO

أو

MB_RETRYCANCEL

أو

MB_CANCELTRYCONTINUE

أو

MB_HELP

#include"windows.h"


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR sd,int s)
{
	MessageBox(NULL,"ALSLAM \n\n ALAIKUM","FIRST", MB_OKCANCEL );
	return 0;

}

لاحظ عند تشغيل المثال السابق يظهر زرين احدهما

defult

يعني اذا ضغطت انتر كانك ضاغط على موافق

فكيف يمكنني ان اجعل الزر الاخر هو defult

بسيطة نحط احد هذه

MB_DEFBUTTON1

الزر الاول الافتراضي

====

MB_DEFBUTTON2

الثاني

MB_DEFBUTTON3

الثالث

MB_DEFBUTTON4

الرابع

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

مثال يجعل الزر الافتراضي كنسل(الثاني)

#include"windows.h"

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR  ,int  )
{
	MessageBox(NULL,"ALSLAM ALAIKUM","FIRST", MB_OKCANCEL | MB_DEFBUTTON2 );
	return 0;

}

لاحض عند الجمع بين خاصيتين نستخد المؤثر

OR

أو

|

بجانب عدد الازرار هناك انواع الايقونات التي تظهر مع الرسالة فاحيانا تظهر ايقونة تعجب او تحذير او استفهام وغيره فكيف نعمل ذلك بسيطة

في البرامتر الاخير نكتب احد هالأنواع

MB_ICONEXCLAMATION أو MB_ICONWARNING

نفس الشي وتعطي علامة صفراء تخذير للمستخدم

MB_ICONINFORMATION أو MB_ICONASTERISK

تعطي علامة تعجب زرقاء تدل على معلومة

MB_ICONQUESTION

علامة استفهام

MB_ICONSTOP أو MB_ICONERROR أو MB_ICONHAND

علامة خطأ

مثال على استخدام لأيقونة

#include <windows.h>

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE,
                   LPSTR, int)
{
    MessageBox( NULL,
                "Welcome to Win32 Application Development\n"
                "You will learn about functions, classes, "
                                 
                "first",
                MB_YESNOCANCEL | MB_ICONQUESTION);//see

    return 0;
}

وأخبرا ممكن تكون الرسالة كذا

MessageBox(NULL, NULL, NULL, NULL);

أو

MessageBox(NULL, "I am just trying my wedding dress", NULL, NULL);

خلصنا

طيب

نفرض انك سويت لعبة ضخمة كهالف لايف مثلا.. واردت ان تجعل لعبتك عالمية

فقررت ان تضيف لها ميزة وهي ان تكون بملئ الشاشة

ولكن هناك من عارضك وقال انه يريدها كشاشة عادية.. فانت قررت ارضاء الطرفين

بعرض رسالة عليها ايقونة سؤال وتقول في الرسالة

هل تريد وضع الشاشة كـfullscreen او لا..

ووضعت له خياران احدهما نعم والاخر لا..

فاذا ضغط نعم تصير FULL SCREEN

واذا ضغط لا تصير شاشة عادية .. ماهو الكود المستخدم؟

انظر

if (MessageBox(NULL,"FULL SCREEN?","SHAMMARI",MB_YESNO|MB_ICONQUESTION )==IDYES)
	{  
COUT<<"FULL SCREEN >>> WAIT PLEASE";
ELSE 
COUT<<"OK ,,,,NORMAL; SCREEN ";
}

طبعا المثال توضيحي فقط..

لاحظ قلنا

==IDYES

يعني اذا كانت قيمة الرسالة IDYES

اجعلها فل سكرين

والا

اجعلها شاشة عادية

طبعا ينطبق الامر على باقي الازرار...

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

لاتنسى ان هذه الدالة ستواجهنا في برمجة الالعاب... خاصة ان في برمجة الالعاب الكثير من الاخطاء التي

تؤدي الى وجوب اظهار الرسائل

واعتذر عن عدم وضع امثلة مرفقة

لاني فرمت الجهاز وما نزلت السي... انتظروا يوم او اثنين ورح اضع مرفقات الدرس...

سلام....

تم تعديل هذه المشاركة بواسطة الشـمري في 19 أبريل 2005 في 21:52

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#45

السلام عليكم

باك الله فيك أخي الشمري

و أشكرك على التفاعل

و باللنسبة لـ

اقتباس
و الدروس جميلة و لكن ارجو ان تواصل الر الامام حتى تلحق ب OpenGL و DirectX

نحتاج إلى شهر واحد كحد أقصى للوصول إليهما

و إن شاء الله سنكمل غدا إن شاء الله مع آخر شرح في هذا الموضوع

و السلام عليكم

#46

""""و إن شاء الله سنكمل غدا إن شاء الله مع آخر شرح في هذا الموضوع"""

اتمنى اعطائي مهلة ثلاثة ايام لاضيف موضوعين او اكثر عن api قبل ان ندخل بالامور الاخرى... والراي رأيك...

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#47

بالنسبة لي فغدا هو آخر شرح في هذا الموضوع

و أما إن كنت أنت تريد الزيادة فذلك أفضل :)

#48

ok

تم تعديل هذه المشاركة بواسطة الشـمري في 21 أبريل 2005 في 16:40

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#49

السلام عليكم

تاخرت

هذا مثال بسيط يوضح استخدام الرسالة

الدرس القادم عن الرسائل( رسائل الماوس والكيبورد)

ان شاء الله

message 1.zip

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#50

و عليكم السلام

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

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

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

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