2016-10-17 31 views
0

我正在尝试修改这个C#应用程序。 代码来源于: http://www.codeproject.com/Articles/485883/Create-your-own-Snipping-Tool无法使用C#截图使用#

当我运行它执行罚款的代码,你看这应该让你标记要采取的截图屏幕的一个扇区标记,但我不能标记屏幕的任何部分。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.IO; 
using System.Drawing.Imaging; 
using System.Drawing.Drawing2D; 

namespace copy 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      //Hide the Form 
      this.Hide(); 
      //Create the Bitmap 
      Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 
            Screen.PrimaryScreen.Bounds.Height); 
      //Create the Graphic Variable with screen Dimensions 
      Graphics graphics = Graphics.FromImage(printscreen as Image); 
      //Copy Image from the screen 
      graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size); 
      //Create a temporal memory stream for the image 
      using (MemoryStream s = new MemoryStream()) 
      { 
       //save graphic variable into memory 
       printscreen.Save(s, ImageFormat.Bmp); 
       pictureBox1.Size = new System.Drawing.Size(this.Width, this.Height); 
       //set the picture box with temporary stream 
       pictureBox1.Image = Image.FromStream(s); 
      } 
      //Show Form 
      this.Show(); 
      //Cross Cursor 
      Cursor = Cursors.Cross; 

     } 
      //These variables control the mouse position 
int selectX; 
int selectY; 
int selectWidth; 
int selectHeight; 
public Pen selectPen;   

//This variable control when you start the right click 
bool start = false; 



     private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    //validate if there is an image 
    if (pictureBox1.Image == null) 
     return;    
    //validate if right-click was trigger 
    if(start) 
    { 
     //refresh picture box 
     pictureBox1.Refresh(); 
     //set corner square to mouse coordinates 
     selectWidth = e.X - selectX; 
     selectHeight = e.Y - selectY; 
     //draw dotted rectangle 
     pictureBox1.CreateGraphics().DrawRectangle(selectPen, 
        selectX, selectY, selectWidth, selectHeight); 
    } 
} 


    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    //validate when user right-click 
    if (!start) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      //starts coordinates for rectangle 
      selectX = e.X; 
      selectY = e.Y; 
      selectPen = new Pen(Color.Red, 1); 
      selectPen.DashStyle = DashStyle.DashDotDot; 
     } 
     //refresh picture box 
     pictureBox1.Refresh(); 
     //start control variable for draw rectangle 
     start = true; 
    } 
    else 
    { 
     //validate if there is image 
     if (pictureBox1.Image == null) 
      return; 
     //same functionality when mouse is over 
     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      pictureBox1.Refresh(); 
      selectWidth = e.X - selectX; 
      selectHeight = e.Y - selectY; 
      pictureBox1.CreateGraphics().DrawRectangle(selectPen, selectX, 
        selectY, selectWidth, selectHeight); 

     } 
     start = false; 
     //function save image to clipboard 
     SaveToClipboard();    
    } 
} 

private void SaveToClipboard() 
{ 
    //validate if something selected 
    if (selectWidth > 0) 
    { 

     Rectangle rect = new Rectangle(selectX, selectY, selectWidth, selectHeight); 
     //create bitmap with original dimensions 
     Bitmap OriginalImage = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height); 
     //create bitmap with selected dimensions 
     Bitmap _img = new Bitmap(selectWidth, selectHeight); 
     //create graphic variable 
     Graphics g = Graphics.FromImage(_img); 
     //set graphic attributes 
     g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
     g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; 
     g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
     g.DrawImage(OriginalImage, 0, 0, rect, GraphicsUnit.Pixel);     
     //insert image stream into clipboard 
     Clipboard.SetImage(_img); 
    } 
    //End application 
    Application.Exit(); 
} 

    } 
} 
+1

虽然评论说,右边的按钮的代码检查左键。这可能是问题吗? – Dawnkeeper

回答

1

由于comments on the linked page已经建议你必须让你创建的事件处理程序:

public Form1() 
{ 
    InitializeComponent(); 
    pictureBox1.MouseDown += new MouseEventHandler(pictureBox1_MouseDown); 
    pictureBox1.MouseMove += new MouseEventHandler(pictureBox1_MouseMove); 
} 
+0

这解决了这个问题,谢谢!不是它抱怨ArgumentNullException是未处理的。在:pictureBox1.CreateGraphics()。DrawRectangle(selectPen, selectX,selectY,selectWidth,selectHeight) – TheLunchingCoder

+0

如果答案帮助你,它将很高兴通过勾选旁边的复选标记来接受它。 ArgumentNullException很可能是由'selectPen'为空造成的。见[这里](https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it?noredirect=1&lq=1) – Dawnkeeper

+0

完成我的朋友!是的,这确实是SelectPen。我以为“公共笔选择笔”;自Pen = System.Drawing.Pen以来就足够了吗?嗯...... – TheLunchingCoder