الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سلسلة التجارب - التجربة الثالثة

مغلق
بدأه Adel Khayata في 13 أغسطس 2001 · 2 رد · 2,782 مشاهدة · في قسم المواضيع الهامة في قسم السي /سي++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم.

التجربة الثالثة تتكلم عن كيفية تحريك أيقونة البرنامج :)

طبعا عمابة التحريك تتم بتغيير أيقونة البرنامج كل فترة زمنية قصيرة بحيث تعطي الانطباع بأن الأيقونة تتحرك في مكانها و قد استخدمت مجموعة من الأيقونات من مكتبة 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

مع التحيات.

#2

ممتاز أخي عادل ..

بالنسبة للمصفوفة ال ID أفضل أن توضع في متحول member .. وحاول أن تقلل من استخدام المتحولات العامة كلما أمكن ..

في تجربتك هذه فكرة رائعة وهي كيفية تغيير المعلومات المسجلة عن النافذة في الويندوز . هذه المعلومات التي تم تسجيلها باستخدام AfxRegisterWndClass أو RegisterClass ..

طبعا في برنامجك تم استخدام العديد من ملفات الأيقونات . حيث لكل أيقونة ملف .. طبعا هناك طريقة أخرى أكثر اقتصادية وهو وضع جميع الأيقونات بجوار بعضها البعض في ملف واحد من نوع BMP ومن ثم وضع هذا الملف فقط في ال Resource ومن ثم استخدام CImageList في تحميل هذه الصورة من ال resource . ومن ثم استخدام التابع ExtractIcon في CImageList مع تمرير رقم الصورة له .. هكذا برأي أفضل من أجل تنظيم البرنامج .. وأيضا من أجل حجم البرنامج التنفيذي فلاحظ أن حجم جميع ملفات الأيقونات هو 9 كيلو ، ولكن حجم صورة واحدة BMP سوف تكون أصغر بكثير أي حوالي 4 كيلو .. :)

فما رأيك ..؟؟ :)

ويعطيك العافية أخي عادل ولكن في المرات القادمة حاول تضع صورة لموضوعك أو تجربتك لأن الصورة هي التي تجذب القارئ ..

Coding on the Cloud and for the Cloud!

My Blog

#3

السلام عليكم.

شكرا لك أخي هاني على ملاحظاتك:)

أنا دائما أحاول في التجارب التي اكتبها أن اركز على الفكرة الرئيسية للبرنامج بدون أن أدخل في طرق متقدمة من أجل انجاز الفكرة يعني انا كان عندي ايقونات جاهزة لذلك استعملتها مباشرة . بس انت عطيتني فكرة حلوة لتجربة جديدة و هي كيفية وضع مجموعة من الصور في ملف صورة واحدة و من ثم استخدام CImageList للحصول على هذه الصور منفردة.

بالنسبة لصورة البرنامج فانت كما رأيت البرنامج ليس فيه ما يستاهل عرض صورة له:):) و انا دائما أحاول وضع صور للبرامج التي انفذها عندما أضعها في المنتدى.

بس معليش انت بتمون:):)

ميييييييية السلاااااامة:):)

مع التحيات.

هذا الموضوع مغلق.

مواضيع مشابهة