5

I have a Winforms application that the user uses to take a region based screenshot. I want to have a small preview pane, but i'm not sure how to do it. So far i tried recreating a bitmap on mouse move and its just way too laggy to be usable. So i thought if i used a pre-defined image (screenshot of the whole screen) and moved it inside the picturebox based off the mouse location so that you get a zoomed in look at the screen (to select the precise pixels you want to take the screenshot with easier). I'm not sure how i can implement this, i am also pretty new to drawing so i will show you what i have now.

private void falseDesktop_MouseMove(object sender, MouseEventArgs e)
    {
        zoomBox.Image = showZoomBox(e.Location);
        zoomBox.Invalidate();
    }

private Image showZoomBox(Point curLocation)
        {
            int x = 0;
            int y = 0;
            if (curLocation.X - 12 <= 0)
            {
                x = curLocation.X - 12;
            }
            else
            {
                x = curLocation.X;
            }

            if (curLocation.Y - 11 <= 0)
            {
                y = curLocation.Y - 11;
            }
            else
            {
                y = curLocation.Y;
            }

            Point start = new Point(curLocation.X - 12, curLocation.Y - 11);
            Size size = new Size(24, 22);
            Rectangle rect = new Rectangle(start, size);
            Image selection = cropImage(falseDesktop.Image, rect);
            return selection;
        }

private static Image cropImage(Image img, Rectangle cropArea)
    {
        if (cropArea.Width != 0 && cropArea.Height != 0)
        {
            Bitmap bmpImage = new Bitmap(img);
            Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
            bmpImage.Dispose();
            return (Image)(bmpCrop);
        }
        return null;
    }

EDIT:

Here is a mock up like requested:

The black part of this image is a panel, of course the text being a label and the area where you see the image (stack overflow) would be the picturebox (called zoomBox) the lines on top of the zoomBox would be a guide and where the 2 lines intersect would be the mouse position. Hope this is a better assist to help you understand my issue.

alt text

Another thing that might help explain my issue is The form actually fills the entire screen with a "false desktop". its a picturebox that covers the entire screen with a screenshot of the desktop when "printscreen" was pressed. So I want this little "preview pane" to basically be a zoomed in location of where the mouse is.

tshepang
  • 12,111
  • 21
  • 91
  • 136
Alex
  • 2,114
  • 9
  • 25
  • 34
  • Your problem sounds interesting but it's hard to figure out your intent from the code snippet. The best way to proceed could be to create a mock-up with MS Paint to show what you're after, IMO. (You'll need to upload and link to the mock-up pic...) – Paul Sasik Dec 01 '10 at 15:07
  • @Paul: I added more details and a mock up image for you. – Alex Dec 01 '10 at 15:16
  • I added a complete code sample that might help you. It's hard coded and a bit hack-ish but might be useful to you. – Paul Sasik Dec 01 '10 at 19:08
  • Just a warning: This application sounds a lot like the [Snipping Tool](http://windows.microsoft.com/en-US/windows7/products/features/snipping-tool) that is bundled with Windows Vista and 7. – Powerlord Dec 01 '10 at 19:35
  • Snipping tool code is here: http://stackoverflow.com/questions/3123776/net-equivalent-of-snipping-tool/3124252#3124252 – Hans Passant Dec 01 '10 at 22:17

2 Answers2

2

This is a little bit laggy, but worth a try:

It's a WInForms app in a single file showing how a "live" zoom might work. It doesn't paint the cross hairs etc. that's up to you.

Key Parts:

  • _scale
  • PictureBoxSizeMode.StretchImage

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Imaging;

static class Program {
[STAThread]
static void Main() {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}
}

public class Form1 : Form {
private Bitmap _myImage = new Bitmap(@"C:\Users\Public\Pictures\Sample   Pictures\LightHouse.jpg");
private int _scale = 10; // keep this < 15

private PictureBox pboxMain;
private PictureBox pboxZoom;
private System.ComponentModel.IContainer components;

public Form1() {
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
    pboxMain.Image = _myImage;
}

private void pboxMain_MouseMove(object sender, MouseEventArgs e) {
    try {
        Rectangle rc = new Rectangle(
            new Point(e.X - _scale, e.Y - _scale),
            new Size(_scale * 2, _scale * 2));
        pboxZoom.Image = _myImage.Clone(rc, PixelFormat.DontCare);
    }
    catch (OutOfMemoryException  ex) {/* ignore... */}
}

protected override void Dispose(bool disposing) {
    if (disposing && (components != null)) {
        components.Dispose();
    }
    base.Dispose(disposing);
}

private void InitializeComponent() {
    this.pboxMain = new PictureBox();
    this.pboxZoom = new PictureBox();
    ((System.ComponentModel.ISupportInitialize)(this.pboxMain)).BeginInit();
    ((System.ComponentModel.ISupportInitialize)(this.pboxZoom)).BeginInit();
    this.SuspendLayout();

    this.pboxMain.Dock = DockStyle.Fill;
    this.pboxMain.Location = new System.Drawing.Point(0, 0);
    this.pboxMain.Name = "pboxMain";
    this.pboxMain.Size = new System.Drawing.Size(767, 435);
    this.pboxMain.TabIndex = 0;
    this.pboxMain.TabStop = false;
    this.pboxMain.MouseMove += new MouseEventHandler(this.pboxMain_MouseMove);

    this.pboxZoom.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))),
  ((int)(((byte)(255)))), ((int)(((byte)(192)))));
    this.pboxZoom.BorderStyle = BorderStyle.FixedSingle;
    this.pboxZoom.Location = new System.Drawing.Point(12, 12);
    this.pboxZoom.Name = "pboxZoom";
    this.pboxZoom.Size = new System.Drawing.Size(106, 83);
    this.pboxZoom.SizeMode = PictureBoxSizeMode.StretchImage;
    this.pboxZoom.TabIndex = 1;
    this.pboxZoom.TabStop = false;

    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    this.AutoScaleMode = AutoScaleMode.Font;
    this.ClientSize = new System.Drawing.Size(767, 435);
    this.Controls.Add(this.pboxZoom);
    this.Controls.Add(this.pboxMain);
    this.Name = "Form1";
    this.Text = "Form1";
    this.Load += new System.EventHandler(this.Form1_Load);
    ((System.ComponentModel.ISupportInitialize)(this.pboxMain)).EndInit();
    ((System.ComponentModel.ISupportInitialize)(this.pboxZoom)).EndInit();
    this.ResumeLayout(false);
}
}
Paul Sasik
  • 79,492
  • 20
  • 149
  • 189
0

This should be of great help TeboScreen: Basic C# Screen Capture
Why reinvent the Wheel :-)

Moo-Juice
  • 38,257
  • 10
  • 78
  • 128
Mehdi LAMRANI
  • 11,289
  • 14
  • 88
  • 130