我有一个简单的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;
}
如果重要的是,图片框在面板控件内。该面板没有鼠标事件。
任何想法都表示赞赏。感谢。
答案 0 :(得分:0)
您可以制作一个计时器,将图片位置更新为mouseDown上的光标位置,并在mouseUp上停止计时器。