التجربة الثالثة تتكلم عن كيفية تحريك أيقونة البرنامج
طبعا عمابة التحريك تتم بتغيير أيقونة البرنامج كل فترة زمنية قصيرة بحيث تعطي الانطباع بأن الأيقونة تتحرك في مكانها و قد استخدمت مجموعة من الأيقونات من مكتبة Visual C++ و قمت باستعمالها و هذه الايقونات هي عبارة عن لقطات مختلفة للقمر و عملية تغيير هذه الصور بشكل متتابع توحي بتغير شكل القمر من بداية الشهر القمري و حتى نهايته
فكرة البرنامج بسيطة و تعتمد على المؤقت Timer و في كل مرة يتم فيها تنفيذ تابع المؤقت يتم تغيير الأيقونة و تحميل الايقونة التالية وعند الوصول إلى آخر أيقونة يتم تحميل الايقونة الاولى
طبعا يجب اولا اضافة مجموعة الايقونات الى المشروع و ذلك عن طريق الامر Import من ضمن Resource View و من ثم يتم عمل Override للتابع OnTimer و هو تابع المؤقت و في هذا التابع عرفت مصفوفة تحتوي على معرفات Ids الايقونات كالتالي:
[code2]
static int icons[]=
{IDI_ICON1,IDI_ICON2,IDI_ICON3,IDI_ICON4,IDI_ICON5,IDI_ICON6,IDI_ICON7,IDI_ICON8};
[/code2]
و من ثم قمت باستخدام متحول ستاتيكي من أجل معرفة رقم الايقونة التي يجب تحميلها في كل مرة يتم فيها تنفيذ تابع المؤقت و هو:
[code2]
static long index = 0;
[/code2]
و من ثم قمت بحساب عدد الايقونات الموجودة ضمن المصفوفة icons كما يلي:
[code2]
long Num = sizeof(icons)/sizeof(icons[0]) ;
[/code2]
و من ثم قمت بكتابة التعليمة
[code2]
LoadNewIcon( icons[index++ % Num] );
[/code2]
التي تقوم باستدعاء التابع LoadNewIcon() الذي قمت باضافته ووظيفته تحميل الايقونة المحددة بالبارامتر
و في التابع LoadNewIcon() قمت بتحميل الايقونة الجديدة و حفظ ال Handle
[code2]
HICON hIconNew = AfxGetApp()->LoadIcon(nIconID);
[/code2]
و أيضا ال Handle الخاص بالايقونة القديمة :
[code2]
HICON hIconOld = (HICON) GetClassLong(m_hWnd,GCL_HICON);
[/code2]
و من ثم قمت بازالة الايقونة القديمة من الذاكرة و تسجيل الايقونة الجديدة كأيقونة للبرنامج و من ثم طلب Redraw أي اعادة رسم لكي تظهر الايقونة الجديدة في الشيفرة التالية
[code2]
DestroyIcon( hIconOld);
SetClassLong(m_hWnd,GCL_HICON,(long)hIconNew);
RedrawWindow(NULL,NULL);
[/code2]
وThat's it
ويمكنكم تحميل شيفرة البرنامج من الوصلة التالية :
http://arabteam.nicmatic.com/atassi/adel/A...AnimateIcon.zip
مع التحيات.