تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
مقال- كيف تلتقط صورة لأي جزء أنت تحدده علي سطح المكتب ثم تحفظها علي الهارد ديسك
#1
كاتب الموضوع : 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

أتمني أن تكون الفكرة بداية مناسبة لك عزيزي القارئ لكي تطور بها وتنتج بالنهاية برامج رائعة


بالتوفيق
أخوكم عمر


الملفات المرفقة
.zip   Screen_Shooter_v1.o.zip (الحجم : 79.18 ك ب / التحميلات : 43)
}}}
تم الشكر بواسطة: سعود


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  معلومة :: تعلم كيف تحفظ صورة في My.Settings بدون الإحتياج إلى مسارها! أسامة أحمد 4 6,097 18-07-21, 02:53 AM
آخر رد: kebboud
  مقال: الكومبو بوكس ComboBox كيف تضيف أيقونات Blue Sky 1 3,158 30-06-19, 10:41 AM
آخر رد: invocker
  إخفاء تكست في صورة silverlight 0 2,494 02-07-17, 09:31 AM
آخر رد: silverlight
  كيفية تغيير خلفية محرر الكود في Visual Studio 2010 إلى صورة أبو عمر 0 4,193 06-09-15, 06:44 PM
آخر رد: أبو عمر
  اريد كود صور سطح المكتب فيديو مع الشرح salfig 0 2,121 14-08-13, 03:04 PM
آخر رد: salfig
  طريقة من أجمل الطرق لجعل الفورم على شكل صورة عندك أسامة أحمد 63 26,025 12-05-13, 10:39 PM
آخر رد: APP
  خطوات بسيطه لجعل الفورم على شكل صورة معينه و بشكل اكثر احترافية - بدون أدوات خارجية السكر المغرور 4 7,234 08-05-13, 01:20 AM
آخر رد: السكر المغرور
  مقال- كيفية الاستغناء عن الداتا بيز التقليدية في برامجنا – ألجزء الأول RaggiTech 1 3,426 06-10-12, 12:23 AM
آخر رد: RaggiTech
  مقال- تطوير الكونترول Property Attributes الجزء الثالث RaggiTech 0 2,268 06-10-12, 12:20 AM
آخر رد: RaggiTech
  مقال- تطوير الكونترول Skin Control RaggiTech 0 2,428 06-10-12, 12:08 AM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم