2013-07-03 53 views
1

我有一個程序需要一個圖像(在50px上大約50px),對圖像進行一些操作並上傳它。目前用戶仍然需要截圖,打開油漆,挖出所需的部分,並將其複製到我的程序中。讓用戶在屏幕上指定一個點

我想通過讓他拖動某種十字準線到屏幕上的所需點並釋放它,讓用戶更容易/更快速。然後我的程序會截取該區域的一張小截圖(已經知道如何做到這一點),並在截圖中執行某些操作。

問題是,我該怎麼做? 我怎樣纔能有一個可拖動的十字線,用戶可以拖動到表單之外的一個點並釋放它,以指定程序使用的屏幕座標?

+1

這是用於WinForms還是WPF? – RogerN

+0

winforms,但如果真的有必要,我可以切換到wpf。 – user886079

+1

我在評論中寫道,因爲這不是你期待的答案,而只是一個替代方案的建議。爲什麼你沒有一個控件可以有任何大小的圖像,但是有一個50px x 50px的視口呢?然後用戶可以拖動視口。您可以截取視口中的任何內容。我認爲這比獲得顯示器整體上顯示的內容要容易得多。 – Renan

回答

1

你需要做以下幾點:

  1. 使用的MouseDown/MouseMove事件/事件的MouseUp跟蹤何時何十字線被拖動
  2. 設置控件的捕獲性質當拖動十字準線以便您在鼠標離開您的表格後繼續接收MouseMove事件
  3. 通過獲取適當的窗口句柄,將十字準線直接繪製到桌面窗口(並使桌面窗口無效)直接爲它創建一個圖形對象。桌面窗口句柄始終爲0

繪製到桌面是很容易的:

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

要清除你畫什麼,你都需要使用平臺調用來調用InvalidateRect的適當位置。

+0

它工作。以及鼠標下移,上移和捕捉的部分。我能夠在屏幕上畫畫並擦除它,但一切都開始閃爍,而且看起來並不像我想要的那樣。我現在剛剛離開了...... – user886079

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

} 
相關問題