• 0
طالبة مبتدئة

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

سؤال

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

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

ولكن

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

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

ما الحل ؟

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

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

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

تم تعديل بواسطه طالبة مبتدئة
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

9 إجابة على هذا السؤال .

  • 0

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لجعل نوافذ برنامجك تعمل على اى 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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لجعل نوافذ برنامجك تعمل على اى 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 وشكرا

شكرا جزيلا

الرجاء الرد

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

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

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

 
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .