منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
الحل النهائي لاستخدام برنامجك بأي شاشة مهما كانت دقتها - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم امثلة ومشاريع VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=188)
+--- الموضوع : الحل النهائي لاستخدام برنامجك بأي شاشة مهما كانت دقتها (/showthread.php?tid=49372)



الحل النهائي لاستخدام برنامجك بأي شاشة مهما كانت دقتها - zazasami - 01-07-24

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

مشكلة تواجه اغلب المبرمجين و خاصة المبتدئين منهم حيث ان حجم الشاشة او دقة الشاشة كما يسميها البعض تختلف من حاسوب الى اخر  و هذا الاختلاف سيكون مشكلة حيث ستتداخل الازرار و الادوات مع بعضها البعض اذا صغر حجم الشاشة او ستظهر هوامش لا معنى لها اذا كبر الحجم 

و الحل بسيط و هو عبارة عن مجموعة اكواد طويلة قليلا انسخها و اكتبها كما هي عندك و ستحل المشكلة باذن الله

اليكم الاكواد
PHP كود :
Private DefaultControlSizes As New Dictionary(Of ControlCtrlInfo)
 
   Private FormDefaultClientSize As Size

    Public Sub 
New()
 
       InitializeComponent()
 
       Me.WindowState FormWindowState.Normal
        Me
.MinimumSize Me.Size
        FormDefaultClientSize 
Me.ClientSize

        Dim ctrl 
As Control Me.GetNextControl(MeTrue)
 
       While ctrl IsNot Nothing
            If TypeOf ctrl Is ListBox Then DirectCast
(ctrlListBox).IntegralHeight False
            DefaultControlSizes
.Add(ctrl, New CtrlInfo(ctrl.Boundsctrl.Font.Size))
 
           ctrl Me.GetNextControl(ctrlTrue)
 
       End While
 
   End Sub

    Private Sub ScaleControls
()
 
       If Me.WindowState <> FormWindowState.Minimized Then
            For Each kvp 
As KeyValuePair(Of ControlCtrlInfoIn DefaultControlSizes
                Dim ctrl 
As Control kvp.Key

                Dim Xscl 
As Double Me.ClientSize.Width FormDefaultClientSize.Width
                Dim Yscl 
As Double Me.ClientSize.Height FormDefaultClientSize.Height

                
'comment out these 2 lines if you dont want the fonts to be scaled'

 
               Dim fntscl As Single CSng(kvp.Value.cFontSize Yscl)
 
               ctrl.Font = New Font(ctrl.Font.FontFamilyfntsclctrl.Font.Stylectrl.Font.Unit)

 
               ctrl.Width CInt(kvp.Value.cBounds.Width Xscl)
 
               ctrl.Height CInt(kvp.Value.cBounds.Height Yscl)
 
               ctrl.Left CInt(kvp.Value.cBounds.Xscl)
 
               ctrl.Top CInt(kvp.Value.cBounds.Yscl)
 
           Next
        End 
If
 
   End Sub

    Private Sub Form1_Resize
(ByVal sender As ObjectByVal e As System.EventArgsHandles Me.Resize
        ScaleControls
()
 
   End Sub
End 
Class

Public Class 
CtrlInfo
    Public cBounds 
As Rectangle
    Public cFontSize 
As Single
    Public Sub 
New(ByVal Bnds As RectangleByVal FntSize As Single)
 
       cBounds Bnds
        cFontSize 
FntSize
    End Sub 



RE: الحل النهائي لاستخدام برنامجك بأي شاشة مهما كانت دقتها - Kamil - 02-07-24

الافضل لعدم التكرار في جميع الفورم عبر كلاس في vb.net
وجلبه من الفورم
انشاء كلاس 
PHP كود :
Public Class ControlScaler
    Private DefaultControlSizes 
As New Dictionary(Of ControlCtrlInfo)
 
   Private FormDefaultClientSize As Size

    Public Sub 
New(form As Form)
 
       form.WindowState FormWindowState.Normal
        form
.MinimumSize form.Size
        FormDefaultClientSize 
form.ClientSize

        
' تحديد الحجم الأصلي لكل عنصر تحكم وحفظه في القاموس
        Dim ctrl As Control = form.GetNextControl(form, True)
        While ctrl IsNot Nothing
            If TypeOf ctrl Is ListBox Then
                DirectCast(ctrl, ListBox).IntegralHeight = False ' 
عدم تكبير الـ ListBox تلقائيًا
            End 
If
 
           DefaultControlSizes.Add(ctrl, New CtrlInfo(ctrl.Boundsctrl.Font.Size))
 
           ctrl form.GetNextControl(ctrlTrue)
 
       End While

 
       ' ربط الحدث Resize للنموذج
        AddHandler form.Resize, Sub(sender, e) ScaleControls(form)
    End Sub

    Private Sub ScaleControls(form As Form)
        If form.WindowState <> FormWindowState.Minimized Then
            ' 
حساب عامل التحجيم للعرض والارتفاع
            Dim Xscl 
As Double form.ClientSize.Width FormDefaultClientSize.Width
            Dim Yscl 
As Double form.ClientSize.Height FormDefaultClientSize.Height

            
' تحجيم حجم الخطوط
            For Each kvp As KeyValuePair(Of Control, CtrlInfo) In DefaultControlSizes
                Dim ctrl As Control = kvp.Key
                Dim fntscl As Single = CSng(kvp.Value.cFontSize * Yscl)
                ctrl.Font = New Font(ctrl.Font.FontFamily, fntscl, ctrl.Font.Style, ctrl.Font.Unit)

                ' 
تحجيم الأبعاد
                ctrl
.Width CInt(kvp.Value.cBounds.Width Xscl)
 
               ctrl.Height CInt(kvp.Value.cBounds.Height Yscl)
 
               ctrl.Left CInt(kvp.Value.cBounds.Xscl)
 
               ctrl.Top CInt(kvp.Value.cBounds.Yscl)
 
           Next
        End 
If
 
   End Sub
End 
Class

Public Class 
CtrlInfo
    Public cBounds 
As Rectangle
    Public cFontSize 
As Single

    Public Sub 
New(Bnds As RectangleFntSize As Single)
 
       cBounds Bnds
        cFontSize 
FntSize
    End Sub
End 
Class 
 
استخدام الكلاس في الفورم 

PHP كود :
Public Partial Class Form1
    Inherits Form

    Private controlScaler 
As ControlScaler

    Public Sub 
New()
 
       InitializeComponent()
 
       controlScaler = New ControlScaler(Me' إنشاء كائن من كلاس ControlScaler وتمرير الفورم إليه
    End Sub
End Class 

اما في سي شارب
انشاء كلاس 
PHP كود :
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

public class 
ControlScaler
{
 
   private Dictionary<ControlCtrlInfoDefaultControlSizes = new Dictionary<ControlCtrlInfo>();
 
   private Size FormDefaultClientSize;

 
   public ControlScaler(Form form)
 
   {
 
       form.WindowState FormWindowState.Normal;
 
       form.MinimumSize form.Size;
 
       FormDefaultClientSize form.ClientSize;

 
       // تحديد الحجم الأصلي لكل عنصر تحكم وحفظه في القاموس
 
       Control ctrl form.GetNextControl(formtrue);
 
       while (ctrl != null)
 
       {
 
           if (ctrl is ListBox)
 
           {
 
               ((ListBox)ctrl).IntegralHeight false// عدم تكبير الـ ListBox تلقائيًا
 
           }
 
           DefaultControlSizes.Add(ctrl, new CtrlInfo(ctrl.Boundsctrl.Font.Size));
 
           ctrl form.GetNextControl(ctrltrue);
 
       }

 
       // ربط الحدث Resize للنموذج
 
       form.Resize += (sendere) => ScaleControls(form);
 
   }

 
   private void ScaleControls(Form form)
 
   {
 
       if (form.WindowState != FormWindowState.Minimized)
 
       {
 
           // حساب عامل التحجيم للعرض والارتفاع
 
           double Xscl = (double)form.ClientSize.Width FormDefaultClientSize.Width;
 
           double Yscl = (double)form.ClientSize.Height FormDefaultClientSize.Height;

 
           // تحجيم حجم الخطوط
 
           foreach (KeyValuePair<ControlCtrlInfokvp in DefaultControlSizes)
 
           {
 
               Control ctrl kvp.Key;
 
               float fntscl = (float)(kvp.Value.cFontSize Yscl);
 
               ctrl.Font = new Font(ctrl.Font.FontFamilyfntsclctrl.Font.Stylectrl.Font.Unit);

 
               // تحجيم الأبعاد
 
               ctrl.Width = (int)(kvp.Value.cBounds.Width Xscl);
 
               ctrl.Height = (int)(kvp.Value.cBounds.Height Yscl);
 
               ctrl.Left = (int)(kvp.Value.cBounds.Xscl);
 
               ctrl.Top = (int)(kvp.Value.cBounds.Yscl);
 
           }
 
       }
 
   }
}

public class 
CtrlInfo
{
 
   public Rectangle cBounds;
 
   public float cFontSize;

 
   public CtrlInfo(Rectangle Bndsfloat FntSize)
 
   {
 
       cBounds Bnds;
 
       cFontSize FntSize;
 
   }


استدعائه في الفورم
PHP كود :
using System;
using System.Windows.Forms;

public 
partial class Form1 Form
{
 
   private ControlScaler controlScaler;

 
   public Form1()
 
   {
 
       InitializeComponent();
 
       controlScaler = new ControlScaler(this); // إنشاء كائن من كلاس ControlScaler وتمرير الفورم إليه
 
   }




RE: الحل النهائي لاستخدام برنامجك بأي شاشة مهما كانت دقتها - raedre22 - 15-07-24

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


RE: الحل النهائي لاستخدام برنامجك بأي شاشة مهما كانت دقتها - Lathe1 - 30-07-24

كيفية استخدام الكلاس