Fragensteller
Zeichnen C#

Allgemeine Diskussion
-
Ich habe mir mit dem Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Graphics g;
Byte[,] array = new Byte[60, 50];
Bitmap Spielfeld = new Bitmap(600, 500);
private void Form1_Load(object sender, EventArgs e)
{
g = Graphics.FromImage(Spielfeld);
for (int x = 0; x < 60; x++)
{
for (int y = 0; y < 50; y++)
{
array[x, y] = 0;
}
}
}
private void button1_Click(object sender, EventArgs e)
{
for (int x = 0; x < 60; x++)
{
for (int y = 0; y < 50; y++)
{
if (array[x, y] == 0)
{
g.DrawRectangle(new Pen(Color.LightGray), x* 15, y*15, 15 ,15);
}
}
}
for (int x = 0; x < 60; x++)
{
for (int y = 0; y < 50; y++)
{
if (array[x, y] == 0)
{
g.FillRectangle(new SolidBrush(Color.White), x * 15, y * 15, 13, 13);
}
}
}
this.Refresh();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawImage(Spielfeld, 0, 0);
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
for (int x = 0; x < 60; x++)
{
for (int y = 0; y < 50; y++)
{
if (array[x, y] == 0)
{
if (Convert.ToBoolean(Control.MouseButtons & MouseButtons.Left))
{
g.FillRectangle(new SolidBrush(Color.Black), e.X - 7, e.Y - 7, 14, 14);
}
if (Convert.ToBoolean(Control.MouseButtons & MouseButtons.Right))
{
g.FillRectangle(new SolidBrush(Color.White), e.X - 7, e.Y - 7, 14, 14);
}
}
}
}
// g.FillEllipse(new SolidBrush(Color.Red), e.X -5, e.Y-5, 10, 10);
this.Refresh();
}
private void timer1_Tick(object sender, EventArgs e)
{
label1.Text = Convert.ToString(MousePosition);
}
}
}
quasi ein kariertes Blatt erstellt. Jetzt möchte ich diese kleinen Quadrate Füllen, aber so, dass wirklich nur die freien Flächen zwischen den Linien (die die Quadrate bilden) gefüllt wird und man nicht, wenn man leicht daneben klickt, die Linien übermalt. Also wie bei zb. Paint das Füllwerkzeug, nur das ich das genau auf diese Raster anweden möchte. Bei meiner momentanen Lösungtritt das oben benannte Problem auf, da ich so einfach an der position des mauszeigers ein Quadrat zeichne. Vielen Dank für die Hilfe im vorraus. MFG Hyper-Hyper
- Typ geändert Ionut DumaModerator Montag, 19. November 2012 12:30 Keine Rückmeldung des Fragenstellender
Alle Antworten
-
Hallo,
das heißt RECHNEN. Du musst Dir jeweils aus den Koordinaten ableiten, ob ein Kästchen oder eine Linie (ggf. auch ein Kreuzungspunkt) getroffen wurde.
Damit das leichter handhabbar wird, erstellt man sich im allgemeinen ein "logisches" Spielfeld und bildet das auf dem Bildschirm ab.In der Diskussion Graphiken neu zeichnen lassen ohne panel und ohne picturebox findest Du ein einfaches Beispiel mit Kästchen (für Schiffe versenken o. ä.). Daran kann man das Prinzip erkennen.
Gruß Elmar
-
Hallo,
dazu braucht man keine Leuchte sein, ein bisschen Schimmer und Kenntnisse in Grundrechenarten reicht. Vor allem wirst Du Dir Zeit nehmen müssen. Und dürfte am Anfang mehr als eine 3/4 Stunde dauern (der Zeit zwischen unseren Antworten).
Erstelle Dir ein Projekt mit dem Quellcode und schau in Dir im Debugger an.
Gruß Elmar
-
Da liegt schon das Problem. Wenn ich das bei mir einfüge bekommme ich folgende Fehlermeldung:
WindowsFormsApplication1.Form1.Dispose(bool) Es wurde keine passende Methode zum überschreiben gefunden.
protected override void Dispose(bool disposing) das ist die Zeile dazu.
-
Hallo,
bei dem Beispiel wird ein Formular mit dem Namen SchiffeVersenkenForm verwendet, dass sich im Namespace ElmarBoye.Samples befindet.
Wenn Du ein neues Windows-Forms Projekt musst Du entweder die Namen gleich wählen oder anpassen: SchiffeVersenkenForm => Form1
und der Namespace entspricht den Namen des Projects (z. B. WindowsFormApplication1).
Weitere Grundlagen: Erweitern von Windows Forms-Anwendungen
(wobei man nicht alles am Anfang braucht, als Nachschlagehilfe im Problemfall sollte man einen Blick reinwerfen).
Gruß Elmar
-
****************************************************************************************************************
Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
****************************************************************************************************************