Note that there are some explanatory texts on larger screens.

plurals
  1. POC# Double buffering causes lag on paint
    primarykey
    data
    text
    <p>I've been making an application in C# which is designed to mimic the appearance and behavior of Windows' Snipping Tool application. Everything is fine, except the fact that double buffering (to stop the screen flickering) appears slow and laggy. It's not much lag, but it's enough to be noticeable especially when comparing the performance between my program and Snipping Tool. What else can I do to improve the performance and make it seem like there's no lag, like in Snipping Tool?</p> <pre><code> public Image Image { get; set; } private Rectangle selection; 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)); 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); selection = new Rectangle(x1, y1, x2 - x1, y2 - y1); Invalidate(); } 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))) { var x1 = selection.X; var x2 = selection.X + selection.Width; var y1 = selection.Y; var y2 = selection.Y + selection.Height; e.Graphics.FillRectangle(br, new Rectangle(0, 0, x1, Height)); e.Graphics.FillRectangle(br, new Rectangle(x2, 0, Width - x2, Height)); e.Graphics.FillRectangle(br, new Rectangle(x1, 0, x2 - x1, y1)); e.Graphics.FillRectangle(br, new Rectangle(x1, y2, x2 - x1, Height - y2)); } using (var pen = new Pen(Color.Red, 1)) { e.Graphics.DrawRectangle(pen, selection); } } </code></pre> <p>I think the reason it lags this way is because the application creates a screenshot and resizes the capture window to match the dimensions of all screens. I have a feeling this is what Snipping Tool does too, yet it still performs much faster.</p>
    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.
    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