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


و الآن وقد وضحت فكرة البرنامج ندخل في الشرح:
فكرة البرنامج بسيطة و تعتمد على تقسيم هذا ال 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
مع التحيات.