كاتب الموضوع : silverlight
كيف تأخذ صورة لأي جزء علي سطح المكتب ثم تحفظها علي الهارد ديسك اللغة المستخدمة: الفيجوال بيسك
التطبيق: فيجوال استوديو 2005 و 2008
المستوي: التقييم متروك للقارئ
إعداد: مهندس / عمر أمين إبراهيم
منذ عام تقريبا كنت قد كتبت موضوع عن كيف تأخذ صورة لسطح المكتب بطريقة سهلة وسريعة ومن ثم تحفظها علي الهارد ديسك
وهذا المقال من الممكن إعتباره إمتدادا لنفس الموضوع السابق والموجود في اللينك أعلاه
و في هذا المقال سنناقش بتفاصيل أكثر قليلا الطريقة و الكيفية لأخذ صورة لأي جزء من سطح المكتب علي أن تقوم انت بتحديد واختيار المكان الذي تريده باستخدام الماوس ومن ثم بعد ذلك تقوم بحفظ الصورة علي جهازك
كيف نفعل ذلك? : الفكرة يمكن توضيحها في النقاط التالية:-
أولا: نفتح مشروع عادي وأتوماتكيا سيقوم الفيجوال استوديو بإنشاء فورم وهو الفورم الأول Form1 ثم نضيف الي هذه الفورم ثلاثة باتون و بكتشر بوكس
الباتون الأول: الهدف منه أخذ الصورة لأي مكان نحدده علي سطح المكتب
الباتون الثاني: الهدف منه إظهار الصورة في البكتشر بوكس
الباتون الثالث: الهدف منه حفظ الصورة علي الهارد ديسك
البكتشر بوكس: الهدف منه بالطبع معروف للجميع وهو المكان الذي سوف تظهر به الصورة
قم بضبط هذه الأشياء الأربعة بالطريقة التي تريد داخل الفورم الأول Form1
وسنكتفي قليلا بالعمل مع الفورم الأول أو Form1 وننتقل بعد ذلك الي الجزء المهم في المقال
ثانيا: نضيف الي المشروع كلاس ونطلق عليه ScreenCapturer ومن ثم وباستخدام الوراثة نضيف Form الي هذه الكلاس وهذا الفورم يمكننا أن نطلق عليه الفورم الخفي أي أنه لن يظهر علي الاطلاق للعين أثناء عملية تنفيذ البرنامج وكل ما سوف يراه المستخدم هو حركة الماوس وشكل Cursor وأيضا المستطيل الذي يحدد مكان الصورة التي يريدها من سطح المكتب
ثالثا: نغير في خصائص هذا الفورم عن طريق الكود بحيث نجعل قيمة FormBorderStyle = FormBorderStyle.None وأيضا نجعل قيمة WindowState = FormWindowState.Maximized وايضا نقوم بضبط الخاصية SetStyle وكل ذلك سيتم من داخل Constructor الخاص بهذا الفورم الخفي وأيضا سوف نستخدم Constructor لربط الفورم الخفي مع الفورم الأول Form1
رابعا: وباستخدام الكود نقوم بأخذ صورة كاملة لسطح المكتب ومن ثم نجعل هذه الصورة خلفية للفورم الخفي أو الفورم الذي ورثناه وهو هنا الكلاس ScreenCapturer
خامسا: نتعامل مع بعض الأحداث Events الموجودة بهذا الفورم الخفي مثل الحدث MouseDown و MouseMove و MouseUp و أخيرا الحدث Paint وهنا سنعطي مستخدم البرنامج امكانية تحديد مكان ما علي الفورم عن طريق الماوس حيث سيتم رسم مستطيل تخيلي مع حركة الماوس وبالتالي ستكون أبعاد هذا المستطيل بمثاية الصورة التي نريد إلتقاطها للمكان الذي نحدده علي سطح المكتب
سادسا: نرسل الصورة التي أخذناها الي Clipboard ومن ثم نستطيع استرجاعها دخل الفورم الأول ونظهرها داخل البكتشر بوكس الموجود في الفورم الأول Form1
وستلاحظون في الكود كيف سوف نستفيد من بعض صفات الفورم مثل الخاصية Hide وخاصة Cursor ونقوم بتغييرهم كيفما شئنا بحيث لا يشعر مستخدم البرنامج أنه هناك فورم أخر موجود وأنا هنا اتحدث عن الفوم الخفي
الكود التالي يوضح الكود الخاص للكلاس ScreenCapturer أو ما سبق وأطلقنا عليه إسم الفورم الخفي
كود :
Public Class ScreenCapturer
Inherits System.Windows.Forms.Form
#Region "Variables"
Private m_color As Color
Private CaptureRectangle As New Rectangle(New Point(0, 0), New Size(0, 0))
Private isDrag As Boolean = False
Private startPoint As Point
#End Region
#Region "Constructor"
Public Sub New(ByVal Parent As Form)
Me.Owner = Parent
Me.FormBorderStyle = FormBorderStyle.None
Me.WindowState = FormWindowState.Maximized
Me.SetStyle(ControlStyles.DoubleBuffer Or _
ControlStyles.AllPaintingInWmPaint Or _
ControlStyles.ResizeRedraw Or _
ControlStyles.UserPaint Or _
ControlStyles.SupportsTransparentBackColor, True)
Me.ShowInTaskbar = False
m_color = Color.FromArgb(25, Color.Green)
End Sub
#End Region
#Region "Property"
Public Property RectCaptureColor() As Color
Get
Return m_color
End Get
Set(ByVal value As Color)
m_color = value
End Set
End Property
#End Region
#Region "Methods"
Public Sub GetScreenShot()
Me.Owner.Hide()
Threading.Thread.Sleep(250)
' get screen shot of the whole screen and set it as background for the current form
Dim bounds As Rectangle
Dim screenshot As System.Drawing.Bitmap
Dim graph As Graphics
bounds = Screen.PrimaryScreen.Bounds
screenshot = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
graph = Graphics.FromImage(screenshot)
graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy)
Me.BackgroundImage = screenshot
Me.Cursor = Cursors.Cross
Me.Show()
End Sub
Public Sub GetScreenShotImage(ByVal Rect As Rectangle)
If Rect.Width > 0 And Rect.Height > 0 Then
Dim bmp As Bitmap = New Bitmap(Rect.Width, Rect.Height)
Dim blockRegionSize As Size = New Size(Rect.Width, Rect.Height)
Dim g1 As Graphics = Graphics.FromImage(bmp)
g1.CopyFromScreen(Rect.Location, New Point(0, 0), blockRegionSize)
Clipboard.SetImage(bmp)
'g1.Dispose()
'bmp = Nothing
End If
End Sub
#End Region
#Region "Event Handlers"
Private Sub ScreenCapturer_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
If (e.Button = MouseButtons.Left) Then
isDrag = True
End If
Dim control As Control = CType(sender, Control)
' Calculate the startPoint by using the PointToScreen method.
startPoint = control.PointToScreen(New Point(e.X, e.Y))
End Sub
Private Sub ScreenCapturer_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
If (isDrag) Then
ControlPaint.DrawReversibleFrame(CaptureRectangle, Me.BackColor, FrameStyle.Dashed)
Dim endPoint As Point = CType(sender, Control).PointToScreen(New Point(e.X, e.Y))
Dim width As Integer = endPoint.X - startPoint.X
Dim height As Integer = endPoint.Y - startPoint.Y
CaptureRectangle = New Rectangle(startPoint.X, startPoint.Y, width, height)
ControlPaint.DrawReversibleFrame(CaptureRectangle, Me.BackColor, FrameStyle.Dashed)
Me.Invalidate()
End If
End Sub
Private Sub ScreenCapturer_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
isDrag = False
ControlPaint.DrawReversibleFrame(CaptureRectangle, Me.BackColor, FrameStyle.Dashed)
Me.Hide()
Threading.Thread.Sleep(250)
' get the image
GetScreenShotImage(CaptureRectangle)
Me.Cursor = Cursors.Default
Me.Owner.Show()
CaptureRectangle = New Rectangle(0, 0, 0, 0)
End Sub
Private Sub ScreenCapturer_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Dim rect As Rectangle = CaptureRectangle
If rect.Width < 0 Then
rect.X += rect.Width
rect.Width = -rect.Width
End If
If rect.Height < 0 Then
rect.Y += rect.Height
rect.Height = -rect.Height
End If
e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(25, m_color)), rect)
e.Graphics.DrawRectangle(SystemPens.Highlight, rect)
End Sub
#End Region
End Class
الأن وبعد ان قمنا بكتابة الكود للكلاس ScreenCapturer علينا ان نعود الأن الي الفورم الأول Form1 لكي نكتب الكود النهائي حيث هنا سنقوم بتعريف متغير يعبر عن الكلاس ScreenCapturer ونضع بعض الأكواد داخل أحداث الباتون الثلاثة الموجودة بالفورم الأول والشكل النهائي للكود المطلوب كتابته بالفورم الأول سيكون كالتالي
كود :
Public Class Form1
' تعريف الكلاس الخفي
' define the ScreenCapturer class
Private sc As ScreenCapturer
' Take The Screen shot
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' ربط الكلاس الخفي مع الفورم الول
sc = New ScreenCapturer(Me)
sc.GetScreenShot()
' Clear Pictureboc Image
PictureBox1.Image = Nothing
End Sub
' قراءة الصورة
' ثم ظهار الصورة في البكتشر بوكس
' Read Image from clipboard and set the picture in picturebox1
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If Clipboard.GetDataObject().GetDataPresent(DataFormats.Bitmap) Then
Dim bmp As Bitmap = CType(Clipboard.GetData(DataFormats.Bitmap), Bitmap)
PictureBox1.Image = bmp
PictureBox1.SizeMode = PictureBoxSizeMode.CenterImage
End If
End Sub
' حفظ الصورة
' Save the image to the your hard disk
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If PictureBox1.Image Is Nothing Then
Exit Sub
End If
Dim sfd As New SaveFileDialog()
With sfd
.Filter = "JPEGs|*.jpeg"
End With
If sfd.ShowDialog() = DialogResult.OK Then
PictureBox1.Image.Save(sfd.FileName, Imaging.ImageFormat.Jpeg)
End If
End Sub
End Class
في المرفقات ستجدون صورة من المشروع بنسخة 2008
أتمني أن تكون الفكرة بداية مناسبة لك عزيزي القارئ لكي تطور بها وتنتج بالنهاية برامج رائعة
بالتوفيق
أخوكم عمر