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

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم مقالات VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=184)
+--- الموضوع : رسم الفورم و طباعته (/showthread.php?tid=20774)



رسم الفورم و طباعته - silverlight - 18-06-17

غالبا أغلب المبرمجين حين يطبعون الفورم
يأخذون صورة للفورم و يقومون بطباعتها
وهذا يؤدي الي أعباء مالية علي المستخدم و السبب هنا انك ستطبع الفورم بألوانه كاملة مثل لون الخلفية و منطقة Non Client Area بألوانها

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

الفكرة:

الفكرة تعتمد علي التالي:
1- حساب أماكن الكونترول و bounds الخاصة بها علي الفورم
2- حساب ابعاد الفورم و حساب المستطيلات التي تعبر عن Non Client Area علي الفورم
ويمكن تعريف Non Client Area بأنها المنطقة التي يوجد به اسم الفورم و الإطار الخارجي للفورم وأيقونة الفورم بالإضافة الي الثلاثة باتون الخاصة بإغلاق و تكبير و تضغير الفورم علي شاشة الكمبيوتر
3- بناء علي تلك الحسابات نرسم الفورم بأنفسنا


الكود التالي يوضح كيفية رسم الفورم

PHP كود :
   Private Function DrawForm() As Bitmap

        Dim border 
As Integer 8
        Dim caption 
As Integer 23
        Dim bmp 
As Bitmap = New Bitmap(Me.WidthMe.Height)
 
       Using g As Graphics Graphics.FromImage(bmp)
 
           g.Clear(Color.White)

 
           Dim imageBounds As Rectangle = New Rectangle(00bmp.Widthbmp.Height)
 
           Dim frame As Rectangle = New Rectangle(borderborder captionbmp.Width borderbmp.Height border caption)
 
           Dim captionRect As Rectangle = New Rectangle(borderborderbmp.Width bordercaption)
 
           g.DrawRectangle(New Pen(Color.Black), captionRect)
 
           Dim s As String Me.Text
            Dim ico 
As Icon Me.Icon
            Dim sized 
As Icon Nothing

            If ico IsNot Nothing Then
                sized 
= New Icon(ico, New Size(1616))
 
               g.DrawIcon(sizedborderborder CInt(sized.Height 4))
 
           End If

 
           If Not String.IsNullOrEmpty(sThen
                Dim x 
As Integer border sized.Width
                Dim y 
As Integer border CInt(sized.Height 4)
 
               g.DrawString(sMe.Font, New SolidBrush(Color.Black), xy)
 
           End If
 
           Dim rects As Rectangle() = GetRects(bordercaption)

 
           For i As Integer 0 To rects.Length 1
                Dim r 
As Rectangle rects(i)
 
               Dim ctrl As Control Controls(i)
 
               Dim ctrlBitmap As Bitmap = New Bitmap(ctrl.Widthctrl.Height)
 
               Dim clr As Color ctrl.BackColor
                ctrl
.BackColor Color.White
                Threading
.Thread.Sleep(5)
 
               ctrl.DrawToBitmap(ctrlBitmap, New Rectangle(00ctrl.Widthctrl.Height))

 
               ctrl.BackColor clr
                g
.DrawImage(ctrlBitmapr.Xr.Y)
 
           Next

            g
.DrawRectangle(New Pen(Color.Black), frame)
 
       End Using

        Return bmp
    End 
Function

 
   Private Function GetRects(border As Integercaption As Integer) As Rectangle()
 
       Dim ctrls As ControlCollection Me.Controls
        Dim rects 
As Rectangle() = New Rectangle(ctrls.Count 1) {}
 
       For i 0 To ctrls.Count 1
            Dim c 
As Control ctrls(i)
 
           Dim r As Rectangle c.Bounds
            r
.+= border
            r
.+= border caption
            rects
(i) = r
        Next
        Return rects
    End 
Function 

الصورة الناتجة من الدالة اعلاة يمكن حفظها او طباعتها علي ورقة بكل سهولة

وكمثال بسيط
الكود التالي يوضح كيف تحفظ الصورة الي ملف علي فهرس المشروع


PHP كود :
DrawForm().Save(".\" + anyName + ".png") 

هذا شكل الصورة لأحد الفورم التي رسمتها
[attachment=14626]

بالتاكيد يمكن تطوير الكود بأساليب كثيرة

تقبلوا تحياتي


RE: رسم الفورم و طباعته - silverlight - 19-06-17

تم إضافة السورس كود في المرفقات
الكود في المرفقات بنسخة الفيجوال استوديو 2015