1

画像(50pxで約50px)を取得し、画像を処理してアップロードするプログラムがあります。現時点では、ユーザーはまだスクリーンショットを撮り、ペイントを開き、目的の部分を切り取って、プログラムにコピー アンド ペーストする必要があります。

ユーザーがある種の十字線を画面上の目的のポイントにドラッグして離せるようにすることで、これをユーザーにとってより簡単/高速にしたいと考えています。次に、私のプログラムはその領域の小さなスクリーンショットを撮り (その方法は既に知っています)、そのスクリーンショットで何かを行います。

問題は、どうすればこれを行うことができるかということです。プログラムが使用する画面座標を指定するために、ユーザーがフォームの外側のポイントにドラッグして離すことができるドラッグ可能な十字線を作成するにはどうすればよいですか?

4

2 に答える 2

1

次のすべてを行う必要があります。

  1. MouseDown / MouseMove / MouseUp イベントを使用して、十字線がいつどこでドラッグされているかを追跡します
  2. マウスがフォームを離れた後も引き続き MouseMove イベントを受信できるように、十字線がドラッグされている間はコントロールの Capture プロパティを True に設定します。
  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

これは、ユーザーが 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;
            }    
        }
    }

}
于 2013-07-03T20:03:28.223 に答える