تكملة الموضوع ج1 شاشة التوقف
ولنضع استدعاء لهذه الدالة في الدالة OnInitDialog في الصف نفسه حرر الدالة OnIntialDialog السابقة مضيفا اليها السطر التالي لاستدعاء دالة الحركة بعد عبارة todo// لتصبح بالشكل:
C++ كود
IntialMove();
الآن لن يعمل برنامجك بالتاكيد لاننا لم نحجز قيمة بعد في موارد البرنامج للمؤقت لعمل ذلك اذهب الى نافذة عرض الموارد Resosce View على اليسار
اضغط بالزر الأيمن على راس الشجرة واختر ID=Resorce Symbols تظهر نافذة قيم تعريف الموارد
اضغط فيها على الزر New اكتب IDC_TIMER كاسم للمورد واترك القيمة التي اختارها البرنامج ربما 101 مثلا
الآن عرفت قيمة لتدل على المؤقت وهكذا اصبح بامكانك تنفيذ الأمر SetTimer المذكورة في الكود السابق
الكود السابق يهيء المتغيرات من أجل الحركة ثم يبدأ تشغيل المؤقت
وعلينا وضع كود الحركة عند قدح حدث الزمن كيف:
اذهب الى القائمة view في فيجوال ستديو واختر منها Class wizard اختر التبويب Message Maps
اختر الحدث WM_TIMER لصندوق الحوار
اضغط زر Add Function ثم اقبل الاسم المقترح OnTimer بالضغط على موافق ثم اضغط زر Edit Code
سيفتح لك شاشة تحرير الكود للدالة المذكورة
عدلها لتصبح بالشكل :
C++ كود
_______________________________________________________
color=blue]
[/color]
________________________________________________________
الآن برنامجنا ليس جاهزا ليعمل اذ يبقى علينا اضافة دالة جديدة بالاسم DrawBall() والتي من المفروض انها سترسم الكرة في المكان المحدد
اضف الدالة بالنقر على الصف CDel19Dlg بالزر الايمن ثم اختيار Add Member Function وسميه DrawBall()
وانقر موافق سيفتح لك نافذة التحرير للدالة المذكورة
عدلها لتصبح بالشكل :
C++ كود
________________________________________________________v
_________________________________________________________
ايضا اضف دالة جديدة لتحرير الذاكرة عند انهاء البرنامج وذلك للحدث WM_DESTROY عدلها لتصبح بالشكل :
C++ كود______________________________________________________
________________________________________________________
هكذا اصبح البرنامج كاملا تقريبا لكنه برنامج وليس شاشة توقف
كل ما عملناه حتى الآن هو عرض الحركة لكن بقي علينا التعديل فيه ليعمل كشاشة التوقف
وفي الرسالة القادمة ساضع خطوات ذلك مع ما امكن من شرح
يتبع
ولنضع استدعاء لهذه الدالة في الدالة OnInitDialog في الصف نفسه حرر الدالة OnIntialDialog السابقة مضيفا اليها السطر التالي لاستدعاء دالة الحركة بعد عبارة todo// لتصبح بالشكل:
C++ كود
IntialMove();
الآن لن يعمل برنامجك بالتاكيد لاننا لم نحجز قيمة بعد في موارد البرنامج للمؤقت لعمل ذلك اذهب الى نافذة عرض الموارد Resosce View على اليسار
اضغط بالزر الأيمن على راس الشجرة واختر ID=Resorce Symbols تظهر نافذة قيم تعريف الموارد
اضغط فيها على الزر New اكتب IDC_TIMER كاسم للمورد واترك القيمة التي اختارها البرنامج ربما 101 مثلا
الآن عرفت قيمة لتدل على المؤقت وهكذا اصبح بامكانك تنفيذ الأمر SetTimer المذكورة في الكود السابق
الكود السابق يهيء المتغيرات من أجل الحركة ثم يبدأ تشغيل المؤقت
وعلينا وضع كود الحركة عند قدح حدث الزمن كيف:
اذهب الى القائمة view في فيجوال ستديو واختر منها Class wizard اختر التبويب Message Maps
اختر الحدث WM_TIMER لصندوق الحوار
اضغط زر Add Function ثم اقبل الاسم المقترح OnTimer بالضغط على موافق ثم اضغط زر Edit Code
سيفتح لك شاشة تحرير الكود للدالة المذكورة
عدلها لتصبح بالشكل :
C++ كود
_______________________________________________________
color=blue]
void CDel19Dlg::OnTimer(UINT nIDEvent)
{
int y;
y=m_ptCorPos.y;
if(m_ptCorPos.y >= 520)
{
m_iYTime=1;
}
m_ptCorPos.y = m_iYTime * m_iYTime / 2 - 30 * m_iYTime + 520;
m_iYTime++;
if(m_ptCorPos.x <=-5)
{
m_iXTime=1;
m_iXStart= -5;
m_iXSpeed = 5;
}
if(m_ptCorPos.x>=745)
{
m_iXTime=1;
m_iXStart = 745;
m_iXSpeed = -5;
}
m_ptCorPos.x= m_iXSpeed * m_iXTime + m_iXStart ;
m_iXTime++;
// التحرك للاعلى
if(m_ptCorPos.y < y)
{
m_ptHorOut.y=m_ptCorPos.y;
m_ptHorIn.y=0;
}
//التحرك للاسفل
else
{
m_ptHorOut.y=m_ptCorPos.y+80;
m_ptHorIn.y=80;
}
m_ptCorIn.y= y - m_ptCorPos.y;
m_ptVerOut.y=m_ptCorPos.y;
m_ptVerIn.y=0;
//التحرك لليمين
if(m_iXSpeed == 5)
{
m_ptVerOut.x=m_ptCorPos.x + 55;
m_ptVerIn.x=55;
m_ptCorIn.x= -5;
}
//التحرك لليسار
else
{
m_ptVerOut.x= m_ptCorPos.x;
m_ptVerIn.x=0;
m_ptCorIn.x=5;
}
m_ptHorOut.x= m_ptCorPos.x;
m_ptHorIn.x=0;
DrawBall();
CDialog::OnTimer(nIDEvent);
}
{
int y;
y=m_ptCorPos.y;
if(m_ptCorPos.y >= 520)
{
m_iYTime=1;
}
m_ptCorPos.y = m_iYTime * m_iYTime / 2 - 30 * m_iYTime + 520;
m_iYTime++;
if(m_ptCorPos.x <=-5)
{
m_iXTime=1;
m_iXStart= -5;
m_iXSpeed = 5;
}
if(m_ptCorPos.x>=745)
{
m_iXTime=1;
m_iXStart = 745;
m_iXSpeed = -5;
}
m_ptCorPos.x= m_iXSpeed * m_iXTime + m_iXStart ;
m_iXTime++;
// التحرك للاعلى
if(m_ptCorPos.y < y)
{
m_ptHorOut.y=m_ptCorPos.y;
m_ptHorIn.y=0;
}
//التحرك للاسفل
else
{
m_ptHorOut.y=m_ptCorPos.y+80;
m_ptHorIn.y=80;
}
m_ptCorIn.y= y - m_ptCorPos.y;
m_ptVerOut.y=m_ptCorPos.y;
m_ptVerIn.y=0;
//التحرك لليمين
if(m_iXSpeed == 5)
{
m_ptVerOut.x=m_ptCorPos.x + 55;
m_ptVerIn.x=55;
m_ptCorIn.x= -5;
}
//التحرك لليسار
else
{
m_ptVerOut.x= m_ptCorPos.x;
m_ptVerIn.x=0;
m_ptCorIn.x=5;
}
m_ptHorOut.x= m_ptCorPos.x;
m_ptHorIn.x=0;
DrawBall();
CDialog::OnTimer(nIDEvent);
}
[/color]
________________________________________________________
الآن برنامجنا ليس جاهزا ليعمل اذ يبقى علينا اضافة دالة جديدة بالاسم DrawBall() والتي من المفروض انها سترسم الكرة في المكان المحدد
اضف الدالة بالنقر على الصف CDel19Dlg بالزر الايمن ثم اختيار Add Member Function وسميه DrawBall()
وانقر موافق سيفتح لك نافذة التحرير للدالة المذكورة
عدلها لتصبح بالشكل :
C++ كود
________________________________________________________v
oid CDel19Dlg::DrawBall()
{
CClientDC dc2(NULL);
CDC dcmem;
dcmem.CreateCompatibleDC(&m_dcConst);
CBitmap bmbit2;
bmbit2.CreateCompatibleBitmap(&dc2,60,110);
CBitmap* bmold2=dcmem.SelectObject(&bmbit2);
dcmem.BitBlt(m_ptCorIn.x, m_ptCorIn.y,60,110,&m_dcConst,0,0,SRCCOPY);
dcmem.BitBlt(m_ptHorIn.x , m_ptHorIn.y , 60, 30 , &dc2, m_ptHorOut.x, m_ptHorOut.y,SRCCOPY);
dcmem.BitBlt(m_ptVerIn.x , m_ptVerIn.y ,5, 110,&dc2,m_ptVerOut.x,m_ptVerOut.y,SRCCOPY);
m_dcConst.BitBlt(0,0,60,110,&dcmem,0,0,SRCCOPY);
CBrush brush(RGB(255,255,0));
CBrush* brold=dcmem.SelectObject(&brush);
dcmem.Ellipse(5,30,55,80);
dc2.BitBlt(m_ptCorPos.x,m_ptCorPos.y,60,110,&dcmem ,0,0,SRCCOPY);
dcmem.SelectObject(brold);
dcmem.SelectObject(bmold2);
dcmem.DeleteDC();
}
{
CClientDC dc2(NULL);
CDC dcmem;
dcmem.CreateCompatibleDC(&m_dcConst);
CBitmap bmbit2;
bmbit2.CreateCompatibleBitmap(&dc2,60,110);
CBitmap* bmold2=dcmem.SelectObject(&bmbit2);
dcmem.BitBlt(m_ptCorIn.x, m_ptCorIn.y,60,110,&m_dcConst,0,0,SRCCOPY);
dcmem.BitBlt(m_ptHorIn.x , m_ptHorIn.y , 60, 30 , &dc2, m_ptHorOut.x, m_ptHorOut.y,SRCCOPY);
dcmem.BitBlt(m_ptVerIn.x , m_ptVerIn.y ,5, 110,&dc2,m_ptVerOut.x,m_ptVerOut.y,SRCCOPY);
m_dcConst.BitBlt(0,0,60,110,&dcmem,0,0,SRCCOPY);
CBrush brush(RGB(255,255,0));
CBrush* brold=dcmem.SelectObject(&brush);
dcmem.Ellipse(5,30,55,80);
dc2.BitBlt(m_ptCorPos.x,m_ptCorPos.y,60,110,&dcmem ,0,0,SRCCOPY);
dcmem.SelectObject(brold);
dcmem.SelectObject(bmold2);
dcmem.DeleteDC();
}
_________________________________________________________
ايضا اضف دالة جديدة لتحرير الذاكرة عند انهاء البرنامج وذلك للحدث WM_DESTROY عدلها لتصبح بالشكل :
C++ كود______________________________________________________
void CDel19Dlg::OnDestroy()
{
CDialog::OnDestroy();
if(m_bTrue)
{
m_dcConst.SelectObject(m_bmOld);
m_dcConst.DeleteDC();
}
else
m_dcConst.DeleteDC();
}
{
CDialog::OnDestroy();
if(m_bTrue)
{
m_dcConst.SelectObject(m_bmOld);
m_dcConst.DeleteDC();
}
else
m_dcConst.DeleteDC();
}
________________________________________________________
هكذا اصبح البرنامج كاملا تقريبا لكنه برنامج وليس شاشة توقف
كل ما عملناه حتى الآن هو عرض الحركة لكن بقي علينا التعديل فيه ليعمل كشاشة التوقف
وفي الرسالة القادمة ساضع خطوات ذلك مع ما امكن من شرح
يتبع
الخميس ديسمبر 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 من طرف سمسم العراقي