[英]Move a PictureBox with mouse
我正在為Windows Mobile開發一個應用程序(Compact Framework 2.0)。 它有一個帶有PictureBox的WinForms。
我想移動PictureBox的圖像,但我不知道該怎么做,所以我選擇移動孔PictureBox。
為此,我使用此事件:
private void imagenMapa_MouseMove(object sender, MouseEventArgs e)
{
imagenMapa.Left = e.X;
imagenMapa.Top = e.Y;
this.Refresh();
}
但是當我移動PictureBox時,它會閃爍並移動到每個地方。
我做錯了什么?
eX
和eY
相對於圖片框(例如,如果鼠標位於圖片框的左上角,則為0,0)。
imagenMapa.Left
和imagenMapa.Top
的值是相對於表單(或任何控件包含imagenMapa
)
如果你試圖在沒有轉換的情況下混合來自這兩個系統的值,你就會得到跳躍(就像你所看到的那樣)。
你可能最好將鼠標位置轉換為包含圖片框的東西所使用的相同坐標系。
您可以使用imagenMapa.PointToScreen
來獲取屏幕坐標中的鼠標坐標(或者Cursor.Position
直接獲取位置),並使用yourForm.PointToClient
將它們返回到窗體坐標中。
請注意,根據您的需要,您可以通過覆蓋/處理控件的Paint
事件並自己繪制圖像來完成“在控件內移動圖像”。 如果你這樣做,你可以將所有內容保存在圖片框坐標中,因為這些可能是你在調用graphicsObject.DrawImage
時使用的內容。
實際代碼(需要.NET Framework 3.5及更高版本,不確定它是否在Compact Framework中可用)...
// Global Variables
private int _xPos;
private int _yPos;
private bool _dragging;
// Register mouse events
pictureBox.MouseUp += (sender, args) =>
{
var c = sender as PictureBox;
if (null == c) return;
_dragging = false;
};
pictureBox.MouseDown += (sender, args) =>
{
if (args.Button != MouseButtons.Left) return;
_dragging = true;
_xPos = args.X;
_yPos = args.Y;
};
pictureBox.MouseMove += (sender, args) =>
{
var c = sender as PictureBox;
if (!_dragging || null == c) return;
c.Top = args.Y + c.Top - _yPos;
c.Left = args.X + c.Left - _xPos;
};
擁抱數學!
control.Left = control.Left - (_lastMousePos.X - currentMousePos.X);
control.Top = control.Top - (_lastMousePos.Y - currentMousePos.Y);
快速說明:您從鼠標位置獲得差異並將其應用於您想要移動的對象。
示例:如果舊鼠標X位置為382,而新鼠標位置為385,則差值為-3。 如果控制當前X位置是10然后10 - ( - 3)= 13
原因:它適用於任何事物,並且比不斷地來回轉換坐標要便宜得多。
eX&eY位於pictureBox的坐標空間中,imagenMapa.Left&imagenMapa.Top位於Form的坐標空間中。 :-)
另外不要忘記將表單設置為雙緩沖,這可能有助於閃爍,但對於它的實際定位,我喜歡Daniel的建議
實際上你所做的是正確的。 但是您將MouseMove屬性賦予了圖片框。 您應該將該屬性提供給表格(背景)。
例如:
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
imagenMapa.Left = e.X;
imagenMapa.Top = e.Y;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.