我正在尝试使用图片框在C#中创建一个Tile-Map编辑器(我认为最简单的方法是将图块投入到表单中)
生成图片框的代码是:
public void Generate_Tiles(int width, int height)
{
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
System.Windows.Forms.PictureBox picturebox = new PictureBox();
picturebox.BackColor = SystemColors.ActiveCaption;
picturebox.Cursor = Cursors.Cross;
picturebox.Location = new System.Drawing.Point((x*32) + 4, (y*32) + 4);
picturebox.Name = x+y+"tile";
picturebox.Size = new System.Drawing.Size(32, 32);
picturebox.TabIndex = 0;
picturebox.TabStop = false;
picturebox.Click += new System.EventHandler(TileBox_Clicked));
map.Controls.Add(picturebox);
}
}
MessageBox.Show("Done");
}
该部分有效,只要我一次使用少量图片框(8×8似乎是它想要在相当长的时间内显示的最大值)
我想在用户点击指定的图片框时执行一些操作,这就是为什么我有一个onclick方法,这就是我遇到问题的地方,所有的图片框都被称为...图片框。据我所知,我无法分辨用户点击的图片框。
我可能需要重新制作动态表单的工作方式,因为我无法获得很多图片框,但我认为主要问题仍然存在,只要我希望它是动态的(我做的) ),并非所有的瓷砖地图都是相同的尺寸。
我从来没有做过这样的事情,我已经找到了覆盖onclick事件的方法......这是我找不到的,而且我找不到一个最新的好用的瓷砖引擎(除了XNA,但对于一个简单的拼贴编辑器来说,这有点超过顶部,我认为)
我可能会朝着与我需要做的相反的方向前进。
答案 0 :(得分:3)
您的事件处理程序中的发件人将是被点击的PictureBox
。
void TileBox_Clicked(object sender, EventArgs e)
{
PictureBox pictureBox = sender as PictureBox;
if(pictureBox != null)
{
//do stuff with your pictureBox
}
}
答案 1 :(得分:1)
您是否只能将发件人对象转换为事件处理程序中的PictureBox,并使用它?
答案 2 :(得分:0)
事件处理程序中的第一个参数是单击的控件(将是PictureBox。
private void pictureBox1_Click(object sender, System.EventArgs e)
{
PictureBox pb = (PictureBox)sender;
// ...
}
答案 3 :(得分:0)
我也使用了地图图块编辑器。正如其他人所说,您可以使用sender参数并将其强制转换为PictureBox以获取被单击的PictureBox对象。但是我认为你会发现(你可能已经拥有)一个体面的地图尺寸会让事情变慢。
您可能会重新考虑XNA。它似乎很复杂,并且只是生成一堆PictureBox对象并不容易。但它很快,你可以很快地显示2D地图。您还可以更轻松地扩展它,例如,如果您希望地图具有不同的可编辑图层(地形等)。
答案 4 :(得分:0)
实际上有很多方法可以做到这一点。我认为最简单的方法是使用事件处理程序的sender
,它会将您返回到单击的按钮:
private void PictureBox_Click(object sender, EventArgs e)
{
var box = sender as PictureBox;
if (box != null)
{
//...
您还可以动态创建和添加事件处理程序,这是一个有趣的选项:
//...
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
System.Windows.Forms.PictureBox picturebox = new PictureBox();
pictureBox.Click += new Action<object, EventArgs>(
(sender, e) => { doStuff(pictureBox); }
);
在上面的代码中,doStuff
获取pictureBox
作为参数,因此它知道它应该在哪个对象上工作。