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