Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Instead of using <code>Invalidate()</code> which will invalidate the entire painting area of your control each time you do a mousemove....and thus cause more painting work to be done...you can be more efficient by only invalidating the area that you need to change by using <code>Invalidate()</code> with a specified <code>Rectangle</code>.</p> <p>When <code>OnPaint</code> is called...the <code>e.ClipRectangle</code>...equates to the "dirty" area that needs updating.....you can use that to optimize the painting work that you do in <code>OnPaint</code>.</p> <p>You could also cache the creation of your Red <code>Pen</code> and White <code>SolidBrush</code> instead of creating them each time the <code>OnPaint</code> happened...you may or may not see any difference doing that.</p> <p>Here's an update of your example:</p> <pre><code>using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication3 { public partial class CaptureScreen : Form { public Image Image { get; set; } private Rectangle selection; private Rectangle previousselection; private Point startPoint; public static Image Snip() { using (var bmp = new Bitmap(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb)) { using (var graphics = Graphics.FromImage(bmp)) graphics.CopyFromScreen(SystemInformation.VirtualScreen.Left, SystemInformation.VirtualScreen.Top, 0, 0, bmp.Size); using (var snipper = new CaptureScreen(bmp, new Point(SystemInformation.VirtualScreen.Left, SystemInformation.VirtualScreen.Top))) { if (snipper.ShowDialog() == DialogResult.OK) return snipper.Image; } return null; } } public CaptureScreen(Image screenShot, Point startPos) { InitializeComponent(); Cursor = Cursors.Cross; BackgroundImage = screenShot; ShowInTaskbar = false; FormBorderStyle = FormBorderStyle.None; StartPosition = FormStartPosition.Manual; Size = screenShot.Size; Location = startPos; SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true); } protected override void OnMouseDown(MouseEventArgs e) { if (e.Button != MouseButtons.Left) return; startPoint = e.Location; selection = new Rectangle(e.Location, new Size(0, 0)); previousselection = selection; Invalidate(); } protected override void OnMouseMove(MouseEventArgs e) { if (e.Button != MouseButtons.Left) return; var x1 = Math.Min(e.X, startPoint.X); var y1 = Math.Min(e.Y, startPoint.Y); var x2 = Math.Max(e.X, startPoint.X); var y2 = Math.Max(e.Y, startPoint.Y); Invalidate(previousselection); // invalidate old rect area so it gets blanked out previousselection = selection; selection = new Rectangle(x1, y1, x2 - x1, y2 - y1); Invalidate(selection); // invalidate new rect area so it gets drawn } protected override void OnMouseUp(MouseEventArgs e) { if (selection.Width &lt;= 0 || selection.Height &lt;= 0) return; Image = new Bitmap(selection.Width, selection.Height); using (var gr = Graphics.FromImage(Image)) { gr.DrawImage(BackgroundImage, new Rectangle(0, 0, Image.Width, Image.Height), selection, GraphicsUnit.Pixel); } DialogResult = DialogResult.OK; } protected override void OnPaint(PaintEventArgs e) { using (var br = new SolidBrush(Color.FromArgb(127, Color.White))) using (var pen = new Pen(Color.Red, 1)) using (Region region = new Region(new Rectangle(0,0,Width,Height))) { region.Exclude(selection); region.Intersect(e.ClipRectangle); e.Graphics.FillRegion(br, region); e.Graphics.DrawRectangle(pen, selection.X, selection.Y, selection.Width - 1, selection.Height - 1); } } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload