1

我有一个程序可以拍摄一张图片(50px 上大约 50px),对图片做一些处理并上传它。目前,用户仍然需要截屏,打开画图,裁剪出所需的部分并将其复制粘贴到我的程序中。

我想通过让用户将某种十字准线拖动到屏幕上所需的点并释放它来使用户更容易/更快地做到这一点。然后我的程序对该区域进行小截图(已经知道如何操作)并使用该截图做一些事情。

问题是,我该怎么做?我怎样才能有一个可拖动的十字准线,用户可以将其拖动到表单外的某个点并释放它,以指定程序要使用的屏幕坐标?

4

2 回答 2

1

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

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

绘制到桌面非常简单:

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

要擦除您绘制的内容,您需要使用 Platform Invoke 为适当的位置调用 InvalidateRect。

于 2013-07-03T18:31:03.240 回答
0

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

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

}
于 2013-07-03T20:03:28.223 回答