如何让PictureBox的MouseDown事件起作用?

时间:2017-06-02 03:59:33

标签: c# winforms

我有一个简单的2D地图编辑器,地图是PictureBoxes的网格。

        for (int row = 0; row < GlobalConstants.TileRows; row++)
        {
            for (int col = 0; col < GlobalConstants.TileCols; col++)
            {
                PictureBox pb = new PictureBox();
                pb.Size = size;
                Point loc = new Point(GlobalConstants.TileWidth * col, GlobalConstants.TileHeight * row);
                Rectangle srcRect = new Rectangle(loc, size); 
                pb.Location = loc; 
                pb.Tag = loc;
                pb.Name = String.Format("Col={0:00}-Row={1:00}", col, row);
                pb.MouseDown += pbMap_MouseDown;
                pb.MouseUp += pbMap_MouseUp; 
                pb.MouseEnter += pbMap_MouseEnter;
                pnlMap.Controls.Add(pb);
            }
        }

有三个鼠标事件:

MouseDown:按下PictureBox会使用所选项目填充图像。            m_mouseDown在此处设置为true。

MouseUp:m_mouseDown设置为false。

MouseEnter:当m_mouseDown为true时,使用当前选定的图块并更新图片框图像。

我遇到了MouseEnter的问题:

    private void pbMap_MouseEnter(object sender, EventArgs e)
    {
        if (m_mouseDown)
        {
            PictureBox pb;

            pb = (PictureBox)sender;

            if (m_pbSelected != null)
            {
                pb.Tag = m_pbSelected.Tag;
                pb.Name = m_pbSelected.Name;
                pb.Image = m_pbSelected.Image;
            }
        }
    }

当第一个PictureBox图像显示在MouseDown上时,我按住鼠标按钮并向下拖动鼠标。我的鼠标输入的图片框没有更新。它们只在单击时获得更新,但我希望它们在按下鼠标按钮时得到更新。

如果删除if(m_mouseDown)条件,PictureBox会将图像更新为所选图像。当然,我移动它时没有按下鼠标上的任何按钮。当我重新放入条件时,只有一个图片框在MouseDown事件上得到更新。

我的鼠标上/下码:

    /// <summary>
    /// Map panel's mouse down event
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void pbMap_MouseDown(object sender, EventArgs e)
    {
        m_mouseDown = true; 

        MouseEventArgs m = (MouseEventArgs)e;
        PictureBox pb;

        if (m.X >= (GlobalConstants.TileWidth * GlobalConstants.TileCols))
            return;

        if (m.Y >= (GlobalConstants.TileHeight * GlobalConstants.TileRows))
            return;

        pb = (PictureBox)sender;

        if (m_pbSelected != null)
        {
            pb.Tag = m_pbSelected.Tag;
            pb.Name = m_pbSelected.Name;
            pb.Image = m_pbSelected.Image;
        }
    }

    /// <summary>
    /// Map panel's mouse up event
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void pbMap_MouseUp(object sender, EventArgs e)
    {
        m_mouseDown = false;
    }

如果重要的是,图片框在面板控件内。该面板没有鼠标事件。

任何想法都表示赞赏。感谢。

1 个答案:

答案 0 :(得分:0)

您可以制作一个计时器,将图片位置更新为mouseDown上的光标位置,并在mouseUp上停止计时器。