Spielfeld mit einem Raster erstellen
-
Hallo erstmal,
ich bin neu hier und gerade dabei ein MFC-Basiertes Brettspiel zu erstellen. Dazu möchte ich ein Fenster erstellen, das mit einem Raster ausgefüllt ist. Wenn man nun auf eines der Felder in diesem "Schachbrett"-Raster ( es wird kein Schachspiel ) klickt, wird ein Event ausgelöst und dieser teilt mit auf welches Feld geklickt wurde.Wie mache ich das am günstigsten, wo gibt es Beispiele?
Gruss Christian
-
wenn es nicht all zu viel Felder sind, könnte man doch einfach buttons nebeneinander legen. ich bau grad an nem activex element "FlexGrid"; das könnte man dazu denk ich auch missbrauchen.
-
1. z.b. ein raster zeichen
ein bmp draufmalen sozusagen
dann mausklick event abfangen und da die mauspos ermitteln und dann berechnen welches feld geklickt worden ist.
2. oder das mit den buttons
3. oder ganz übel ein CListCtrl missbrauchen
-
1. z.b. ein raster zeichen
ein bmp draufmalen sozusagen ...
Und gibt es dafür auch Beispiele? Gibt es in der MFC auch sowas wie Canvas-Classen oder wo bzw. welche Fensterklasse kann man da reinzeichnen?
Gruss Christian
-
du nimmst z.b. MXPAINT.exe
da malst du ein bild mit raster
z.b. 200*200 pixel und da halt die felder
im dialog nimmst du bei den steuerelementen das steuerelement "BILD"
da lädst du in der OnInit() das asdf.bmp da rein.
schau dir an
CRect rect;
dann
GetWindowRect
und
GetClientRectda hast die positionen vom Hauptdialog und vom steuerdialog
dann musst die mausklick pos abfangen und halt pos bestimmen
-
Ich hab das mal vor langer Zeit ungefähr so gelöst:
// Hintergrund einfärben
GetClientRect((LPRECT) &rect );
fill = CreateSolidBrush( Farbe[0]);
pDC->SelectObject(fill);
pDC->Rectangle( rect.left, rect.top, rect.right, rect.bottom);lBreite = 3;
// Farbe und breite der Linien einstellen
pen = CreatePen( PS_SOLID, lBreite, RGB(128, 0, 128) );
pDC->SelectObject(pen);// Waagerechte linien zeichnen
for ( n = abstand_y; n < (spalten * abstand_y); n+=abstand_x)
{
pDC->MoveTo(abstand_y, n);
pDC->LineTo( ((spalten -1) * abstand_y ), n);
}n= 0;
// Senkrechte linien zeichnen
for ( n = abstand_x; n < (zeilen * abstand_x); n+=abstand_y)
{
pDC->MoveTo(n, abstand_x);
pDC->LineTo(n, ((zeilen -1) * abstand_x ));
}Jetzt noch die funktionalität der Mausereignisse
// Mausposition ermitteln
// TODO: Maustaste wurde gedrückt, position ermitteln
CString help;
int erg;
int feld_x, feld_y;// Position ermitteln
feld_x = ((point.x - abstand_x) / abstand_x) + 1;
feld_y = ((point.y - abstand_y) / abstand_y) + 1;Ob ein Feld besetzt, womit usw. hab ich in einem mehrdimmensionalen Array abgelegt.