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
    GetClientRect

    da 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.


Anmelden zum Antworten