我有一個程序需要一個圖像(在50px上大約50px),對圖像進行一些操作並上傳它。目前用戶仍然需要截圖,打開油漆,挖出所需的部分,並將其複製到我的程序中。讓用戶在屏幕上指定一個點
我想通過讓他拖動某種十字準線到屏幕上的所需點並釋放它,讓用戶更容易/更快速。然後我的程序會截取該區域的一張小截圖(已經知道如何做到這一點),並在截圖中執行某些操作。
問題是,我該怎麼做? 我怎樣纔能有一個可拖動的十字線,用戶可以拖動到表單之外的一個點並釋放它,以指定程序使用的屏幕座標?
我有一個程序需要一個圖像(在50px上大約50px),對圖像進行一些操作並上傳它。目前用戶仍然需要截圖,打開油漆,挖出所需的部分,並將其複製到我的程序中。讓用戶在屏幕上指定一個點
我想通過讓他拖動某種十字準線到屏幕上的所需點並釋放它,讓用戶更容易/更快速。然後我的程序會截取該區域的一張小截圖(已經知道如何做到這一點),並在截圖中執行某些操作。
問題是,我該怎麼做? 我怎樣纔能有一個可拖動的十字線,用戶可以拖動到表單之外的一個點並釋放它,以指定程序使用的屏幕座標?
你需要做以下幾點:
繪製到桌面是很容易的:
using (var g = Graphics.FromHwnd(IntPtr.Zero))
{
g.DrawLine(SystemPens.WindowText, 0, 0, 200, 200);
}
要清除你畫什麼,你都需要使用平臺調用來調用InvalidateRect的適當位置。
它工作。以及鼠標下移,上移和捕捉的部分。我能夠在屏幕上畫畫並擦除它,但一切都開始閃爍,而且看起來並不像我想要的那樣。我現在剛剛離開了...... – user886079
下面是一個快速而骯髒的示例,允許用戶左鍵單擊並拖動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;
}
}
}
}
這是用於WinForms還是WPF? – RogerN
winforms,但如果真的有必要,我可以切換到wpf。 – user886079
我在評論中寫道,因爲這不是你期待的答案,而只是一個替代方案的建議。爲什麼你沒有一個控件可以有任何大小的圖像,但是有一個50px x 50px的視口呢?然後用戶可以拖動視口。您可以截取視口中的任何內容。我認爲這比獲得顯示器整體上顯示的內容要容易得多。 – Renan