2010-12-01 11 views
5

Tengo una aplicación de Winforms que el usuario usa para tomar una captura de pantalla basada en la región. Quiero tener un pequeño panel de vista previa, pero no estoy seguro de cómo hacerlo. Hasta ahora intenté volver a crear un mapa de bits en el movimiento del mouse y es demasiado lento para poder usarlo. Así que pensé que si usé una imagen predefinida (captura de pantalla de toda la pantalla) y la moví dentro de la caja de imágenes en función de la ubicación del mouse para que pueda obtener una vista ampliada de la pantalla (para seleccionar los píxeles precisos que desea tomar) la captura de pantalla con más fácil). No estoy seguro de cómo puedo implementar esto, también soy bastante nuevo para dibujar, así que te mostraré lo que tengo ahora.Cómo dibujar una ventana de "vista previa" de captura de pantalla?

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:

Aquí es una maqueta como solicitó:

La parte en negro de esta imagen es un panel, por supuesto que se encuentre una etiqueta y la zona donde se ve la imagen (desbordamiento de pila) sería la caja de imágenes (llamada zoomBox), las líneas en la parte superior de la cámara de zoom serían una guía y donde las 2 líneas se cruzan sería la posición del mouse. Espero que esta sea una mejor ayuda para ayudarlo a comprender mi problema.

alt text

Otra cosa que podría ayudar a explicar mi problema es la forma en realidad llena toda la pantalla con una "falsa escritorio". es una caja de imágenes que cubre toda la pantalla con una captura de pantalla del escritorio cuando se presionó "pantalla de impresión". Así que quiero que este pequeño "panel de vista previa" sea básicamente una ubicación ampliada donde está el mouse.

+0

Su problema parece interesante pero es difícil de averiguar sus intenciones desde el fragmento de código. La mejor manera de proceder es crear una maqueta con MS Paint para mostrar lo que está buscando, IMO. (Tendrás que subir y vincular a la imagen de la maqueta ...) –

+0

@Paul: He añadido más detalles y una imagen simulada para ti. – Alex

+0

Agregué un ejemplo de código completo que podría ayudarlo. Es difícil de codificar y un poco hack-ish, pero puede ser útil para usted. –

Respuesta

2

Esto es un poco perezoso, pero vale la pena intentarlo:

Es una aplicación de Windows Forms en un solo archivo que muestra cómo un zoom "en vivo" podría funcionar. No pinta la cruz, etc., eso depende de usted.

piezas clave:

  • _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); 
} 
} 
Cuestiones relacionadas