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

كيف نتحكم في حجم الفورم في جميع اعدادات الشاشة

بدأه طالبة مبتدئة في 19 نوفمبر 2009 · 9 رد · 8,767 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

عند اعداد برنامجي على جهازي كل شي ممتاز

ولكن

عند تحميله على جهاز آخر وجدت ان جزى من الفورم مختفي ولابد من سحب شريط التمرير لإظهاره

ضبطت دقة الشاشه لتكون مساويه لدقة شاشة جهازي ولكن بدون فائدة !!!!

ما الحل ؟

ولكم مني جزيل الشكر والتقدير

تحياتي طالبة مبتدئة

في برمجة الفجول

تم تعديل هذه المشاركة بواسطة طالبة مبتدئة في 19 نوفمبر 2009 في 20:17

#2

أنا عندي نفس التساؤل

#3

ماذا تقصدان بـ "حجم الفورم"؟

هل هو حجم الفورم وحده أم حجم الفورم و معه حجم مربعات التحكم داخله؟

#4

حجم الفورم و معه حجم مربعات التحكم داخله

#5

لجعل نوافذ برنامجك تعمل على اى Resolution لابد من مراعاة امرين و هما:

1 - تعديل الخاصيه Dock او Anchor او كلاهما لكل الأدوات الموجوده على نوافذ برنامجك.

2 - قم بعمل متغيرين ليكونوا عامين على البرنامج ككل و من داخل Handler الحدث MyApplication.Startup قم بتحديث قيم هاذين المتغيرين ليحتووا على حجم الشاشه و بعدها داخل الحدث Form.Load لكل نوافذك قم بالتأكد من ان حجم النافذه اقل من حجم الشاشه و الذى تم حفظه داخل المتغيرين.

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

قم بإضافة ملف كود فارغ داخل مشروعك و اضف داخله الكود التالى:

Public Class ScreenResolutionEventArgs
	Inherits EventArgs

	Private mSize as Size

	Public Sub New (s as Size)
 	MyBase.New
 	mSize = s
	End Sub

	Public ReadOnly Property CurrentSize As Size
 	Get
 	Return mSize
 	End Get
	End Property

End CLass

Public Class BaseForm
	Inherits Form

	Private mNativeSize As New Size(Me.Size.Width, Me.Size.Height)
	Private mNativeRes As New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)

	Private Const WM_DISPLAYCHANGE As Integer = &H7E

	Public Event ScreeenResolutionChanged(ByVal sender As Object, ByVal e As ScreenResolutionEventArgs)

	Protected Overrides Sub WndProc(ByRef m As Message)

 	Select Case m.Msg
 	Case WM_DISPLAYCHANGE

 	Dim s As New Size(m.LParam.ToInt32() And &HFFFF, CInt(m.LParam.ToInt32() >> 16 And &HFFFF))
 	RaiseEvent ScreeenResolutionChanged(Me, New ScreenResolutionEventArgs(s))

 	End Select

 	MyBase.WndProc(m)
	End Sub

	Protected Overrides Sub OnSizeChanged(ByVal e As System.EventArgs)
 	If DesignMode = True Then
 	mNativeSize.Width = Me.Size.Width
 	mNativeSize.Height = Me.Size.Height
 	End If
 	MyBase.OnSizeChanged(e)
	End Sub

	Public ReadOnly Property NativeSize() As Size
 	Get
 	Return mNativeSize
 	End Get
	End Property

	Public ReadOnly Property NativeResolution() As Size
 	Get
 	Return mNativeRes
 	End Get
	End Property

End Class

الملف السابق يحتوى على فئتين هم BaseForm و ScreenResolutionEventArgs الأولى هى نسخه مطوره من الفئه Form و تحتوى على حدث جديد هو ScreeenResolutionchangedو الذى سيتم تفعيله عندما يقوم المستخدم بتغيير دقة الشاشه، عند تفعيل هذا الحدث سيتم تمرير له نسخه من الفئه ScreenResolutionEventArgs و التى تحتوى بدورها على الخاصيه CurrentSize و التى تعبر عن دقة الشاشه الحاليه.

كل ما تحتاج فعله هو ان تقوم بإظهار الملفات المخفيه داخل الـ Solution Explorer ثم تقوم بفتح الملفات التى تنتهى بـ Designer.vb للنوافذ الموجوده بداخل مشروعك و تقوم بعدها بتغيير الفئه التى ترث النافذه منها بدلا من System.Windows.Forms.Form إلى BaseForm.

لا تنسى ان تقوم بعمل Build للمشروع اولا قبل فتح اى نافذه ترث من BaseForm.

بعد تنفيذ الخطوه السابقه قم بفتح محرر النوافذ و قم بتغيير الخواص التى تم ذكرها بالأعلى (Anchor او Dock) ثم قم بفتح شاشو الكود لهذه الفورم و قم بكتابة الكود التالى:

	Private Sub Form1_ScreeenResolutionChanged(ByVal sender As Object, ByVal e As ScreenResolutionEventArgs) Handles Me.ScreeenResolutionChanged
 	Dim W As Single = NativeResolution.Width / NativeSize.Width
 	Dim H As Single = NativeResolution.Height / NativeSize.Height

 	Me.Width = e.CurrentSize.Width / W
 	Me.Height = e.CurrentSize.Height / H
	End Sub

تحتوى الفئه BaseForm على خاصيتين للقراءه فقط و هم NativeSize و NativeResolution و هم يحتووا على حجم النافذه و حجم الشاشه وقت تصميمك للفورم.

نقطه هامه لتلاحظها: الخاصيه NativeSizeقيمتها تتغير فقط داخل الـ DesginTime لمعرفة حجم النافذه الجديد و بالنسبه للخاصيه NativeResolutionفالمفترض ان قيمتها تتغير فقط اذا قام المستخدم بتغيير دقة الشاشه اثناء وقت التصميم، نعم هذا سيحدث و لكن يتطلب منك بعض العمل فإذا قمت بتغيير دقة الشاشه اثناء وقت التصميم كل ما تحتاج لعمله هو عمل ReBuild للمشروع فقط ليتم تحديث بياناتها.

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

بالطبع هنا انا قمت بتحجيم الفورم بناءا على الحجم الذى كان موجود وقت التصميم قد يكون هذا الأمر مزعج بالنسبه لك حيث ان المستخدم قد يغير حجم النافذه بإستمرار لذا بناءا على المتطلبات الجديده ستحتاج لبعض الإضافات على هذا المثال و هى:

1 - تحتاج لمتغير يمثل لحجم الشاشه قبل الحالى بمعنى عندما يقوم البرنامج فى العمل ستقوم بحفظ حجم الشاشه الحالى داخل متغير معين و ليكن اسمه OldRes و بالطبع هو من نوع Size

Public Class BaseForm

	Private Shared OldSize As Size
.
.
.
End Class

بعد ذلك عندما يبدء البرنامج فى العمل نقوم بتخزين دقة الشاشه الحاليه بهذا المتغير

Imports Microsoft.VisualBasic.ApplicationServices

Namespace My

	Partial Class MyApplication
 	Private Sub AppStartup(ByVal sender As Object, ByVal e As StartupEventArgs) Handles Me.Startup
 	BaseForm.OldSize = New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
 	End Sub
	End Class
End Namespace

الأن نقوم بتعديل الكود الموجود داخل Form1_ScreeenResolutionchanged ليصبح كالتالى:

Private Sub Form1_ScreeenResolutionChanged(ByVal sender As Object, ByVal e As ScreenResolutionEventArgs) Handles Me.ScreeenResolutionChanged
	Dim W As Single = OldSize.Width / Me.Width
	Dim H As Single = OldSize.Height / Me.Height

	Me.Width = e.CurrentSize.Width / W
	Me.Height = e.CurrentSize.Height / H

	OldSize = e.CurrentSize
End Sub

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

testRes.rar

و الله ولى التوفيق

1

مدونتي: C++ Tips and Tricks

#6

مشكور أخوي على الشرح المفصل جعلة الله في ميزان حسناتك

#7

جزاك الله خير على المعلومة القيمة

#8

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Size = New Size(Screen.PrimaryScreen.Bounds.Size)

'=========== OR ============

Size = New Size(Screen.PrimaryScreen.WorkingArea.Size)

End sub

#9
محمد علاء الدين كتب:

لجعل نوافذ برنامجك تعمل على اى Resolution لابد من مراعاة امرين و هما:

1 - تعديل الخاصيه Dock او Anchor او كلاهما لكل الأدوات الموجوده على نوافذ برنامجك.

2 - قم بعمل متغيرين ليكونوا عامين على البرنامج ككل و من داخل Handler الحدث MyApplication.Startup قم بتحديث قيم هاذين المتغيرين ليحتووا على حجم الشاشه و بعدها داخل الحدث Form.Load لكل نوافذك قم بالتأكد من ان حجم النافذه اقل من حجم الشاشه و الذى تم حفظه داخل المتغيرين.

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

قم بإضافة ملف كود فارغ داخل مشروعك و اضف داخله الكود التالى:

Public Class ScreenResolutionEventArgs
	Inherits EventArgs

	Private mSize as Size

	Public Sub New (s as Size)
 	MyBase.New
 	mSize = s
	End Sub

	Public ReadOnly Property CurrentSize As Size
 	Get
 	Return mSize
 	End Get
	End Property

End CLass

Public Class BaseForm
	Inherits Form

	Private mNativeSize As New Size(Me.Size.Width, Me.Size.Height)
	Private mNativeRes As New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)

	Private Const WM_DISPLAYCHANGE As Integer = &H7E

	Public Event ScreeenResolutionChanged(ByVal sender As Object, ByVal e As ScreenResolutionEventArgs)

	Protected Overrides Sub WndProc(ByRef m As Message)

 	Select Case m.Msg
 	Case WM_DISPLAYCHANGE

 	Dim s As New Size(m.LParam.ToInt32() And &HFFFF, CInt(m.LParam.ToInt32() >> 16 And &HFFFF))
 	RaiseEvent ScreeenResolutionChanged(Me, New ScreenResolutionEventArgs(s))

 	End Select

 	MyBase.WndProc(m)
	End Sub

	Protected Overrides Sub OnSizeChanged(ByVal e As System.EventArgs)
 	If DesignMode = True Then
 	mNativeSize.Width = Me.Size.Width
 	mNativeSize.Height = Me.Size.Height
 	End If
 	MyBase.OnSizeChanged(e)
	End Sub

	Public ReadOnly Property NativeSize() As Size
 	Get
 	Return mNativeSize
 	End Get
	End Property

	Public ReadOnly Property NativeResolution() As Size
 	Get
 	Return mNativeRes
 	End Get
	End Property

End Class

الملف السابق يحتوى على فئتين هم BaseForm و ScreenResolutionEventArgs الأولى هى نسخه مطوره من الفئه Form و تحتوى على حدث جديد هو ScreeenResolutionchangedو الذى سيتم تفعيله عندما يقوم المستخدم بتغيير دقة الشاشه، عند تفعيل هذا الحدث سيتم تمرير له نسخه من الفئه ScreenResolutionEventArgs و التى تحتوى بدورها على الخاصيه CurrentSize و التى تعبر عن دقة الشاشه الحاليه.

كل ما تحتاج فعله هو ان تقوم بإظهار الملفات المخفيه داخل الـ Solution Explorer ثم تقوم بفتح الملفات التى تنتهى بـ Designer.vb للنوافذ الموجوده بداخل مشروعك و تقوم بعدها بتغيير الفئه التى ترث النافذه منها بدلا من System.Windows.Forms.Form إلى BaseForm.

لا تنسى ان تقوم بعمل Build للمشروع اولا قبل فتح اى نافذه ترث من BaseForm.

بعد تنفيذ الخطوه السابقه قم بفتح محرر النوافذ و قم بتغيير الخواص التى تم ذكرها بالأعلى (Anchor او Dock) ثم قم بفتح شاشو الكود لهذه الفورم و قم بكتابة الكود التالى:

	Private Sub Form1_ScreeenResolutionChanged(ByVal sender As Object, ByVal e As ScreenResolutionEventArgs) Handles Me.ScreeenResolutionChanged
 	Dim W As Single = NativeResolution.Width / NativeSize.Width
 	Dim H As Single = NativeResolution.Height / NativeSize.Height

 	Me.Width = e.CurrentSize.Width / W
 	Me.Height = e.CurrentSize.Height / H
	End Sub

تحتوى الفئه BaseForm على خاصيتين للقراءه فقط و هم NativeSize و NativeResolution و هم يحتووا على حجم النافذه و حجم الشاشه وقت تصميمك للفورم.

نقطه هامه لتلاحظها: الخاصيه NativeSizeقيمتها تتغير فقط داخل الـ DesginTime لمعرفة حجم النافذه الجديد و بالنسبه للخاصيه NativeResolutionفالمفترض ان قيمتها تتغير فقط اذا قام المستخدم بتغيير دقة الشاشه اثناء وقت التصميم، نعم هذا سيحدث و لكن يتطلب منك بعض العمل فإذا قمت بتغيير دقة الشاشه اثناء وقت التصميم كل ما تحتاج لعمله هو عمل ReBuild للمشروع فقط ليتم تحديث بياناتها.

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

بالطبع هنا انا قمت بتحجيم الفورم بناءا على الحجم الذى كان موجود وقت التصميم قد يكون هذا الأمر مزعج بالنسبه لك حيث ان المستخدم قد يغير حجم النافذه بإستمرار لذا بناءا على المتطلبات الجديده ستحتاج لبعض الإضافات على هذا المثال و هى:

1 - تحتاج لمتغير يمثل لحجم الشاشه قبل الحالى بمعنى عندما يقوم البرنامج فى العمل ستقوم بحفظ حجم الشاشه الحالى داخل متغير معين و ليكن اسمه OldRes و بالطبع هو من نوع Size

Public Class BaseForm

	Private Shared OldSize As Size
.
.
.
End Class

بعد ذلك عندما يبدء البرنامج فى العمل نقوم بتخزين دقة الشاشه الحاليه بهذا المتغير

Imports Microsoft.VisualBasic.ApplicationServices

Namespace My

	Partial Class MyApplication
 	Private Sub AppStartup(ByVal sender As Object, ByVal e As StartupEventArgs) Handles Me.Startup
 	BaseForm.OldSize = New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
 	End Sub
	End Class
End Namespace

الأن نقوم بتعديل الكود الموجود داخل Form1_ScreeenResolutionchanged ليصبح كالتالى:

Private Sub Form1_ScreeenResolutionChanged(ByVal sender As Object, ByVal e As ScreenResolutionEventArgs) Handles Me.ScreeenResolutionChanged
	Dim W As Single = OldSize.Width / Me.Width
	Dim H As Single = OldSize.Height / Me.Height

	Me.Width = e.CurrentSize.Width / W
	Me.Height = e.CurrentSize.Height / H

	OldSize = e.CurrentSize
End Sub

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

testRes.rar

و الله ولى التوفيق

يعطيك العافية اخ محمد

طيب كيف ذلك ( dock orAnchor وشكرا

شكرا جزيلا

الرجاء الرد

#10

السلا م عليكم ورحمة الله تعالى وبركاته

مشكور أخي jak 75 على هذا الشرح وجعله في ميزان حسناتك

 بقي هناك شيئ اخر بخصوص تناسق حجم الفورم مع باقي الشاشات

ماذ لو برمجت برنامج على شاشة 15يوصة ونقلت الى شاشة ـخرى يحجم 19بوصة

ستكون الفورم التي كانت تملا الشاشة تقريبا في الجهاز الاول اصبحت في نصف الشاشة للجهاز الثاني ذات 19 بوصة

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…