/ Aide sur les formulaires dynamiques / C # - c #, formulaires, dynamique, onclick

Aide sur les formulaires dynamiques C # - c #, formulaires, dynamique, onclick

J'essaie de créer quelque chose d'un éditeur Tile-Map en C # en utilisant des boîtes à images (la façon la plus simple de penser de jeter des tuiles dans un formulaire)

Le code qui génère les boîtes à images est:

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");
}

Cette partie fonctionne, tant que j'utilise un petit nombre de blocs d'image à la fois (8 par 8 semble être le maximum qu'il souhaite afficher dans un laps de temps décent)

Je veux effectuer une action lorsque l'utilisateurclique sur une boîte à images spécifiée, ce qui explique pourquoi j’ai une méthode onclick, c’est "où je rencontre des problèmes, toutes les boîtes à images sont appelées ... images-boîte. Pour autant que je sache, il y a" s aucun moyen pour moi de dire à quelle boîte à photos l'utilisateur a cliqué.

Je vais probablement avoir besoin de refaire la façon dont lela forme dynamique fonctionne de toute façon, car je ne peux pas obtenir beaucoup de boîtes à images, mais je pense que le problème principal sera toujours là, aussi longtemps que je veux qu'elle soit dynamique (ce que je fais), toutes les cartes de tuiles ne seront pas les même taille.

Je n’ai jamais rien fait de pareil et j’aicherchais des moyens de remplacer l’événement onclick ... que je ne pouvais pas trouver, et je ne pouvais pas "trouver un bon moteur de tuiles qui soit à jour pour être utilisé (sauf pour XNA, mais" un peu plus haut pour un simple éditeur de tuiles, je pense)

Je vais probablement aller dans la direction opposée à ce que je dois faire.

Réponses:

3 pour la réponse № 1

L'expéditeur dans votre gestionnaire d'événements sera le PictureBox qui a été cliqué.

    void TileBox_Clicked(object sender, EventArgs e)
{
PictureBox pictureBox = sender as PictureBox;
if(pictureBox != null)
{
//do stuff with your pictureBox
}
}

1 pour la réponse № 2

"Ne pouvez-vous pas simplement convertir l'objet émetteur en un objet PictureBox dans votre gestionnaire d'événements et l'utiliser avec?


0 pour la réponse № 3

Le premier paramètre de votre gestionnaire d'événements est le contrôle sur lequel vous avez cliqué (qui sera le PictureBox.

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

// ...
}

0 pour la réponse № 4

J'ai adopté cette approche avec un éditeur de tuiles de carteainsi que. Comme d'autres l'ont déjà dit, vous pouvez utiliser le paramètre sender et le convertir en un PictureBox pour obtenir l'objet PictureBox sur lequel vous avez cliqué. Mais je pense que vous constaterez (vous l’avez probablement déjà fait) qu’une taille de carte décente ralentira vraiment les choses.

Vous pourriez reconsidérer XNA. Cela semble compliqué et il n’est pas aussi facile d’obtenir quelque chose qui fonctionne, mais de générer un tas d’objets PictureBox. Mais c’est rapide, et vous pouvez obtenir une carte 2D affichée assez rapidement. Vous pouvez également l’agrandir. plus facile, par exemple si vous souhaitez que votre carte ait différentes couches modifiables (terrain, etc.).


0 pour la réponse № 5

Il y a en fait beaucoup de manières de faire ceci. Je pense que le plus simple est d'utiliser le sender de votre gestionnaire d'événement, ce qui vous ramènera au bouton cliqué:

private void PictureBox_Click(object sender, EventArgs e)
{
var box = sender as PictureBox;
if (box != null)
{
//...

Vous pouvez également créer et ajouter des gestionnaires d'événements de manière dynamique, ce qui est une option intéressante:

        //...
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); }
);

Dans le code ci-dessus, doStuff obtient pictureBox en tant que paramètre, il sait donc sur quel objet il est censé travailler.