Bild mit Raster

dlooney

Mitglied
Hi all,

ich würde gern ein Bild mit GDI+ zeichnen und auf diesem Bild ein Raster legen.
Hmm… wie kann ich das am besten beschreiben, ich will so eine art Schublade machen. Also ich habe 5 Fächer(was dann mein Raster währe), jetzt will ich da ein Bild noch drauf liegen haben und z.B. jetzt von Fach 1 in Fach 3 verschieben.
Wie kann ich so was am besten realisieren oder hat wer ein kleines Beispiel oder so in der art? :confused::confused:
Ich hoffe ich habe den Topic Namen richtig gewählt und auch in das richtige Forum gewählt habe ^^

Gruß
Dlooney
 
ok ich denke mal mein ak. Projekt funktioniert ähnlich wie du es beschrieben hast und ich saß jetzt ne Stunde dran das in einer kurzen Form darzustellen. Doch da hängen zu viele Klassen dran deshalb versuch ichs mal anders :D

Einfach:
Du könntest zum Beispiel das TableLayout Control verwenden, dann noch eine PictureBox auf dein Formular haun und über Left und Top Eigenschaft das Bild bewegen. Beim bewegen am besten den Parent vom TableLayout auslösen und beim loslassen über ein Fach/Panel dann Parent neu mit diesem Panel setzen.
Nachteil eine Zelle kann jeweilss nur ein Control halten

Komplizierter:
Du erstellst dir ein 2 dimensionales Array als Typ könntest du eine Liste verwenden (falls mehrere Bilder in einem Fach sein sollen).
Dann haust du eine PictureBox auf dein Formular und im KeyDown Ereignis schaust du nach in welchem Fach du gerade stehst:
PHP:
int fachSize=100;
StateEnum selectedStatus;
List<StateEnum>[,] meinArray=new List<StateEnum >[5,5];
Dictionary<StateEnum, Image> bilder=Dictionary<StateEnum, Image>(); hält Liste von Bilder zum angegebenen Status

void pic_keyDown(MouseEventArgs e)
{
            int fachX=(int)(e.X/fachSize);
            int fachY=(int)(e.Y/fachSize);

            selectedStatus=StateEnum.None; //repräsentiert das kein Bild ausgewählt

            if(fachX<5 && fachY<5)
            {
                      int count=meinArray[fachX][fachY].Count;
                      if(count>0)
                           selectedStatus=meinArray[fachX][fachY][count-1];
            }
}

void pic_keyUp(MouseEventArgs e)
{
            if(selectedStatus!=StateEnum.None)
            {
                int fachX=(int)(e.X/fachSize);
                int fachY=(int)(e.Y/fachSize);

                 meinArray[fachX][fachY].Add(selectedStatus);
                 selectedStatus=StateEnum.None;
            }
}

void pic_keyMove(MouseEventArgs e))
{
          if(selectedStatus!=StateEnum.None)
                pic.Invalidate();
}

void pic_Paint(PaintEventArgs e)
{
      //bisher gesetzte Fächer anzeigen
      for(int x=0; x<meinArray.GetLength();x++)
      {
           for(int y=0; y<meinArray[x].GetLength();y++)
           {
                  foreach(StateEnum status in meinArray[x][y])
                       e.Graphics.DrawImage(SystemBrushes.Window,new Point(x*fachSize,y*fachSize),bilder[status ]);
           }
      }

      //gerade bewegtes Bild anzeigen
      if(selectedStatus!=StateEnum.None)
         e.Graphics.DrawImage(SystemBrushes.Window,MausPosition,bilder[selectedStatus]);
}
Ist so ein Pseudo-, könnte funktionieren, Code ;)
Hoffe ist einigermaßen verständlichen, wollt schon längst im Bett liegen :rolleyes:

Spyke (www.iv-interactive.de)
 
Hi all,

ich hab ein Problem. Ich hab jetzt mir eine TableLayoutPanel erstellt das z.B. das die Anzahl der Rows 40 besitzt. So jede Row soll eine Pixel Höhe von 15 besitzen, jetzt ist das erste Problem die Rows wo ich nichts adde macht der aber nicht 15 Hoch sondern schiebt die zusammen was natürlich den Drop and Drag verhindert da ich in die nichts mehr reinschieben kann. Ich hab als Spontane Lösung einfach immer ein Label geaddet und dann taucht ein 2 Problem auf wenn ich jetzt etwas per Drop and Drag verschiebe schiebt er es mir zwar an die richtige Position aber danach ist kein Drop and Drag mehr möglich. Mein 3 Problem ist ich lass extra alles neu der TableLayoutPanel adden was wahrscheinlich nicht so toll ist hat da wer ein bessere Idee für?

Hier mal teile des Quellcodes

Variablen
Code:
private PictureBox pictureBox;
private TableLayoutPanel tableLayoutPanel;
private Int32[,] copy;
private Int32[,] org;

Einstellungen der TableLayoutPanel
Code:
tableLayoutPanel = new TableLayoutPanel();
tableLayoutPanel.RowCount = anzahl;
tableLayoutPanel.Size = new Size(15, 250);
tableLayoutPanel.Margin = new Padding(0, 0, 0, 0);
tableLayoutPanel.Padding = new Padding(0, 0, 0, 0);
tableLayoutPanel.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
tableLayoutPanel.ColumnCount = 1;
tableLayoutPanel.AllowDrop = true;
tableLayoutPanel.AutoScroll = true;
tableLayoutPanel.GrowStyle = TableLayoutPanelGrowStyle.FixedSize;
tableLayoutPanel.AllowDrop = true;
tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 15));
tableLayoutPanel.DragDrop += new DragEventHandler(this.tableLayoutPanel_DragDrop);
tableLayoutPanel.DragEnter += new DragEventHandler(this.tableLayoutPanel_DragEnter);

Die Events
Code:
 private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
    for (Int32 i = anzahl - 1; i > 0; i--)
    {
	if (copy[i, 0] == Convert.ToInt32(pictureBox.Name))
	{
	    copy[i, 0] = 0;
	    copy[i, 1] = 0;
	}
    }

    tableLayoutPanel.DoDragDrop(pictureBox, DragDropEffects.Move);
}

private void tableLayoutPanel_DragDrop(object sender, DragEventArgs e)
{
    TableLayoutPanelCellPosition cellpos = tableLayoutPanel.GetCellPosition(tableLayoutPanel.GetChildAtPoint(tableLayoutPanel.PointToClient(new Point(e.X, e.Y))));
    copy[cellpos.Row, 0] = Convert.ToInt32(pictureBox.Name);
    copy[cellpos.Row, 1] = Convert.ToInt32(pictureBox.Tag);
    repaintTable();

    tableLayoutPanel.Refresh();
}

private void tableLayoutPanel_DragEnter(object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Move;
}

repaintTable(); ist eine methode wo ich einfach den Int array von copy neu in die TableLayoutPanel adde

Gruß Dlooney

Ps. Ich verzweifel langsam an diesen Drag and Drop mit der table xD
 

Neue Beiträge

Zurück