كنت أريد للأعضاء مراجعة بعض الكتب الخاصة في هذا المجال كي نبدأ مباشرة
و أما عن الشرح بعد يوم أو يومين سأرى كيف أغير طريقتي في الشرح و أتمنى أن تكون أحسن من هذه
و شكرا
تم تعديل هذه المشاركة بواسطة GameDev4Arab في 15 أبريل 2005 في 21:34
كنت أريد للأعضاء مراجعة بعض الكتب الخاصة في هذا المجال كي نبدأ مباشرة
و أما عن الشرح بعد يوم أو يومين سأرى كيف أغير طريقتي في الشرح و أتمنى أن تكون أحسن من هذه
و شكرا
تم تعديل هذه المشاركة بواسطة GameDev4Arab في 15 أبريل 2005 في 21:34
يا اعضائنا الحبايب لاتستعجلون ... حبة حبة .. اذا استطعت فهم اول درسين خلا يومين بس هذه معجزة الن مثل هالمواضيع صعبة شوي.
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
يبدو انكم فاهمين كيفية انشاء النافذة.. ولكن زيادة الخير خيرين..
اود اضافة درس مختصر ومبسط عن دوال 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:
ولاتنسى المرفقات
تم تعديل هذه المشاركة بواسطة الشـمري في 15 أبريل 2005 في 21:57
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
شكرا لك اخي الشمري
حقا ان شرحك هو الشرح المطلوب زيادته لشرح الاخ GAMEDEV4ARAB ولا اظن ان احد لن يفهم بعد شرحك وشرحه ( GAMEDEV4ARAB) شكرا لك اخي وارجو التقدم بنا اكثر واكثر
وشكرا ................
السلام عليكم
بارك الله فيك أخي إبراهيم و مشاء الله عليك و على أسلوبك الرائع في الشرح و أتمنى الإستمرار
و إشاء الله سنبدأ بالتقدم أكثر
و السلام
GameDev4Arab كتب:السلام عليكمبارك الله فيك أخي إبراهيم و مشاء الله عليك و على أسلوبك الرائع في الشرح و أتمنى الإستمرار
و إشاء الله سنبدأ بالتقدم أكثر
و السلام
متى ؟؟
ارجو ان نتقدم اكثر من هذا التقدم
ولكن قبل ان نتقدم ارجو شرح كل شيء بدقه ..... فمثلا مثال الكره ارجو شرحه من اي احد من الاخوه ويفضل ان يكون مثل شرح الاخ ( الشمري )
لاني المثالين الاولين فهمتهن وبقي مثال الكره .....................
طبعا التقدم سيكون متواصل أي بلا نهاية
و بالنسبة لمثال الكرة .. راجع كتاب forgers win32 tutorial arabic أضن أن به مثال مشابه لهذا و إن كانت لديك مشكلة فيها أرجو التدقيق في السؤال فيها بمعنى آخر أرجو أن تقول الشىء الذي لم تفهم بالضبط
و هذا ليس المثال الآخر لها بل ستكون أمثلة في المستقبل مشابها لها كي يستطيع الجميع الفهم
و السلام عليكم
GameDev4Arab كتب:طبعا التقدم سيكون متواصل أي بلا نهايةو بالنسبة لمثال الكرة .. راجع كتاب forgers win32 tutorial arabic أضن أن به مثال مشابه لهذا و إن كانت لديك مشكلة فيها أرجو التدقيق في السؤال فيها بمعنى آخر أرجو أن تقول الشىء الذي لم تفهم بالضبط
و هذا ليس المثال الآخر لها بل ستكون أمثلة في المستقبل مشابها لها كي يستطيع الجميع الفهم
و السلام عليكم
اخي هذا الكتاب عندي وموجود به المثال ولكن المثال في الصفحات الاخيره وهو بطريقه مختلفه وبدوال مختلفه
فارجو ان تشرح المثال مره اخره لانك وبصراحه شرحك كان ضعيف جدا في مثال الكره
وارجو بعد شرح المثال الاخير التقدم وعدم التوقف ( فمثلا لماذا اليوم ومبارح لم تشرحو شيئا) انا اسف ولكني متحمس ولا اريد ان تطير حماستي
وشكرا ............
تم تعديل هذه المشاركة بواسطة majnona_ في 17 أبريل 2005 في 21:25
جيد لأن الكتاب معك ..إذا لم يبقى إلى أن تدرسه ... و هكذا نستطيع مساعدة بعضنا البعض
و بالنسبة لمثال الكرة فسيتم شرحه في أقرب فرصة إن شاء الله
و لا تستعجل أخي الكريم
و السلام
انا تعمدت تاخير الدروس الان.. حتى يفهم الدرس الاول جيدا...
يجب فهمه كاملا..ان لم يحفظ ...
---------
بالنسبة لمثال الكرة..
هو مثال متقدم.. اقصد من ناحية 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
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
اقتباسHDC او RECT اوHBRUSH او الرسائل
سأحوال بعد يوم او يومين إن شاء الله
و شكرا على التفاعل
السلام عليكم
نشرح اليوم كل من ::
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;
}------
هذا المثال معقد قليلا و لكنه يحتاج إلا القليل التركيز و التفكير فيه
أعرف أن شرحي غير كامل و غير كافي لذا أتمنى باقي الأعضاء الزيادة عليه
و سأتوقف أنا هنا إلى يوم الجمعة إن شاء الله و في بداية صناعة المحركات للألعاب الثنائية
الألعاب
و السلام عليكم
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
اقتباساولا اخي ارجو منك شرح ماذا تعني بمحرك ( محرك ثلاثي ابعاد ومحرك ثنائي ابعاد)ولماذا سنبدا بالمحرك الثنائي الابعاد؟؟
محرك ثلاثي الأبعاد ستستعمل فيه كل من دوال الماء و الأبواب و شخصيات ثلاثية الأبعاد و و و ...
أما ثنائي لن نحتاج إلى القليل من الدوال لتركيب الصور و تحريكها و و و ...
و سنبدأ بالثائي الألعاب لأننا في هذه الحالة يمكننا الإستغناء على كل من DirectX & OpenGL
و أما عن التصادم الذي تريد شرحا له فـ غدا إن شاء الله سأضع لك شرحا كافي
...
ارجو منك شرح التالي في مثال الكره
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
إن شاء الله أخي الكريم سيتم الإجابة على جميع أسألتك في أقرب فرصة و أما بالنسبة للمحركات الثلاثية الأبعاد فهي قبل الدايركت اكس طبعا
اولا اشكرك اخي على شرحك المميز واعتذر عن التاخر لاني واجهت اشغااااال كثيرة.
---
اقتباسهل سندخل على المحرك الثلاثي الابعاد قبل الدايركت اكس
يا اخي يبدو عندك لبس في الموضوع...
حتى نعمل محرك لا بد من اتقان directx و opengl ...
وحتى نتقن الداريكت اكس او اوبنجل يستحسن البدء مع محركات جاهزة..
ماهو المحرك..
بدلا من كتابة 20 سطر لانشاء نافذة ..نضع هذه الاسطر في كائنات
class
وبالتالي فيسطرين او ثلاث ننشئ نافذة..
--
فما يقصده gamedev4arab
و سأتوقف أنا هنا إلى يوم الجمعة إن شاء الله و في بداية صناعة المحركات للألعاب الثنائية
الألعاب
===
يعني بدل من كتابة عشرات الاسطر سنحاول وضعها في كائنات لنوفر الوقت والجهد..
ليس الامر مخيف لهذا الدرجة من الاسئلة :lol:
واشكرك اخي majnona_ على حماسك
------------------------------
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
الحقيقة طولت ما اتمعنت فى المنتدى.
لانى كنت اظن انه قد اوقف :( و لكنى بالصدفة وجده قائم بذاته و ليس فرعا
و الدروس جميلة و لكن ارجو ان تواصل الر الامام حتى تلحق ب OpenGL و DirectX
اليوم درسنا سيكون باذن الله عن الرسالة ...
لعمل رسالة تظهر للمستخدم نستخدم الداله التالية:
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
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
السلام عليكم
باك الله فيك أخي الشمري
و أشكرك على التفاعل
و باللنسبة لـ
اقتباسو الدروس جميلة و لكن ارجو ان تواصل الر الامام حتى تلحق ب OpenGL و DirectX
نحتاج إلى شهر واحد كحد أقصى للوصول إليهما
و إن شاء الله سنكمل غدا إن شاء الله مع آخر شرح في هذا الموضوع
و السلام عليكم
""""و إن شاء الله سنكمل غدا إن شاء الله مع آخر شرح في هذا الموضوع"""
اتمنى اعطائي مهلة ثلاثة ايام لاضيف موضوعين او اكثر عن api قبل ان ندخل بالامور الاخرى... والراي رأيك...
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
بالنسبة لي فغدا هو آخر شرح في هذا الموضوع
و أما إن كنت أنت تريد الزيادة فذلك أفضل :)
ok
تم تعديل هذه المشاركة بواسطة الشـمري في 21 أبريل 2005 في 16:40
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
السلام عليكم
تاخرت
هذا مثال بسيط يوضح استخدام الرسالة
الدرس القادم عن الرسائل( رسائل الماوس والكيبورد)
ان شاء الله
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
و عليكم السلام
بارك لله فيك و المثال رائع و إن شاء الله القادم أروع
و لكن بماذا تريدون أن تبدأ بـبرمجة محركات الألعاب مباشرة أو تريدون إستعمال محركة من المحركات المجانية
هذا الموضوع مغلق.