using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; public class DesktopCapture { [DllImport("user32.dll")] private extern static IntPtr GetDesktopWindow(); [DllImport("user32.dll")] private extern static IntPtr GetDC(IntPtr windowHandle); [DllImport("gdi32.dll")] private extern static IntPtr GetCurrentObject(IntPtr hdc, ushort objectType); [DllImport("user32.dll")] private extern static void ReleaseDC( IntPtr hdc ); const int OBJ_BITMAP = 7; public static Bitmap Capture() { IntPtr desktopWindow = GetDesktopWindow(); IntPtr desktopDC = GetDC( desktopWindow ); IntPtr desktopBitmap = GetCurrentObject(desktopDC, OBJ_BITMAP); Bitmap desktopImage = Image.FromHbitmap( desktopBitmap ); ReleaseDC(desktopDC); return desktopImage; } }
2D Graphics
Get Screen Resolution
using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Drawing.Imaging; public class Form1 : System.Windows.Forms.Form { public Form1() { InitializeComponent(); } private void InitializeComponent() { this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(292, 273); this.Text = ""; this.Resize += new System.EventHandler(this.Form1_Resize); this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); } static void Main() { Application.Run(new Form1()); } private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; Bitmap bmp = new Bitmap("winter.jpg"); g.DrawImage(bmp, 0, 0); Console.WriteLine("Screen resolution: " + g.DpiX + "DPI"); Console.WriteLine("Image resolution: " + bmp.HorizontalResolution + "DPI"); Console.WriteLine("Image Width: " + bmp.Width); Console.WriteLine("Image Height: " + bmp.Height); SizeF s = new SizeF(bmp.Width * (g.DpiX / bmp.HorizontalResolution), bmp.Height * (g.DpiY / bmp.VerticalResolution)); Console.WriteLine("Display size of image: " + s); } private void Form1_Resize(object sender, System.EventArgs e) { Invalidate(); } }
Scale subsequent operations by 3x horizontally and 2x vertically
using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Drawing.Imaging; public class Form1 : System.Windows.Forms.Form { public Form1() { InitializeComponent(); } private void InitializeComponent() { this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(292, 273); this.Text = ""; this.Resize += new System.EventHandler(this.Form1_Resize); this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); } static void Main() { Application.Run(new Form1()); } private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; g.FillRectangle(Brushes.White, this.ClientRectangle); g.DrawRectangle(Pens.Black, 10, 10, 50, 50); g.DrawEllipse(Pens.Black, 10, 10, 20, 20); // Now apply the scaling transformation // This will scale subsequent operations by 3x horizontally // and 2x vertically g.ScaleTransform(3.0f, 2.0f); // Now draw the same rectangle and circle, // but with the scaling transformation g.DrawRectangle(Pens.Black, 10, 10, 50, 50); g.DrawEllipse(Pens.Black, 10, 10, 20, 20); } private void Form1_Resize(object sender, System.EventArgs e) { Invalidate(); } }
Fill region
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Drawing.Drawing2D; public class Form1 : System.Windows.Forms.Form { private System.ComponentModel.Container components = null; public Form1() { InitializeComponent(); } protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } protected override void OnPaint ( PaintEventArgs e) { Rectangle r1 = new Rectangle(10, 10, 50, 50); Rectangle r2 = new Rectangle(40, 40, 50, 50); Region r = new Region(r1); r.Union(r2); GraphicsPath path = new GraphicsPath(new Point[] {new Point(45, 45), new Point(145, 55), new Point(200, 150), new Point(75, 150), new Point(45, 45) }, new byte[] { (byte)PathPointType.Start, (byte)PathPointType.Bezier, (byte)PathPointType.Bezier, (byte)PathPointType.Bezier, (byte)PathPointType.Line }); r.Union(path); e.Graphics.FillRegion(Brushes.Blue, r); } private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.Size = new System.Drawing.Size(300,300); this.Text = "Form1"; } static void Main() { Application.Run(new Form1()); } }
Get repainted regions
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Drawing.Imaging;
public class Form1 : System.Windows.Forms.Form
{
public Form1()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Text = “”;
this.Resize += new System.EventHandler(this.Form1_Resize);
this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
}
static void Main()
{
Application.Run(new Form1());
}
private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
Graphics g = e.Graphics;
g.FillRectangle(Brushes.White, this.ClientRectangle);
SizeF sizeF = g.MeasureString(“AA”, this.Font);
StringFormat sf = new StringFormat();
sf.LineAlignment = StringAlignment.Center;
// Set properties of the grid
int cellHeight = (int)sizeF.Height + 200;
int cellWidth = 200;
int nbrColumns = 50;
int nbrRows = 50;
// Output general info to console
Console.WriteLine(“——————————————-“);
Console.WriteLine(“e.ClipRectangle = ” + e.ClipRectangle);
Console.WriteLine(“The following cells need to be redrawn ” +
“(in whole or in part):”);
// Draw the cells and the output to console
for (int row = 0; row < nbrRows; ++row)
{
for (int col = 0; col < nbrColumns; ++col)
{
Point cellLocation = new Point(col * cellWidth,
row * cellHeight);
Rectangle cellRect = new Rectangle(cellLocation.X,
cellLocation.Y,
cellWidth, cellHeight);
if (cellRect.IntersectsWith(e.ClipRectangle))
{
Console.WriteLine("Row:{0} Col:{1}", row, col);
g.FillRectangle(Brushes.White, cellRect);
g.DrawRectangle(Pens.Black, cellRect);
String s = String.Format("{0},{1}", col, row);
g.DrawString(s, this.Font, Brushes.Black, cellRect, sf);
}
}
}
}
private void Form1_Resize(object sender, System.EventArgs e)
{
Invalidate();
}
}
[/csharp]
Get Clipping region painted
using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Drawing.Imaging; public class Form1 : System.Windows.Forms.Form { public Form1() { InitializeComponent(); } private void InitializeComponent() { this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(292, 273); this.Text = ""; this.Resize += new System.EventHandler(this.Form1_Resize); this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); } static void Main() { Application.Run(new Form1()); } private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; g.FillRectangle(Brushes.White, this.ClientRectangle); String s = "Create the necessary objects to draw the text string"; Font f = new Font("Times New Roman", 12); SizeF sf = g.MeasureString(s, f, 100); RectangleF rf = new RectangleF(10, 10, sf.Width, sf.Height); g.DrawString(s, f, Brushes.Black, rf); f.Dispose(); Console.WriteLine("Clipping region painted: " + e.ClipRectangle); } private void Form1_Resize(object sender, System.EventArgs e) { Invalidate(); } }
Region Unions
using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Drawing.Imaging; public class Form1 : System.Windows.Forms.Form { public Form1() { InitializeComponent(); } private void InitializeComponent() { this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(292, 273); this.Text = ""; this.Resize += new System.EventHandler(this.Form1_Resize); this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint); } static void Main() { Application.Run(new Form1()); } private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Graphics g = e.Graphics; g.FillRectangle(Brushes.White, this.ClientRectangle); Region reg = new Region(); reg.MakeEmpty(); GraphicsPath gp = new GraphicsPath(); gp.AddEllipse(10, 10, 50, 50); reg.Union(gp); gp.Reset(); gp.AddLine(40, 40, 70, 10); gp.AddLine(70, 10, 140, 140); gp.CloseFigure(); reg.Union(gp); reg.Union(new Rectangle(40, 50, 60, 60)); // Set the clipping region g.SetClip(reg, CombineMode.Replace); g.FillRectangle(Brushes.Green, this.ClientRectangle); gp.Dispose(); reg.Dispose(); } private void Form1_Resize(object sender, System.EventArgs e) { Invalidate(); } }