الآن علينا تحويل البرنامج السابق الى شاشة توقف شبه كاملة
اين نبدأ وماذا نعدل :
أولا لنعدل الملف الناتج من ملف exe الى ملف scr
اذهب الى القائمةproject
واختر منها Setting
من القائمة المنسدلة على يسارك اختر win32 debug
ومن اليمين اذهب للتبويب debug وعدل في الحقل الاول بدل exe الموجودة بالاخر اكتب scr
وايضا تقدم الى التبويب Link وعدل آخر المكتوب بالحقل الأول بدل EXE اكتب Scr ايضا
عد الى اليسار واختر من اللائحة المنسدلة Win32 Release وكرر نفس العملية في التبويب debug و Link
الآن عنما تنفذ البرنامج ستجد في مكان التنفيذ شاشة توقف وليس برنامج
لكنها ليست شاشة توقف كاملة بل هي برنامج يلبس ثياب شاشة التوقف فقط ولا بد من عمل التعديلات الاساسية
تذكرون الفرق الاول الذي ذكرته بين شاشة التوقف والبرنامج العادي وهو انك يجب ان تفحص من الذي يستدعي شاشة التوقف واين
كيف نفحص ذلك وفي اي مكان من البرنامج
نفحص ذلك من خلال المعاملات argc و argv التي يمررها نظام التشغيل للبرنامج عندما يستدعيه ويحدد منها المطلوب بالضبط
فتح ام تشغيل ام طباعة ام تعديل ام غيره
اذا اين نجد هذه المعاملات :
ساقول لك
بديهيا ستجدها عند اول نقطة لدخول البرنامج او لنعدل من أجل الدقة ونقول عند اول نقطة لا يخفيها عليك الـ MFC
وذلك بالدالة : InitInstance() التابعة لصف التطبيق وهو في مثالنا سيكون CDell19App
اذا اذهب الى الصف المذكور وانظر الدالة التي قلتها وانظر الى محتوياتها ستجد فيه الشيفرة التالية:
C++ كود
_______________________________________________________// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
CDel19Dlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
_______________________________________________________
وهي تقوم بتشغيل بعض الخصائص في البرنامج لا مجال لذكرها لاننا سنعدل كل ما هو مكتوب هنا وكذلك تقوم باظهار النافذة الرئيسية للبرنامج من خلال الامر DoModal
اذا قم بمسح كل محتوياتها
وضع بدلا منها الشيفرة المشروحة التالية :
C++ كود
______________________________________________________
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
// هنا نعرف متغير ليدل على النافذة الرئيسية تمهيدا لتشغيلها
CDel19Dlg dlg;
// وهنا نربط هذا المتغير بالعنصر الذي يشير الى النافذة الرئيسية للبرنامج
m_pMainWnd = &dlg;
/// الآن علينا ان نفحص طلب نظام التشغيل
/// ولذلك نعرف المتغير الحرفي التالي
char state;
//// الآن نفحص المعامل الأول الممرر للبرنامج لنعرف اذا كان البرنامج شغال من قبل ام لا
// اذا كانت قيمة المعامل هي 1 يجب ان نجعل شاشة التوقف تعمل بشكل طبيعي
// مبدأيا لنجعل المتغير المحرفي يحفظ القيمة + وهي من اختياري انا هنا
if (__argc == 1)
{
state = '+';
}
// اذا لم تكن القيمة الممرة 1 يعني ان هناك معامل ثاني يحوي خيارات اضافية
// لنقم بفحصها هنا
// اولا ناخذ الحرف الاول من المعامل الثاني ونحذف من أوله الرموز المرفقة
// ثم ناخذ ما تبقى ونخزنه في المتغير المحرفي تمهيدا للتعامل معه بعدين
else
{
LPTSTR lpsargv = __argv[1];
char arg = lpsargv[0];
if (arg == '-' || arg == '/')
arg = lpsargv[1];
state = arg;
}
// نعرف الآن متغير عدد صحيح سنستخدمه من اجل تشغيل البرنامج او عرض النافذة
int nResponse = 0;
// الآن سنتعامل مع المتغير المحرفي الذي اعطيناه قيمة في الاعلى
// اذا كانت قيمته هي كما هو موضح تحت فالنظام يطلب تشغيل الشاشة لتعديل الاعدادات
// طبعا برنامجنا الآن لن يقوم بذلك
// مبدأيا لنمرر الطلب الى النافذة الرئيسية فقط ونتعامل معه هناك
if ((state == 'c') || (state == 'C'))
{
dlg.m_cState = 'c'; // هنا نمرر الطلب
dlg.DoModal();// وهنا نشغل النافذة الرئيسية
}
// اذا كانت القيمة هي الحرف بي يكون النظام يطلب عرض شاشة التوقف في المكان الصغير
// المخصص في نافذة خصائص العرض
// وهذه ايضا لا يقوم بها برنامجنا
// وايضا مبدأيا مرر القيمة وشغل النافذة
else if ((state == 'p') || (state == 'P'))
{
dlg.m_cState = 'p';
dlg.DoModal();
}
// اما اذا كانت القيمة اس
// فالنظام يطلب تشغيل شاشة التوقف كتجريب مثلا او للعرض
// لنمرر القيمة ونتعامل معها من النافذة الرئيسية
else if ((state == 's') || (state == 'S'))
{
dlg.m_cState = 's';
dlg.DoModal();
}
// هذه الحالة التي اسفل هي الحالة العادية لتشغيل الشاشة
else if (state == '+')
{
dlg.m_cState = '+';
dlg.DoModal();
}
// الآن بعد ان انتهى عرض الشاشة وتم ايقافها
// لنفحص هل ضغط المستخدم زر الموافق
// وهذا يعني انه يريد حفظ اعداداته بعد ان غيرها
// وبرنامجنا لن يقوم بذلك طبعا
if (nResponse == IDOK)
{
///هنا سنضع البرمجة المسؤولة عن حفظ اعدادات الشاشة التي غيرها المستخدم
///وبما ان برنامجنا لا يحوي اعدادات حتى الآن فابمكانك تركها فارغة تمهيا للتطوير القادم
}
return FALSE;
___________________________________________________
لنسجل الآن بعض الملاحظات على هذه الشيفرة:
أولا
برنامجك الآن لن يعمل الآن فيجب اضافة متغير عضو الى الصف CDel19Dlg من نوع char مثلا ليحدد للصف المذكور ماذا سيعمل بالتحديد
اذا اذهب للصف CDel19Dlg واضف متغير عضو سميه m_cState
بعد ان اضفته يمكنك تشغيل البرنامج
وهيئه بالقيمة 'p'
ثانيا
يجب التغيير داخل الدالة OnInitDialog على الشكل التالي
افتح الدالة وتحت سطر todo
اكتب الشيفرة التالية :
C++ كود
____________________________________________________
// TODO: Add extra initialization here
// هنا سنتعامل مع القيمم الممررة للنافذة الرئيسية
// طبعا ترون الآن اننا في النافذة الرئيسية
// في حالة اراد تعديل الاعدادات
// لنشغل الشاشة بشكل طبيعي
// ونترك النافذة ظاهرة
if (m_cState == 'c')
{
IntialMove();
}
// اما في حالة انه اراد عرضها بشكل مصغر كما هو تحت
// لن نرد عليه الآن
// سنجعلها تشتغل عادي وكاننا ما فهمنا ماذا يريد
else if (m_cState == 'p')
{
IntialMove();
}
// اذا اراد عرض الشاشة او تشغيلها
// سنجعلها تعمل ونخفي النافذة الرئيسية
else if (m_cState == 's')
{
IntialMove();
}
else if (m_cState == '+')
{
IntialMove();
}
_____________________________________________________
الآن ستعمل الشاشة ولكن اعتقد انك لست راضيا عن عملها
لماذا لان النافذة ستبقى ظاهرة طوال فترة التنفيذ
ايضا الشاشة لا تتوقف عندما نحرك الفارة أو نضغط على اي زر
ايضا مؤشر الفارة يبقى ظاهرا
وسنقوم بالدرس القادم بتعديل البرنامج ليصحح كل ذلك
أما الآن فيمكنك رؤية النتيجة بالملفات المرفقة مع الشيفرة
في هذه المشاركة
والمشاركة القادمة ستحوي الشيفرة النهائية انشالله
وربما نطورها بالطريقة الافضل فيما بعد لتصبح شاشة كاملة اذا حدا حب يجرب
الملفات المرفقه
اين نبدأ وماذا نعدل :
أولا لنعدل الملف الناتج من ملف exe الى ملف scr
اذهب الى القائمةproject
واختر منها Setting
من القائمة المنسدلة على يسارك اختر win32 debug
ومن اليمين اذهب للتبويب debug وعدل في الحقل الاول بدل exe الموجودة بالاخر اكتب scr
وايضا تقدم الى التبويب Link وعدل آخر المكتوب بالحقل الأول بدل EXE اكتب Scr ايضا
عد الى اليسار واختر من اللائحة المنسدلة Win32 Release وكرر نفس العملية في التبويب debug و Link
الآن عنما تنفذ البرنامج ستجد في مكان التنفيذ شاشة توقف وليس برنامج
لكنها ليست شاشة توقف كاملة بل هي برنامج يلبس ثياب شاشة التوقف فقط ولا بد من عمل التعديلات الاساسية
تذكرون الفرق الاول الذي ذكرته بين شاشة التوقف والبرنامج العادي وهو انك يجب ان تفحص من الذي يستدعي شاشة التوقف واين
كيف نفحص ذلك وفي اي مكان من البرنامج
نفحص ذلك من خلال المعاملات argc و argv التي يمررها نظام التشغيل للبرنامج عندما يستدعيه ويحدد منها المطلوب بالضبط
فتح ام تشغيل ام طباعة ام تعديل ام غيره
اذا اين نجد هذه المعاملات :
ساقول لك
بديهيا ستجدها عند اول نقطة لدخول البرنامج او لنعدل من أجل الدقة ونقول عند اول نقطة لا يخفيها عليك الـ MFC
وذلك بالدالة : InitInstance() التابعة لصف التطبيق وهو في مثالنا سيكون CDell19App
اذا اذهب الى الصف المذكور وانظر الدالة التي قلتها وانظر الى محتوياتها ستجد فيه الشيفرة التالية:
C++ كود
_______________________________________________________// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
CDel19Dlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
_______________________________________________________
وهي تقوم بتشغيل بعض الخصائص في البرنامج لا مجال لذكرها لاننا سنعدل كل ما هو مكتوب هنا وكذلك تقوم باظهار النافذة الرئيسية للبرنامج من خلال الامر DoModal
اذا قم بمسح كل محتوياتها
وضع بدلا منها الشيفرة المشروحة التالية :
C++ كود
______________________________________________________
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
// هنا نعرف متغير ليدل على النافذة الرئيسية تمهيدا لتشغيلها
CDel19Dlg dlg;
// وهنا نربط هذا المتغير بالعنصر الذي يشير الى النافذة الرئيسية للبرنامج
m_pMainWnd = &dlg;
/// الآن علينا ان نفحص طلب نظام التشغيل
/// ولذلك نعرف المتغير الحرفي التالي
char state;
//// الآن نفحص المعامل الأول الممرر للبرنامج لنعرف اذا كان البرنامج شغال من قبل ام لا
// اذا كانت قيمة المعامل هي 1 يجب ان نجعل شاشة التوقف تعمل بشكل طبيعي
// مبدأيا لنجعل المتغير المحرفي يحفظ القيمة + وهي من اختياري انا هنا
if (__argc == 1)
{
state = '+';
}
// اذا لم تكن القيمة الممرة 1 يعني ان هناك معامل ثاني يحوي خيارات اضافية
// لنقم بفحصها هنا
// اولا ناخذ الحرف الاول من المعامل الثاني ونحذف من أوله الرموز المرفقة
// ثم ناخذ ما تبقى ونخزنه في المتغير المحرفي تمهيدا للتعامل معه بعدين
else
{
LPTSTR lpsargv = __argv[1];
char arg = lpsargv[0];
if (arg == '-' || arg == '/')
arg = lpsargv[1];
state = arg;
}
// نعرف الآن متغير عدد صحيح سنستخدمه من اجل تشغيل البرنامج او عرض النافذة
int nResponse = 0;
// الآن سنتعامل مع المتغير المحرفي الذي اعطيناه قيمة في الاعلى
// اذا كانت قيمته هي كما هو موضح تحت فالنظام يطلب تشغيل الشاشة لتعديل الاعدادات
// طبعا برنامجنا الآن لن يقوم بذلك
// مبدأيا لنمرر الطلب الى النافذة الرئيسية فقط ونتعامل معه هناك
if ((state == 'c') || (state == 'C'))
{
dlg.m_cState = 'c'; // هنا نمرر الطلب
dlg.DoModal();// وهنا نشغل النافذة الرئيسية
}
// اذا كانت القيمة هي الحرف بي يكون النظام يطلب عرض شاشة التوقف في المكان الصغير
// المخصص في نافذة خصائص العرض
// وهذه ايضا لا يقوم بها برنامجنا
// وايضا مبدأيا مرر القيمة وشغل النافذة
else if ((state == 'p') || (state == 'P'))
{
dlg.m_cState = 'p';
dlg.DoModal();
}
// اما اذا كانت القيمة اس
// فالنظام يطلب تشغيل شاشة التوقف كتجريب مثلا او للعرض
// لنمرر القيمة ونتعامل معها من النافذة الرئيسية
else if ((state == 's') || (state == 'S'))
{
dlg.m_cState = 's';
dlg.DoModal();
}
// هذه الحالة التي اسفل هي الحالة العادية لتشغيل الشاشة
else if (state == '+')
{
dlg.m_cState = '+';
dlg.DoModal();
}
// الآن بعد ان انتهى عرض الشاشة وتم ايقافها
// لنفحص هل ضغط المستخدم زر الموافق
// وهذا يعني انه يريد حفظ اعداداته بعد ان غيرها
// وبرنامجنا لن يقوم بذلك طبعا
if (nResponse == IDOK)
{
///هنا سنضع البرمجة المسؤولة عن حفظ اعدادات الشاشة التي غيرها المستخدم
///وبما ان برنامجنا لا يحوي اعدادات حتى الآن فابمكانك تركها فارغة تمهيا للتطوير القادم
}
return FALSE;
___________________________________________________
لنسجل الآن بعض الملاحظات على هذه الشيفرة:
أولا
برنامجك الآن لن يعمل الآن فيجب اضافة متغير عضو الى الصف CDel19Dlg من نوع char مثلا ليحدد للصف المذكور ماذا سيعمل بالتحديد
اذا اذهب للصف CDel19Dlg واضف متغير عضو سميه m_cState
بعد ان اضفته يمكنك تشغيل البرنامج
وهيئه بالقيمة 'p'
ثانيا
يجب التغيير داخل الدالة OnInitDialog على الشكل التالي
افتح الدالة وتحت سطر todo
اكتب الشيفرة التالية :
C++ كود
____________________________________________________
// TODO: Add extra initialization here
// هنا سنتعامل مع القيمم الممررة للنافذة الرئيسية
// طبعا ترون الآن اننا في النافذة الرئيسية
// في حالة اراد تعديل الاعدادات
// لنشغل الشاشة بشكل طبيعي
// ونترك النافذة ظاهرة
if (m_cState == 'c')
{
IntialMove();
}
// اما في حالة انه اراد عرضها بشكل مصغر كما هو تحت
// لن نرد عليه الآن
// سنجعلها تشتغل عادي وكاننا ما فهمنا ماذا يريد
else if (m_cState == 'p')
{
IntialMove();
}
// اذا اراد عرض الشاشة او تشغيلها
// سنجعلها تعمل ونخفي النافذة الرئيسية
else if (m_cState == 's')
{
IntialMove();
}
else if (m_cState == '+')
{
IntialMove();
}
_____________________________________________________
الآن ستعمل الشاشة ولكن اعتقد انك لست راضيا عن عملها
لماذا لان النافذة ستبقى ظاهرة طوال فترة التنفيذ
ايضا الشاشة لا تتوقف عندما نحرك الفارة أو نضغط على اي زر
ايضا مؤشر الفارة يبقى ظاهرا
وسنقوم بالدرس القادم بتعديل البرنامج ليصحح كل ذلك
أما الآن فيمكنك رؤية النتيجة بالملفات المرفقة مع الشيفرة
في هذه المشاركة
والمشاركة القادمة ستحوي الشيفرة النهائية انشالله
وربما نطورها بالطريقة الافضل فيما بعد لتصبح شاشة كاملة اذا حدا حب يجرب
الملفات المرفقه
الخميس ديسمبر 02, 2010 11:42 am من طرف فافي
» ارتداء الستيانه
الثلاثاء يونيو 29, 2010 11:34 am من طرف سمسم العراقي
» انضر الى اجمل ما خلقه الله سبحانه وتعالى
الأربعاء ديسمبر 02, 2009 1:19 pm من طرف سمسم العراقي
» آخر صور للفنان رضى العبد الله
السبت أكتوبر 31, 2009 10:28 am من طرف فافي
» سر دمعتي .......
الجمعة يوليو 17, 2009 6:50 am من طرف mylove
» كليب كامل يوسف ^^ عزابي ^^ حصرياًَ بس مني
الثلاثاء يوليو 14, 2009 1:34 pm من طرف فافي
» احلى رقصة بالعالم ارجو الرد.....
السبت يوليو 11, 2009 7:52 am من طرف فافي
» سؤال يطرح نفسه بقوة ؟؟؟؟؟
الجمعة يوليو 10, 2009 6:34 pm من طرف سمسم العراقي
» طفل في الهند له ذيل
الجمعة يوليو 10, 2009 6:30 pm من طرف سمسم العراقي