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

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

مغلق
بدأه Adel Khayata في 15 أغسطس 2001 · 3 رد · 674 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

تجربة اليوم هي كيفية عرض Dialog بشكلين الأول يعرض خيارات أساسية و الثاني يعرض الخيارات الاضافية التي يمكن استعمالها و لتوضيح الفكرة هذه صورتين من البرنامج:

ExpandPic1.jpg

ExpandPic2.jpg

و الآن وقد وضحت فكرة البرنامج ندخل في الشرح:

فكرة البرنامج بسيطة و تعتمد على تقسيم هذا ال Dialog إلى منطقتين و يتم الفصل بين المنطقتين بواسطو أداة Picture واستخدامها كمستطيل ومن ثم بالضغط على الزر More يتم إظهار المنطقتين بشكل كامل و يتحول النص المكتوب ضمن الزر More إلى Less و بالتالي إذا ضغطنا على هذا الزر مرة أخرى فسيتم عرض المنطقة الأولى فقط.

أولا يتم تهيئة المتحولات بأبعاد هذه المناطق كما يلي:

CWnd *pWndLandmark = GetDlgItem( IDC_RECT );

GetWindowRect( rcLarge );
pWndLandmark->GetWindowRect( rcLandmark );

rcSmall = rcLarge ;
rcSmall.bottom = rcLandmark.top ;

لدينا هنا ثلاثة متحولات من نوع CRect و كل متحول مسؤول عن حفظ احداثيات كل منطقة فالمتحول rcLandmark يحمل احداثيات المستطيل الذي يفصل بين المنطقتين و المتحول rcSmall مسؤول عن حفظ إحداثيات المنطقة العليا و المتحول rcLarge مسؤول عن حفظ احداثيات المنطقتين العليا و السفلى

ومن ثم نكتب الشيفرة التالية:

if (Expand)
{
	SetWindowPos( NULL , 0 , 0 , rcLarge.Width() , rcLarge.Height() , WP_NOMOVE|SWP_NOZORDER);

	sExpand = "<< &Less";
}
else
{
	SetWindowPos( NULL , 0 , 0 , rcSmall.Width() , rcSmall.Height() , SWP_NOMOVE|SWP_NOZORDER);

	sExpand = "&More >>";
}

SetDlgItemText( IDC_MORE , sExpand );

هنا تم استخدام التابع SetWindowPos من أجل تحديد أبعاد ال Dialog على حسب قيمة المتحول Expand فإذا كان true و يعني عرض كل ال Dialog يتم استخدام المتحول rcLarge لأنه يحتوي احداثيات المنطقتين معا و إذا كان Expand مساوي ل false أي عرض الجزء العلوي فقط فيتم استخدام المتحول rcSmall لأنه يحتوي احداثيات المنطقة العليا.

ثم بعد ذلك يتم تفعيل الأدوات التي ستظهر على ال Dialog بحيث يتم تفعيل الأدوات التي يوجد لها تقاطع مع الحجم الحالي لل Dialog و إلغاء تفعيل الأدوات التي ليس لها تقاطع وهذه العملية مهمة و ذلك من أجل عملية التنقل بين الحقول لأنه يجب منع التركيز Focus من الانتقال إلى أدوات ليست ظاهرة حاليا و يتم ذلك في الشيفرة:

CWnd *pWnd = GetWindow(GW_CHILD);

GetWindowRect( rcShow );

while (pWnd != NULL )
{
	pWnd->GetWindowRect( rcControl );

	if (rcTemp.IntersectRect(rcShow,rcControl))
		pWnd->EnableWindow( true );
	else
		pWnd->EnableWindow( false );

	pWnd = pWnd->GetWindow(GW_HWNDNEXT);
}

و هذا كل شيئ و للحصول على شيفرة البرنامج استخدم الوصلة التالية:

http://arabteam.nicmatic.com/adel/ExpandDialog.zip

مع التحيات.

#2

السلام عليكم ،،،

اخوي عادل صراحة احييك على افكارك وابداعك هذا، و اتمنى أن تواصل على تجاربك هذه ....

على فكره :

لو جيت ولقيت التجربة رقم * ... و اردت ان اضع تجربة خاصة بي هل تسمح أن اضع سلسة التجارب - التجربة *+1 .

(-:

اتمنى ان توافق ..

تقبل تحياتي ،،،

#3

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

أخي neoo مافي عندي مشكلة انك تضع تجارب بنفس عناوين تجاربي:) يس انت ممكن يكون إلك خصوصيتك:) يعني ممكن تساوي أيضا سلسلة من التجارب و تعطيها اسم على كيفك:)يعني مو شرط تتقيد بنفس العنوان ,و ما تفهم كلامي هذا على أني لا أريدك أن تستخدم عنوان مواضيعي فالمهم في النتيجة هو الاستفادة من الموضوع المكتوب سواء كان عنوانه سلسلة التجارب أو "رقصني يا جدع عالوحدة و نص":D:):):) فالغاية هي الفائدة.

شغلة تانية : وهي أني ذكرت في التجربة الاولى أن معظم التجارب التي سأكتبها هي مستخلصة من قراءتي للكتب التي عندي و التي أريد أن أتشارك بها مع الأعضاء فكما استفدت أنا من هذه الكتب أريد أن أفيد:) و أنا مجرد مبرمج و عاشق للغة Visual C و لا زلت أعتبر نفسي متوسطا فيها:)

مع التحيات.

#4

قديم - مفيد جدّا

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

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