Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

11

13.07.2006, 17:52

Danke, dass du dir so viel Mühe mit mir gibtst, aber ich habe es immer noch nicht ganz geschnallt.

Ich poste jetzt mal meinen momentanen Code und würde dich/euch bitten mir direkt zu sagen, was ich wie verändern muss. Vielleicht kapiere ich es, wenn ich den richtigen Code sehe.

Also hier die Klassedefinition (smallrect.hpp):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class smallrect
{
private:

    RECT    rect_to_draw;

    const static int s_width  = 10;
    const static int s_height = 10;

    int i_mcolor_r;
    int i_mcolor_g;
    int i_mcolor_b;

public:

    void RandomColor();
    
    void CalculateRect();

    void Draw_small_rect();

    void Delete_small_rect();

    void Draw();
};


Die dazugehörigen Funktionen (smallrect.cpp):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
void smallrect::RandomColor()
{               
        i_mcolor_r = random(0,254);                 //RGB-Farbwerte generieren

        i_mcolor_g = random(0,254);                 //            ""

        i_mcolor_b = random(0,254);                 //            ""

}

void smallrect::CalculateRect()
{
    RECT    mainrect;                               //Rect für den Clientbereich

    
    GetClientRect(hWnd,&mainrect);                  //Größe des Clientbereich holen

    
    int i_xPosition = random(0,mainrect.right);     //einen x-Wert aus der Breite des Clientbereich generieren

    int i_yPosition = random(0,mainrect.bottom);    //einen y-Wert aus der Höhe des Clientbereich generieren

    
    rect_to_draw.top        = i_yPosition;
    rect_to_draw.left       = i_xPosition;
    rect_to_draw.bottom     = i_yPosition - s_height;
    rect_to_draw.right      = i_xPosition - s_width;
}

void smallrect::Draw_small_rect()
{
    HDC hDC = GetDC(hWnd);
    
    HBRUSH hBR = CreateSolidBrush(RGB(i_mcolor_r,i_mcolor_g,i_mcolor_b));

    FillRect(hDC,&rect_to_draw,hBR);

    DeleteObject(hBR);
    ReleaseDC(hWnd,hDC);
}

void smallrect::Delete_small_rect()
{   
    POINTS  points = MAKEPOINTS(lParam);

    if(points.x > rect_to_draw.left && points.x < rect_to_draw.right && points.y > rect_to_draw.bottom && points.y > rect_to_draw.top) 
    {
        HDC hDC = GetDC(hWnd);
        RECT rc;
        GetClientRect(hWnd,&rc);
        FillRect(hDC,&rc,CreateSolidBrush(RGB(255,255,255)));
        ReleaseDC(hWnd,hDC);
    }       
}

void smallrect::Draw()
{
    RandomColor();
    CalculateRect();

    Draw_small_rect();
}


Es fehlt jetzt noch das ganze mit dem *this-Zeiger. Habe mir das Kapitel in Keikos Buch nochmal angeschaut, trotzdem ist der Groschen nicht gefallen :( .

Die Draw-Methode soll dan so genutzt werden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void DrawRects()
{
    if(iRectCounter == 0)
    {               
    smallrect srect;
    srect.Draw();
    RectCounter = 1;
    }
}


Bitte versucht mir noch mal zu helfen. Ich würde echt gerne diese Hürde nehmen und hoffe, dass ich mich nicht allzu blöd anstelle.

mfg spacegaier- der es gerne endlich schnallen würde ( :lol: )

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

12

13.07.2006, 18:27

Das sieht doch schonmal gar nicht so schlecht aus.

Den this Zeiger brauchst du nicht, das hatte ich wie gesagt nur zur Verdeutlichung so geschrieben. Bei dir ist das eben in der Draw_small_rect Methode zusammengefasst.

Zum löschen musst du dem smallrect noch den Punkt mitgeben, z.B.

C-/C++-Quelltext

1
void smallrect::Delete_small_rect (const POINT& point) { ... }
Wenn du das machst, kannst du dir die Konvertierung von lParam sparen; das macht man einmal vorher, und lParam kann in der Methode eigentlich gar nicht bekannt sein. Ausserdem würdest du eben immer den kompletten Client-Bereich weiss übertünchen. :)

Wenn du mehrere smallrect Objekte hast, z.B. in einem

C-/C++-Quelltext

1
std::vector<smallrect> rectangles;
gespeichert, durchläufst du einfach alle diese Objekte und rufst dann in jedem Objekt

C-/C++-Quelltext

1
rectangles[i].Delete_small_rect (point);
auf. Die Objekte, die sich angesprochen fühlen, löschen ihren Bildbereich dann selbst.

Beim Malen musst du dann nur noch sicherstellen, dass jedes Objekt, dass du gezeichnet hast, auch gemerkt wird

C-/C++-Quelltext

1
2
3
smallrect rectangle;
rectangle.Draw (); // Erzeugt Koordinaten und Farbe und zeichnet sich

rectangles.push_back (rectangle); // Merken, damit die Koordinaten nicht verloren gehen


Das wär's dann im Wesentlichen schon,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

13

13.07.2006, 19:47

Heißt das, dass ich die Draw-Methode nicht brauche (die funktioniert nämlich nicht) und ich einfach in der Draw_small_rect-Methode die beiden Randomfunktionen aufrufe?

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

14

14.07.2006, 07:49

Zitat von »"spacegaier"«

Heißt das, dass ich die Draw-Methode nicht brauche (die funktioniert nämlich nicht) und ich einfach in der Draw_small_rect-Methode die beiden Randomfunktionen aufrufe?


Klar, du kannst das auch alles in nur einer Methode zusammenfassen. So wie du es geschrieben hast, müsste smallrect::Draw aber genauso funktionieren, also würdest du RandomColor und CalculateRect direkt in der Draw_small_rect Methode aufrufen. (jedenfalls sehe ich auf die Schnelle keinen offensichtlichen Fehler)

MfG
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

15

14.07.2006, 16:49

Ok, ich mach das mit meiner alten Funtkion (weiß nicht warum die andere Varianten net funtzt).

Aber des mit dem Löschen ist mir noch nichr klar.

C-/C++-Quelltext

1
void smallrect::Delete_small_rect (const POINT& point) { ... }


Was soll dieser point darstellen. Wieso ist der konstant? Ich muss doch irgendwo mein lParam in POINT konvertieren und dann meiner Delete_small_rect-Funktion mitteilen. Dieser Punkt (beinhaltet ja die Koordinaten des Cursors) ist ja jedesmal anders und nicht konstant. Oder verstehe ich die falsch?

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

16

14.07.2006, 17:22

... au weia ... ;)

Du erzeugst dir vor dem Löschen einen

C-/C++-Quelltext

1
POINT point = MAKEPOINT (lParam);


Diesen Punkt reichts du dann als Parameter an deine Delete_small_rect Methode weiter, die dann Werte aus diesem Punkt-Objekt benutzen will.

In der Delete_small_rect Methode ist dieser Punkt dann als "const POINT&" sichtbar, was bedeutet, dass der Punkt als Referenz ("Call by Reference") und nicht als Wert ("Call by Value") übergeben wird.

Da ich den Punkt in der Methode aber nicht ändern will deklariere ich ihn als const. Ausserdem kann ich die Methode so auch mit Punkten als Parameter aufrufen, die ich nicht ändern darf. In anderen Worten heisst das, der als Parameter übergebene Punkt darf ausserhalb auch schon const sein, muss aber nicht. Innerhalb der Methode ist er sicher const.

MfG,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

17

16.07.2006, 11:23

Okay, danke das ist klargeworden. Aber: Es klappt immer noch nicht.

Ich deklariere jetzt testweise mal eine globale Instnaz meiner Klasse und gebe diese per extern weiter (kein guter Stil, doch erst muss es mal überhaupt klappen, bevor ich mir um so was Gedanken mach) -> gibt nur ein Rechteck -> der Delete-Funktion müsste klar sein um welches Rechteck es sich handelt. Tut es aber anscheinend nicht, zumindest wird das Rechteck beim Draufklicken nicht gelöscht.

Es kommt aber kein Fehler -> Syntax scheint zu stimmen.

Frage: Nachfolgender Code (Draw-Funktion) generiert ja Ort und Farbe. Sind diese Werte dann nur für diese Funktion in dem in der Klasse definiertem RECT drin?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void smallrect::Draw_small_rect()
{
    RandomColor();
    CalculateRect();

    HDC hDC = GetDC(hWnd);
    
    HBRUSH hBR = CreateSolidBrush(RGB(i_mcolor_r,i_mcolor_g,i_mcolor_b));

    FillRect(hDC,&rect_to_draw,hBR);

    DeleteObject(hBR);
    ReleaseDC(hWnd,hDC);
}


Klasse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class smallrect
{
private:

    RECT    rect_to_draw;

    const static int s_width  = 10;
    const static int s_height = 10;

    int i_mcolor_r;
    int i_mcolor_g;
    int i_mcolor_b;

public:
    
    void RandomColor();
    
    void CalculateRect();

    void Draw_small_rect();

    void Delete_small_rect(const POINTS points);
};


Wäre euch echt dankbar, wenn ihr weiterhin versucht mir bei diesem (nervenden) Problem zu helfen.

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

18

16.07.2006, 11:59

Zitat von »"spacegaier"«

Frage: Nachfolgender Code (Draw-Funktion) generiert ja Ort und Farbe. Sind diese Werte dann nur für diese Funktion in dem in der Klasse definiertem RECT drin?


Nein, die erzeugten Werte bleiben vorhanden, bis du entweder das Objekt verwirst, oder du die Funktionen nochmal aufrufst. Methoden manipulieren die Attribute eines Objekts; damit ändert sich der Zustand des Objekts, egal, ob die Methode aus dem Objekt selbst, oder von "ausserhalb" aufgerufen wird.

An deiner Stelle würde ich mal im Debugger nachverfolgen, welcher Punkt überhaupt an deine Delete Methode übergeben wird, und ob die überhaupt aufgerufen wird.

MfG,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

19

16.07.2006, 12:09

Die Delete-Funktion wird aufgerufen, die if-Abfrage ist aber immer negativ.

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

20

16.07.2006, 20:09

Zitat von »"spacegaier"«

C-/C++-Quelltext

1
2
3
4
if (points.x > s_rc.rect_to_draw.left &&
    points.x < s_rc.rect_to_draw.right &&
    points.y > s_rc.rect_to_draw.bottom &&
    points.y > s_rc.rect_to_draw.top)

Schau dir nochmal den Vergleich für die y-Koordinate an. :)
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Werbeanzeige