簡體   English   中英

使用鼠標事件在圖片框內移動圖像

[英]Move Image inside the Picturebox using mouse events

我有這個代碼,我在一個圖片框中上傳/放置一個圖像。 我現在想要做的是使用 MouseEvents 將它拖到圖片框內。 當使用另一個類繪制我的圖像時,我該怎么做?

圖像類

public void ImageDrawing(Bitmap bm, RectangleF rect, PaintEventArgs e)
    {
        this.image = bm;
        this.width = rect.Width;
        this.height = rect.Height;
        this.rect = rect;
        Graphics g = e.Graphics;
        bm = ImageClass.GrayscaleImage(bm);
        bm.MakeTransparent(Color.White);
        g.DrawImage(bm, rect);
    }

主窗體

private void btn_Browse_Click(object sender, EventArgs e)
    {
        PaintImage();
    }
    public void PaintImage()
    {
        buttons = (Shape.ShapeType)System.Enum.Parse(typeof(Shape.ShapeType), "image");
        // open file dialog   
        OpenFileDialog open = new OpenFileDialog();
        // image filters  
        open.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp); *.PNG|*.jpg; *.jpeg; *.gif; *.bmp; *.PNG";
        if (open.ShowDialog() == DialogResult.OK)
        {
            //Display image in picture box  
            string strType = Path.GetExtension(open.FileName);
            FileInfo fs = new FileInfo(open.FileName);
            long fileSize = fs.Length / 1024;
            ImageBitmap = new Bitmap(open.FileName);
        }
        imageHeight = ImageBitmap.Height / 3f;
        imageWidth = ImageBitmap.Width / 3f;
        imageX = (shape.center.X - (imageWidth / 2));
        imageY = (shape.center.Y - (imageHeight / 2));
        imageRect = new RectangleF(imageX, imageY, imageWidth, imageHeight);
        pictureBox_Canvass.Refresh();
    }

我已經使用 TaW 的代碼作為參考,通過鼠標拖動實現了在圖片框內移動圖像。 請參閱圖片框鼠標和繪畫的事件。


// Global Variables
private int _xPos;
private int _yPos;
private bool _dragging;
Image _img;
Rectangle _imgRect;

private void pictureBox1_MouseUp(
  object sender, MouseEventArgs e) {
  var c = sender as PictureBox;
  if (null == c) return;
  _dragging = false;
}

private void pictureBox1_MouseDown(
  object sender, MouseEventArgs e) {
  if (e.Button != MouseButtons.Left) return;
  _dragging = true;
  _xPos = e.X;
  _yPos = e.Y;
}

private void pictureBox1_MouseMove(
  object sender, MouseEventArgs e) {
  if (!_dragging || _img == null ) return;

  if (e.Button == MouseButtons.Left) {
    _imgRect = new Rectangle(-(_xPos-e.X), -(_yPos - e.Y), _img.Width, _img.Height);     
    pictureBox1.Invalidate();
  }
}

private void pictureBox1_Paint(
object sender, PaintEventArgs e) {      
  if (_img != null) {
    e.Graphics.DrawImage(_img, _imgRect);
  }    
}

使用MouseMove事件和Mousebutton檢查來確定目標矩形的頂部/左側。 (或者也許是中心?)

然后通過調用pBox.Invalidate()觸發Paint事件!

例子:

在此處輸入圖片說明

ImageClass anImage = null;

private void pb_canvas_Paint(object sender, PaintEventArgs e)
{
    anImage.ImageDrawing(anImage.image, anImage.rectangle, e);
}

private void pb_canvas_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button.HasFlag(MouseButtons.Left))
    {
        anImage.rectangle = new Rectangle(e.X, e.Y, anImage.image.Width, anImage.image.Height );
        pb_canvas.Invalidate();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM