Справка по динамической форме C # - PullRequest
1 голос
/ 07 февраля 2011

Я пытаюсь сделать что-то из редактора Tile-Map в C #, используя графические блоки (самый простой способ, которым я могу подумать, чтобы бросать плитки в форму)

Код, который генерирует графические блоки::

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, здесь я сталкиваюсь с проблемами, все графические блоки называются ... picture-коробка.Насколько я могу судить, я никак не могу сказать, на какую графическую рамку щелкнул пользователь.

Мне, вероятно, придется в любом случае переделать способ работы динамической формы, поскольку я не могу получить очень много графических блоков, но я думаю, что основная проблема все еще будет существовать, пока я хочу, чтобы она была динамичной (что я и делаю), не все карты тайлов будут одинакового размера.

Я никогда ничего не делалвот так, и я искал способы переопределить событие onclick ... которое я не смог найти, и я не смог найти хороший движок плиток, который был бы актуален (за исключением XNA, но этоя думаю, что это немного по-простому для простого редактора тайлов)

Я, скорее всего, иду в противоположном направлении, чем то, что мне нужно делать.

Ответы [ 5 ]

3 голосов
/ 07 февраля 2011

Отправителем в вашем обработчике событий будет PictureBox, по которому щелкнули.

    void TileBox_Clicked(object sender, EventArgs e)
    {
        PictureBox pictureBox = sender as PictureBox;
        if(pictureBox != null)
        {
            //do stuff with your pictureBox
        }
    }
1 голос
/ 07 февраля 2011

Разве вы не можете просто привести объект-отправитель к PictureBox в вашем обработчике событий и работать с этим?

0 голосов
/ 07 февраля 2011

Есть много способов сделать это.Я думаю, что проще всего использовать 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 в качестве параметра, поэтому он знает, над каким объектом он должен работать.

0 голосов
/ 07 февраля 2011

Я применил этот подход и с редактором плиток карты. Как уже говорили другие, вы можете использовать параметр sender и привести его к PictureBox, чтобы получить объект PictureBox, по которому щелкнули. Но я думаю, вы обнаружите (вы, вероятно, уже), что приличный размер карты действительно замедлит процесс.

Вы можете пересмотреть XNA. Это кажется сложным, и не так легко заставить что-то работать, как просто сгенерировать кучу объектов PictureBox. Но это быстро, и вы можете довольно быстро отобразить 2D-карту. Вы также можете расширить его, например, если вы хотите, чтобы ваша карта имела разные редактируемые слои (ландшафт и т. Д.).

0 голосов
/ 07 февраля 2011

Первый параметр в вашем обработчике событий - это элемент управления, по которому щелкают (которым будет PictureBox.

private void pictureBox1_Click(object sender, System.EventArgs e)
{
   PictureBox pb = (PictureBox)sender;

   // ...
}
...