让用户在屏幕上指定一个点

时间:2013-07-03 18:17:49

标签: c# drag-and-drop screenshot

我有一个拍摄图像的程序(50px大约50px),对图像执行某些操作并上传它。目前,用户仍然需要截取屏幕截图,打开画颜,裁剪出所需的部分并将其复制到我的程序中。

我希望让用户将某种十字准线拖动到屏幕上的所需位置并释放它,从而使用户更容易/更快。然后,我的程序会截取该区域的一个小屏幕截图(已经知道该怎么做)并使用该屏幕截图执行操作。

问题是,我该怎么做? 如何设置可拖动的十字准线,用户可以将其拖到窗体外的某个位置并将其释放,以指定要使用的程序的屏幕坐标?

2 个答案:

答案 0 :(得分:1)

您需要执行以下所有操作:

  1. 使用MouseDown / MouseMove / MouseUp事件跟踪拖动十字准线的时间和位置
  2. 在拖动十字准线时将控件的Capture属性设置为True,以便在鼠标离开表单后继续接收MouseMove事件
  3. 通过获取相应的窗口句柄并直接为其创建图形对象,将十字准线直接绘制到桌面窗口(并使桌面窗口无效以将其擦除)。桌面窗口句柄始终为0.
  4. 绘制到桌面非常简单:

    using (var g = Graphics.FromHwnd(IntPtr.Zero))
    {
        g.DrawLine(SystemPens.WindowText, 0, 0, 200, 200);
    }
    

    要删除您绘制的内容,您需要使用平台调用来调用InvalidateRect以获取适当的位置。

答案 1 :(得分:0)

这是一个快速而又脏的例子,允许用户左键单击并拖动PictureBox并获取光标下方的图像。但是,当用户快速移动时,它不能很好地更新:

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
        pictureBox1.Cursor = Cursors.Cross;
    }

    private Bitmap bmp = null;
    private Graphics G = null;

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            if (bmp == null)
            {
                bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
                G = Graphics.FromImage(bmp);
            }
        }
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            if (bmp != null && G != null)
            {
                Rectangle rc = new Rectangle(Cursor.Position, new Size(1, 1));
                rc.Inflate(pictureBox1.Width / 2, pictureBox1.Height / 2);
                G.CopyFromScreen(rc.Location, new Point(0, 0), rc.Size);
                pictureBox1.Image = bmp;
            }    
        }
    }

}