2010-12-01 36 views
5

J'ai une application Winforms que l'utilisateur utilise pour prendre une capture d'écran basée sur la région. Je veux avoir un petit volet de prévisualisation, mais je ne suis pas sûr de savoir comment le faire. Jusqu'à présent, j'ai essayé de recréer un bitmap sur le mouvement de la souris et c'est juste trop laggy pour être utilisable. J'ai donc pensé que si j'utilisais une image prédéfinie (capture d'écran de tout l'écran) et que je la déplaçais à l'intérieur de la zone d'image à partir de l'emplacement de la souris pour obtenir un zoom sur l'écran (pour sélectionner les pixels précis la capture d'écran avec plus facile). Je ne suis pas sûr de la façon dont je peux mettre en œuvre cela, je suis aussi assez nouveau pour dessiner, donc je vais vous montrer ce que j'ai maintenant.Comment dessiner une capture d'écran "aperçu" fenêtre?

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:

Voici une maquette comme demandé:

La partie noire de cette image est un panneau, bien sûr, le texte étant une étiquette et la zone où vous voyez l'image (stack overflow) serait la zone d'image (appelée zoomBox) les lignes sur le zoomBox seraient un guide et où les 2 lignes se croisent seraient la position de la souris. J'espère que c'est une meilleure aide pour vous aider à comprendre mon problème.

alt text

Une autre chose qui pourrait aider à expliquer mon problème est la forme remplit effectivement tout l'écran avec un « faux bureau ». C'est une image qui couvre l'ensemble de l'écran avec une capture d'écran du bureau lorsque "printscreen" a été pressé. Donc, je veux que ce petit "panneau de prévisualisation" soit essentiellement un emplacement zoomé de l'endroit où se trouve la souris.

+0

sons Votre problème intéressant, mais il est difficile de comprendre votre intention de l'extrait de code. La meilleure façon de procéder pourrait être de créer une maquette avec MS Paint pour montrer ce que vous cherchez, IMO. (Vous aurez besoin de télécharger et de lier à la photo maquette ...) –

+0

@Paul: J'ai ajouté plus de détails et une image maquette pour vous. – Alex

+0

J'ai ajouté un exemple de code complet qui pourrait vous aider. C'est codé en dur et un peu hack-ish mais pourrait vous être utile. –

Répondre

2

Ceci est un peu laggy, mais la peine d'essayer:

Il est une application WinForms dans un seul fichier montrant comment un zoom "en direct" pourrait fonctionner. Il ne peint pas les réticules, etc. C'est à vous de décider.

Pièces clés:

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