22-11-18, 01:33 PM
المصدر الاصلى للموضوع
أهلا وسهلا بكم أخوانى الكرام فى درس جديد عن كيفية تغير حجم نوافذ برنامج عندما تتغير دقة عرض الشاشة screen resolution و ايضا تغير حجم الادوات التى على النافذة .....بعض الاخوة ربما يعتقدون أن أنه بمجرد تغير حجم النافذة سوف يتم تغير حجم الادوات التى عليها تلقائيا و هذا غير صحيح ...وبعض الاخوة ايضا يخلطون مابين تغير حجم الادوات بتغير حجم النافذة و بين تغير موضع تلك الادوات على النافذة بتغير حجمها ....لذلك سوف نتناول بالشرح النقاط التالية :
1 _ تغيير حجم النافذة أستنادا على دقة عرض الشاشة .
2_ تغيير حجم عناصر التحكم على النافذة استنادا إلى حجم النافذة
3_تغير موضع عناصر التحكم على النافذة أستنادا الى حجم النافذة
4_ تغيير حجم الخط لعناصر التحكم استنادا إلى حجم العناصر أعلاه
الخطوة الاولى :قم بفتح مشروع جديد فى الفجوال بيسك 6 ....ثم اضف للمشروع Module وقم بتسميتها باسم FormControl
الخطوة الثانية : نقوم بفتح الموديل لتعريف المتغيرات اللازمة بأستخدام الكود التالى :
الخطوة الثالثة ..بعد ما قمنا بتعريف المتغيرات اللازمة سنقوم بكتابة أجراء لاحتواء كافة خصائص عناصر التحكم الموجودة على النافذة و ذلك على النحو التالى :
كما ترون من الكود السابق ...فإن هذا الكود يحمل كافة الخائص الخاصة للعنصر التحكم التى من خلالها نستطيع التحكم فى حجمها ...مثل الطول و العرض و مكان وضعة مثل أعلى ويسار هذا بالاضافة لمعرفة اسم الكائن المراد التحكم فية و رقم الاندكس له ....بهذا نكون قد أنتيها من الاعلان عن المتغيرات اللازمة ....هيا بنا نقوم بكتابة الاكواد اللازمة للتحكم فى حجم النافذة و الادوات التى عليها .
1 _ تغيير حجم النافذة أستنادا على دقة عرض الشاشة....ولكى نستيطع تغير حجم النافذة بتغير دقة عرض الشاشة فأننا سنتخدم خصائص العرض والارتفاع لتلك النافذة مع الكائن Screen Object و الذى سيتيح لنا الوصول إلى دقة عرض الشاشة المتوفرة لدى المستخدم ....لذلك سنقوم بإنشاء اجراء لتغير حجم النافذة مع دقة عرض الشاشة و ذلك على النحو التالى :
لو نظرنا للكود أعلاه ستجد أننا جعلنا عرض النافذة تساوى عرض الشاشة مقسومة على الرقم 2 ..و ايضا طول النافذة يساوى طول الشاشة مقسومة على الرقم 2 ...لكن هذا الكود سيقوم فقط بتغير حجم الشاشة دون أدوات التحكم التى عليه ذلك ناتى للنقطة الاخرى ..
2_ تغيير حجم عناصر التحكم على النافذة استنادا إلى حجم النافذة ...كما أشرنا أعلاه اننا لو استخدمنا الاجراء السابق فقط فأنك لن تلاحظ أى تغير على أدوات التحكم الموجودة على النافذة بل أن الاجراء السابق مثله مثل الخاصية WindowState للنوافذ التى إن جعلناها تاخذ القيمة Maximized فإن النافذة ستتغير بتغير حجم الشاشة ....إذن المطلوب هو تغير حجم عناصر التحكم بتغير حجم النوافذ
الان سنقوم بعمل أجراء يسمى ResizeControls وذلك لاستخدامة فى تغير جميع أدوات التحكم جميعها الموجودة على النافذة و ذلك على النحو التالى :
شرح الكود السابق :
السطر الاول : الاعلان عن المتغير i و ذلك لاستخدامه فى حلقة تكرارية فيما بعد
السطر الثانى و الثالث : الحصول على نسبة من حجم النافذة الاولى (قبل التعديل ) لحجم النافذة الحالية ...لكى يتم تغير حجم الادوات بنفس تلك النسبة .
اما من بداية السطر الرابع وحتى الاخير ....فهو عبارة عن حلقة تكرارية للحصول على جميع عناصر التحكم الموجودة على النافذة أستنادا الى رقم الفهرس Index ...وذلك لانه ليس من الاحترافية أنك تقوم بتغير حجم كل عنصر على حده لانه سيتطلب منك الكثير من الاكواد خصوصا لو أن النافذة بها العديد من عناصر التحكم وليكن 10 زر أمر و 10 مربع نص ...الخ
لذلك فى بداية الدرس قمنا بالاعلان عن المتغير curr_obj على انه كائن Object و بأستخدام الامر For Each curr_obj In frm نستطيع الحصول على كافة عناصر التحكم الموجودة على النافذة ...وقد أستخدمنا الدالةUBound للحصول على أعلى رقم Index على النافذة و التى سيتوقف عندها الحلقة التكرارية ومن ثم نحصل على جميع العناصر الموجودة فى النافذة ....ثم بعد ذلك حددنا عرض و طول و مكان عناصر التحكم على الفورم
3_تغير موضع عناصر التحكم على النافذة أستنادا الى حجم النافذة...معظم الاخوة يريدون عند تغير حجم النافذة يتم تغير موضع عناصر التحكم بها بما يتناسب مع الوضع الجديد للنافذة و يتعبرون أن تغير حجم تلك العناصر هو الحل فى ذلك لكن ذلك ليس بصحيح ....فلكى تتمكن من تغير موضع عناصر التحكم سنتخدم الكود التالى :
شرح الكود :
السطر الاول : الاعلان عن المتغير i لاستخدامه فى الحلقة التكرارية فيما بعد
من السطر الثانى حتى الثانى عشر :عمل حلقة تكرارية لتحديد الموضع الحالى لجميع عناصر التحكم الموجودة على النافذة و حفظ تلك البيانات فى المصفوفة list
4_ تغيير حجم الخط لعناصر التحكم استنادا إلى حجم العناصر أعلاه...وذلك بأستخدام الكود التالى :
وهذا كل ما تريدة لتغير حجم النموذج و الادوات التى عليها و موضعها حينما يتم تغير دقة عرض الشاشة ...و المديول بالكامل فى المرفقات و يتم أستخدامة على النحو التالى :
1 _ قم بإضافة الموديول Module الى مشروعك
2_ فى حدث التحميل للفورم قم بكتابة الكود التالى :
3 _ فى حدث تغير النافذة Form_Resize قم بإضافة الكود التالى :
فى النهاية أرجوا أن يكون الدرس واضح للجميع و شكرا لمن علمنى هذا الدرس
أهلا وسهلا بكم أخوانى الكرام فى درس جديد عن كيفية تغير حجم نوافذ برنامج عندما تتغير دقة عرض الشاشة screen resolution و ايضا تغير حجم الادوات التى على النافذة .....بعض الاخوة ربما يعتقدون أن أنه بمجرد تغير حجم النافذة سوف يتم تغير حجم الادوات التى عليها تلقائيا و هذا غير صحيح ...وبعض الاخوة ايضا يخلطون مابين تغير حجم الادوات بتغير حجم النافذة و بين تغير موضع تلك الادوات على النافذة بتغير حجمها ....لذلك سوف نتناول بالشرح النقاط التالية :
1 _ تغيير حجم النافذة أستنادا على دقة عرض الشاشة .
2_ تغيير حجم عناصر التحكم على النافذة استنادا إلى حجم النافذة
3_تغير موضع عناصر التحكم على النافذة أستنادا الى حجم النافذة
4_ تغيير حجم الخط لعناصر التحكم استنادا إلى حجم العناصر أعلاه
الخطوة الاولى :قم بفتح مشروع جديد فى الفجوال بيسك 6 ....ثم اضف للمشروع Module وقم بتسميتها باسم FormControl
الخطوة الثانية : نقوم بفتح الموديل لتعريف المتغيرات اللازمة بأستخدام الكود التالى :
كود :
Private List() As Control
Private curr_obj As Object
Private iHeight As Integer
Private iWidth As Integer
Private x_size As Double
Private y_size As Double
الخطوة الثالثة ..بعد ما قمنا بتعريف المتغيرات اللازمة سنقوم بكتابة أجراء لاحتواء كافة خصائص عناصر التحكم الموجودة على النافذة و ذلك على النحو التالى :
كود :
Private Type Control
Index As Integer
Name As String
Left As Integer
Top As Integer
width As Integer
height As Integer
End Type
كما ترون من الكود السابق ...فإن هذا الكود يحمل كافة الخائص الخاصة للعنصر التحكم التى من خلالها نستطيع التحكم فى حجمها ...مثل الطول و العرض و مكان وضعة مثل أعلى ويسار هذا بالاضافة لمعرفة اسم الكائن المراد التحكم فية و رقم الاندكس له ....بهذا نكون قد أنتيها من الاعلان عن المتغيرات اللازمة ....هيا بنا نقوم بكتابة الاكواد اللازمة للتحكم فى حجم النافذة و الادوات التى عليها .
1 _ تغيير حجم النافذة أستنادا على دقة عرض الشاشة....ولكى نستيطع تغير حجم النافذة بتغير دقة عرض الشاشة فأننا سنتخدم خصائص العرض والارتفاع لتلك النافذة مع الكائن Screen Object و الذى سيتيح لنا الوصول إلى دقة عرض الشاشة المتوفرة لدى المستخدم ....لذلك سنقوم بإنشاء اجراء لتغير حجم النافذة مع دقة عرض الشاشة و ذلك على النحو التالى :
كود :
Public Sub ResizeForm(frm As Form)
'Set the forms height
frm.height = Screen.height / 2
'Set the forms width
frm.width = Screen.width / 2
End Sub
لو نظرنا للكود أعلاه ستجد أننا جعلنا عرض النافذة تساوى عرض الشاشة مقسومة على الرقم 2 ..و ايضا طول النافذة يساوى طول الشاشة مقسومة على الرقم 2 ...لكن هذا الكود سيقوم فقط بتغير حجم الشاشة دون أدوات التحكم التى عليه ذلك ناتى للنقطة الاخرى ..
2_ تغيير حجم عناصر التحكم على النافذة استنادا إلى حجم النافذة ...كما أشرنا أعلاه اننا لو استخدمنا الاجراء السابق فقط فأنك لن تلاحظ أى تغير على أدوات التحكم الموجودة على النافذة بل أن الاجراء السابق مثله مثل الخاصية WindowState للنوافذ التى إن جعلناها تاخذ القيمة Maximized فإن النافذة ستتغير بتغير حجم الشاشة ....إذن المطلوب هو تغير حجم عناصر التحكم بتغير حجم النوافذ
الان سنقوم بعمل أجراء يسمى ResizeControls وذلك لاستخدامة فى تغير جميع أدوات التحكم جميعها الموجودة على النافذة و ذلك على النحو التالى :
كود :
Public Sub ResizeControls(frm As Form)
Dim i As Integer
x_size = frm.height / iHeight
y_size = frm.width / iWidth
For i = 0 To UBound(List)
For Each curr_obj In frm
If curr_obj.TabIndex = List(i).Index Then
With curr_obj
.Left = List(i).Left * y_size
.width = List(i).width * y_size
.height = List(i).height * x_size
.Top = List(i).Top * x_size
End With
End If
Next curr_obj
Next i
End Sub
شرح الكود السابق :
السطر الاول : الاعلان عن المتغير i و ذلك لاستخدامه فى حلقة تكرارية فيما بعد
السطر الثانى و الثالث : الحصول على نسبة من حجم النافذة الاولى (قبل التعديل ) لحجم النافذة الحالية ...لكى يتم تغير حجم الادوات بنفس تلك النسبة .
اما من بداية السطر الرابع وحتى الاخير ....فهو عبارة عن حلقة تكرارية للحصول على جميع عناصر التحكم الموجودة على النافذة أستنادا الى رقم الفهرس Index ...وذلك لانه ليس من الاحترافية أنك تقوم بتغير حجم كل عنصر على حده لانه سيتطلب منك الكثير من الاكواد خصوصا لو أن النافذة بها العديد من عناصر التحكم وليكن 10 زر أمر و 10 مربع نص ...الخ
لذلك فى بداية الدرس قمنا بالاعلان عن المتغير curr_obj على انه كائن Object و بأستخدام الامر For Each curr_obj In frm نستطيع الحصول على كافة عناصر التحكم الموجودة على النافذة ...وقد أستخدمنا الدالةUBound للحصول على أعلى رقم Index على النافذة و التى سيتوقف عندها الحلقة التكرارية ومن ثم نحصل على جميع العناصر الموجودة فى النافذة ....ثم بعد ذلك حددنا عرض و طول و مكان عناصر التحكم على الفورم
3_تغير موضع عناصر التحكم على النافذة أستنادا الى حجم النافذة...معظم الاخوة يريدون عند تغير حجم النافذة يتم تغير موضع عناصر التحكم بها بما يتناسب مع الوضع الجديد للنافذة و يتعبرون أن تغير حجم تلك العناصر هو الحل فى ذلك لكن ذلك ليس بصحيح ....فلكى تتمكن من تغير موضع عناصر التحكم سنتخدم الكود التالى :
كود :
Public Sub GetLocation(frm As Form)
Dim i As Integer
For Each curr_obj In frm
'Resize the Array by 1, and preserve
'the original objects in the array
ReDim Preserve List(i)
With List(i)
.Name = curr_obj
.Index = curr_obj.TabIndex
.Left = curr_obj.Left
.Top = curr_obj.Top
.width = curr_obj.width
.height = curr_obj.height
End With
i = i + 1
Next curr_obj
' This is what the object sizes will be compared to on rescaling.
iHeight = frm.height
iWidth = frm.width
End Sub
شرح الكود :
السطر الاول : الاعلان عن المتغير i لاستخدامه فى الحلقة التكرارية فيما بعد
من السطر الثانى حتى الثانى عشر :عمل حلقة تكرارية لتحديد الموضع الحالى لجميع عناصر التحكم الموجودة على النافذة و حفظ تلك البيانات فى المصفوفة list
4_ تغيير حجم الخط لعناصر التحكم استنادا إلى حجم العناصر أعلاه...وذلك بأستخدام الكود التالى :
كود :
Public Function SetFontSize() As Integer
If Int(x_size) > 0 Then
SetFontSize = Int(x_size * 8)
End If
End Function
وهذا كل ما تريدة لتغير حجم النموذج و الادوات التى عليها و موضعها حينما يتم تغير دقة عرض الشاشة ...و المديول بالكامل فى المرفقات و يتم أستخدامة على النحو التالى :
1 _ قم بإضافة الموديول Module الى مشروعك
2_ فى حدث التحميل للفورم قم بكتابة الكود التالى :
كود :
Private Sub Form_Load()
GetLocation Me
ResizeForm Me
lblInstructions.Font = SetFontSize()
End Sub
3 _ فى حدث تغير النافذة Form_Resize قم بإضافة الكود التالى :
كود :
Private Sub Form_Resize()
ResizeControls Me
lblInstructions.FontSize = SetFontSize()
End Sub
فى النهاية أرجوا أن يكون الدرس واضح للجميع و شكرا لمن علمنى هذا الدرس