السلام عليكم
تحية طيبة و بعد
كنت أود عمل برنامج مثل برنامج Snag it!
و هو من أشهر برامج إتقاط صورة للشاشة أو لجزء منها
فأين يمكنني أن أقرأ لأصل إلى هذا الموضوع ؟؟ََ!!
و لكم جزيل الشكر
أخوكم
Mr.Pro
ملحوظة : نصحني أحدهم بالقراءة في ال Buffer Managment
السلام عليكم
تحية طيبة و بعد
كنت أود عمل برنامج مثل برنامج Snag it!
و هو من أشهر برامج إتقاط صورة للشاشة أو لجزء منها
فأين يمكنني أن أقرأ لأصل إلى هذا الموضوع ؟؟ََ!!
و لكم جزيل الشكر
أخوكم
Mr.Pro
ملحوظة : نصحني أحدهم بالقراءة في ال Buffer Managment
السلام عليكم
شكرا جزيلا أخي على هذا السؤال الرائع
اقتباسملحوظة : نصحني أحدهم بالقراءة في ال Buffer Managment
لا تجهد نفسك فأنت في منتدى الفريق العربي للبرمجة (h)
تفاصيل الكود
هذه الدول الأصلية التي ستحتاجها
[DllImport("gdi32.dll")]
public static extern bool BitBlt(IntPtr hdcDst, int xDst, int yDst, int cx, int cy, IntPtr hdcSrc, int xSrc, int ySrc, uint ulRop);
[DllImport("gdi32.dll")]
public static extern bool StretchBlt(IntPtr hdcDst, int xDst, int yDst, int cx, int cy, IntPtr hdcSrc, int xSrc, int ySrc, int cxSrc, int cySrc, uint ulRop);
[DllImport("gdi32.dll")]
public static extern IntPtr CreateDC(IntPtr lpszDriver, string lpszDevice, IntPtr lpszOutput, IntPtr lpInitData);
[DllImport("gdi32.dll")]
public static extern IntPtr DeleteDC(IntPtr hdc);BitBlt توفر هذه الدالة من نقل مجموعة من بت من المعطيات حول اللون من سياق الى سياق آخر.
StretchBlt تقوم هذه الدالة بنقل محتوى صورة من مجال الى مجال آخر
CreateDC تقوم هذه الدالة بإنشاء سياق الجهاز بالإعتماد على إسمه
DeleteDC تقوم هذه الدالة بإلغاء سياق لجهاز معين
هذان المتغيران أحدهما لحجز مجال لتضع فيه المعطيات التي إلتقطتها و الآخر لخزن جميع النوافذ المفتوحة
Rectangle CScreen = Rectangle.Empty; Screen[] screens = Screen.AllScreens;
حجز مستطيل الرسم على أنه مجموع باقي الشاشات المتواجدة
foreach (Screen screen in screens) CScreen = Rectangle.Union(CScreen, screen.Bounds);
جمع كافة خصائص الرسم اللازمة للمجال الذي حجزناه في أول الكود
Graphics g = Graphics.FromImage(finalBitmap); g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed; g.FillRectangle(SystemBrushes.Desktop, 0, 0, CScreen.Width - CScreen.X, CScreen.Height - CScreen.Y);
نقل محتوى خلفية الشاشة إلى المتغير الذي عرفناه وحددنا خصائصه
if (!StretchBlt(hdcDestination, screen.Bounds.X - CScreen.X, screen.Bounds.Y - CScreen.Y, screen.Bounds.Width, screen.Bounds.Height, hdcSource, 0, 0, screen.Bounds.Width, screen.Bounds.Height, (int)0x00CC0020))
{
System.ComponentModel.Win32Exception win32Exception = new System.ComponentModel.Win32Exception();
System.Diagnostics.Trace.WriteLine(win32Exception);
}يبقى الآن تفريغ الموارد التي تم حجزها
DeleteDC(hdcSource); g.ReleaseHdc(hdcDestination); g.Dispose();
هنا ينتهي الكود الرئيسي.
نبدأ الآن في كود جمالية البرنامج
إستعملت صورتان Pictureboxفي هذا البرنامج واحدة لإظهار الصورة الملتقطة والثانية تعوض زر
private void pictureBox2_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
string path = "C:\\" + DateTime.Today.Date.ToString("f") + ".jpg";
pictureBox1.Image = Capture();
this.WindowState = FormWindowState.Normal;
Bitmap image = new Bitmap(pictureBox1.Image);
image.Save(path);
MessageBox.Show(string.Format("Your image was saved in {0}", path), "Saved Image");
}عند أمر الإلتقاط نافذة البرنامج تختفي ثم تعود لكي لا يتم إلتقاطها أيضا يلي ذلك يتم حفظ الصورة في المجلد الرئيسي لحاسوبك مع تاريخ إلتقاطها.
ما الحل إذا كبر المستعمل نافذة البرنامج لرؤية الصورة كاملة؟؟؟
هناك أرقام معينة تحدد حال النافذة: تم تكبيرها, عادية, أو إنزالها
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0112)
if (((int)m.WParam & 0xFFF0) == 0xF030)
{ BeginInvoke(new EventHandler(Form_Maximized), this, EventArgs.Empty);
}
base.WndProc(ref m);
}الإختبار الأول يخص ما إذا كان هناك حدث يخص حجم النافذة والثاني يخص حالة معينة وهي التكبير علما أن للتغيره الى إختبار حدث تصغير النافذة عوض 0xF030ب 0xF020
ونلاحظ هنا أنه تم إستدعاء دالة أخرى وهي وفيهاForm_Maximized يتم كتابة الحدث الذي نريد تشغيله
private void Form_Maximized(object sender, EventArgs e)
{ pictureBox2.Visible = false;
pictureBox1.Size = this.Size;
}وقمت داخل الدالة بتكبير حجم الصورة وإخفاء الزر
اقتباسكنت أود عمل برنامج مثل برنامج Snag it!
الآن صار بإمكانك ذلك ولله الحمد
بارك الله فيك موضوع ملفت للنظر
أشكرك بشدة أخي العزيز
Ben_Laiid
وجزاكم الله خيرا
و أعتذر عن عدم سرعة الرد لإنشغالي في الإمتحانات
هذا الموضوع مغلق.