2010-12-01 14 views
5

मेरे पास एक विनफॉर्म एप्लिकेशन है जो उपयोगकर्ता क्षेत्र आधारित स्क्रीनशॉट लेने के लिए उपयोग करता है। मैं एक छोटा सा पूर्वावलोकन फलक चाहता हूं, लेकिन मुझे यकीन नहीं है कि यह कैसे करें। अब तक मैंने माउस चाल पर बिटमैप को दोबारा बनाने की कोशिश की है और इसका एकमात्र रास्ता उपयोग करने योग्य है। तो मैंने सोचा कि अगर मैंने प्री-डिफ़ाइंड छवि (पूरी स्क्रीन का स्क्रीनशॉट) इस्तेमाल किया है और इसे माउस स्थान के आधार पर पिक्चरबॉक्स के अंदर ले जाया है ताकि आप स्क्रीन को देखने में ज़ूम कर सकें (सटीक पिक्सेल का चयन करने के लिए जो आप लेना चाहते हैं आसान के साथ स्क्रीनशॉट)। मुझे यकीन नहीं है कि मैं इसे कैसे कार्यान्वित कर सकता हूं, मैं ड्राइंग के लिए भी बहुत नया हूं इसलिए मैं आपको दिखाऊंगा कि अब मेरे पास क्या है।स्क्रीनशॉट "पूर्वावलोकन" विंडो कैसे आकर्षित करें?

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; 
    } 

संपादित करें:

यहाँ एक नकली अप की तरह है अनुरोध किया:

इस छवि का काला भाग एक पैनल, बेशक पाठ एक लेबल और क्षेत्र है जहां आप छवि देख जा रहा है (स्टैक ओवरफ़्लो) ज़ूमबॉक्स के शीर्ष पर स्थित लाइनबॉक्स (ज़ूमबॉक्स कहा जाता है) होगा एक गाइड होगी और जहां 2 लाइनों का अंतर होता है तो माउस की स्थिति होगी। आशा है कि यह मेरी समस्या को समझने में आपकी सहायता करने के लिए एक बेहतर सहायता है।

alt text

एक और बात जो कि मेरी समस्या समझाने मदद कर सकता है प्रपत्र वास्तव में एक "झूठे डेस्कटॉप" के साथ पूरे स्क्रीन भरता है। यह एक पिक्चरबॉक्स है जो "प्रिंटरस्क्रीन" दबाए जाने पर डेस्कटॉप के स्क्रीनशॉट के साथ पूरी स्क्रीन को कवर करता है। इसलिए मैं मूल रूप से माउस के स्थान पर ज़ूम किया जाना चाहता हूं, यह छोटा "पूर्वावलोकन फलक" चाहता हूं।

+0

आपकी समस्या दिलचस्प लगता है, लेकिन यह कोड स्निपेट से अपने इरादे समझ पाना कठिन है। आगे बढ़ने का सबसे अच्छा तरीका एमएस पेंट के साथ नकली-अप बनाना है ताकि आप यह दिखा सकें कि आप क्या कर रहे हैं, आईएमओ। (आपको मॉक-अप तस्वीर को अपलोड और लिंक करने की आवश्यकता होगी ...) –

+0

@ पॉल: मैंने आपके लिए अधिक जानकारी और एक नकली छवि जोड़ा है। – Alex

+0

मैंने एक पूरा कोड नमूना जोड़ा जो आपकी मदद कर सकता है। यह कठिन कोडित है और थोड़ा हैक-आश है लेकिन आपके लिए उपयोगी हो सकता है। –

उत्तर

2

यह एक छोटा सा laggy है, लेकिन लायक एक कोशिश एक नए अंदाज़ में:

यह एक एकल फाइल में एक WinForms अनुप्रयोग दिखा तरीका बताया गया है एक "लाइव" ज़ूम काम कर सकता है। यह क्रॉस हेयर इत्यादि को पेंट नहीं करता है जो आपके ऊपर है।

कुंजी हिस्से:

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

यह बहुत मदद की होनी चाहिए TeboScreen: Basic C# Screen Capture
क्यों व्हील :-)

+0

मुझे पहले से ही प्रोग्राम किया गया है, और यह वास्तव में बहुत अच्छी तरह से काम करता है :) – Alex

संबंधित मुद्दे