Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: WinAPI ::  Problem mit Buttons und Klasse     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Sc0rpe
Mitglied

Benutzerprofil
Anmeldungsdatum: 04.04.2012
Beiträge: 33
Beitrag Sc0rpe Mitglied 16:44:31 30.07.2012   Titel:   Problem mit Buttons und Klasse            Zitieren

Hallo Liebe Community,
ich bin gerade dabei ein TicTacToe spiel zu programmieren wollte das ganz so umsetzten das sich eigentlich alles mit der Klasse lößt. Habe somit auch die buttons in die Klasse gepackt.Das ganze compiliert problemlos nur werden die buttons irgendwie nicht angezeigt. Hier meine Klasse

C++:
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
class feld
{
public:
    HWND hwndA1;
    HWND hwndA2;
    HWND hwndA3;
    HWND hwndB1;
    HWND hwndB2;
    HWND hwndB3;
    HWND hwndC1;
    HWND hwndC2;
    HWND hwndC3;
 
    bool bA1,bA2,bA3;
    bool bB1,bB2,bB3;
    bool bC1,bC2,bC3;
 
public:
 
    feld(HWND *hwnd)
    {   bA1=false;bA2=false;bA3=false;bB1=false;bB2=false;bB3=false;bC1=false;bC2=false;bC3=false;
 
    hwndA1=CreateWindow(L"button",L"", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,605,105,90,90,*hwnd,(HMENU)a1,GetModuleHandle(0),0);
    }
 
   
 
};


Die bool-variablen einfach ignorieren die gehören nicht zum problem^^ .
In meiner WM_CREATE steht also nix und einfachheitshalber hab ich nur erstmal den einen button gemacht. Der erscheint nur leider nicht.

Ich habe dann auch mal so probiert den button in der WM_create zu machen aber weiterhin als element der klasse, dann erscheint er auch nur verschwindert er dann nicht wenn ich versuche ihn mit DestroyWindow() zu löschen....
kann mir bitte jemand erklären was ich da falsch mache ?


Zuletzt bearbeitet von Sc0rpe am 16:50:45 30.07.2012, insgesamt 2-mal bearbeitet
Sc0rpe
Mitglied

Benutzerprofil
Anmeldungsdatum: 04.04.2012
Beiträge: 33
Beitrag Sc0rpe Mitglied 11:26:49 31.07.2012   Titel:              Zitieren

Keiner der mir helfen kann ?
Ich denke nicht das es so schwer ist ^^ ,aber irgendwie hängts bei mir gerade :D
Ich bin Matrix...
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.01.2012
Beiträge: 55
Beitrag Ich bin Matrix... Mitglied 14:20:34 31.07.2012   Titel:              Zitieren

1. schonmal was von der Regel der Großen Drei gehört?
//Edit: mein Fehler, gilt ja nur für Copy Constructor, Verzeihung!
2. schonmal was von einem Elementinitialisierer/einer Initialisierungsliste gehört?
3. schonmal was von std::vector<HWND> gehört?
4. schonmal was von Referenzen gehört? Wenns nicht unbedingt erforderlich ist sollte man zugunsten deren auf Zeiger verzichten.
5. schonmal was von Kapselung gehört? Deine Klassenelemente sind alle public...

Zitat:
In meiner WM_CREATE steht also nix und einfachheitshalber hab ich nur erstmal den einen button gemacht. Der erscheint nur leider nicht.

Du musst das Objekt feld dann aber schon in der WM_CREATE erstellen.

Zitat:
Ich habe dann auch mal so probiert den button in der WM_create zu machen aber weiterhin als element der klasse, dann erscheint er auch nur verschwindert er dann nicht wenn ich versuche ihn mit DestroyWindow() zu löschen....

Weil du ihn dann wahrscheinlich einfach nur in die Klasse kopiert hast, und nur die Kopie zerstört hast.

Mir scheint, du versuchst C with Classes zu programmieren... Entweder mach richtiges C++ oder mach richtiges C. Ein mischmatsch aus beidem ist nie von Vorteil.


Zuletzt bearbeitet von Ich bin Matrix... am 18:26:29 31.07.2012, insgesamt 1-mal bearbeitet
Sc0rpe
Mitglied

Benutzerprofil
Anmeldungsdatum: 04.04.2012
Beiträge: 33
Beitrag Sc0rpe Mitglied 14:48:16 31.07.2012   Titel:              Zitieren

Ich bin Matrix... schrieb:
1. schonmal was von der Regel der Großen Drei gehört?

Nein erklär sie mir doch bitte, wie dir evtl. aufgefallen ist bin ich nicht grad jemand der seit 10 jahren programmiert ;)

Zitat:
2. schonmal was von einem Elementinitialisierer/einer Initialisierungsliste gehört?

Ja, aber anscheinend wieder vergessen.
Code:
feld(HWND *hwnd) : bA1(false),bA2(false),bA3(false),bB1(false),bB2(false),bB3(false),bC1(false),bC2(false),bC3(false)
    {  
    }

Zitat:
3. schonmal was von std::vector<HWND> gehört?

Ja auch, hab dies auch schonmal versucht jedoch wüsste ich nicht was dies mit meinem Problem zu tun hat.

Zitat:
4. schonmal was von Referenzen gehört? Wenns nicht unbedingt erforderlich ist sollte man zugunsten deren auf Zeiger verzichten.

Ebenfalls schon von gehört, gehört allerdings auch nicht zum Problem, danke trotzdem für den Hinweis, ich weiß mein stil ist bis jetzt nicht der beste. Ich bin halt gerade noch dabei das programmieren zu lernen, damit ich aufs studium etwas vorbereitet bin.

Zitat:
5. schonmal was von Kapselung gehört? Deine Klassenelemente sind alle public...


Das weiß ich das ist absicht gewesen weil ich etwas probiert habe ;)

Zitat:
Du musst das Objekt feld dann aber schon in der WM_CREATE erstellen.

Code:
case WM_CREATE:
             feld Feld(&hwnd);
return 0;

wenn du das so meinst, dann bekomm ich das hier
Zitat:
error C2360: Initialisierung von 'brett' durch 'case'-Marke übersprungen

hab ich übrigens auch schon versucht ;)

Zitat:
Mir scheint, du versuchst C with Classes zu programmieren... Entweder mach richtiges C++ oder mach richtiges C. Ein mischmatsch aus beidem ist nie von Vorteil.

Das liegt wohl daran das ich bis jetzt nur c++ kann und mir jetzt den Petzold gekauft habe und leider noch nie in berührung mit c war...bis jetzt, da das buch ja mit c ist :/
Hab erst vor kurzen mit der Winapi angefangen ....

Wär trotzdem nett wenn du mir vlt. etwas helfen kannst und evtl. paar tipps :)
Danke schonmal bis jetzt
Ich bin Matrix...
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.01.2012
Beiträge: 55
Beitrag Ich bin Matrix... Mitglied 18:36:47 31.07.2012   Titel:              Zitieren

Zitat:
Nein erklär sie mir doch bitte, wie dir evtl. aufgefallen ist bin ich nicht grad jemand der seit 10 jahren programmiert ;)

Ich muss mich entschuldigen, gilt für dein Problem nicht, aber dennoch solltest du sie kennen. Hier ist sie gut erklärt: http://de.wikipedia.org/wiki/Dreierregel_%28C%2B%2B%29

Zitat:
Ja auch, hab dies auch schonmal versucht jedoch wüsste ich nicht was dies mit meinem Problem zu tun hat.

Ist doch schöner, die ganzen Buttonhandles in einen std::vector zu schmeißen, spart u.a. Schreibarbeit und du kannst sie einfach mit einer for-Schleife initialisieren und die Positionen berechnen.

Zitat:
wenn du das so meinst, dann bekomm ich das hier

Dann mach dir entweder eine extra Create-Methode, in der du die Buttons erstellst und lass den CTor leer oder prüfe deine Message mit if (message == WM_CREATE)
Ich glaube aber dein Problem liegt wo ganz anders: Wenn du das Objekt feld erstellst und wieder aus der WndProc rausgehst, was ja nach dem verarbeiten jeder Message passiert ist dein feld-Objekt doch wieder futsch - und mit ihm auch die ganzen Buttons. Entweder du erstellst dir das feld-Objekt global (oder benutzt ein Singleton o.ä.), oder du machst es lokal, aber static oder erstellst es mit new. Die Static Methode finde ich persönlich am besten.
Sc0rpe
Mitglied

Benutzerprofil
Anmeldungsdatum: 04.04.2012
Beiträge: 33
Beitrag Sc0rpe Mitglied 20:03:33 31.07.2012   Titel:              Zitieren

Ahhh, du bist ein Gott....daran hatte ich nicht gedacht, habs jetzt als staic erstellt und damit hast du sogar mein anderes problem gelöst das ich es mit destroywindow nicht wegbekommen habe :D

danke dir, und danke auch für die anderen sachen :)
nwp3
Unregistrierter




Beitrag nwp3 Unregistrierter 00:06:01 01.08.2012   Titel:              Zitieren

Sc0rpe schrieb:

C++:
case WM_CREATE:
             feld Feld(&hwnd);
return 0;

wenn du das so meinst, dann bekomm ich das hier
Zitat:
error C2360: Initialisierung von 'brett' durch 'case'-Marke übersprungen

hab ich übrigens auch schon versucht ;)

Du darfst innerhalb von case keine Variablen deklarieren, weil der Compiler nicht weiß in welches case er springen wird und nicht wissen kann, ob die Variable deklariert sein soll oder nicht.
C++:
case WM_CREATE:
             {
                    feld Feld(&hwnd);
             }
return 0;

Damit ist klar, dass es "Feld" nur in dem Block gibt und der Fehler ist weg.
Ich bin Matrix...
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.01.2012
Beiträge: 55
Beitrag Ich bin Matrix... Mitglied 04:06:48 01.08.2012   Titel:              Zitieren

Zitat:
Damit ist klar, dass es "Feld" nur in dem Block gibt und der Fehler ist weg.

Jetzt muss ich mich auch bedanken, hab ich nicht gewusst! :)
Sc0rpe
Mitglied

Benutzerprofil
Anmeldungsdatum: 04.04.2012
Beiträge: 33
Beitrag Sc0rpe Mitglied 10:56:00 01.08.2012   Titel:              Zitieren

Ich bin Matrix... schrieb:
Zitat:
Damit ist klar, dass es "Feld" nur in dem Block gibt und der Fehler ist weg.

Jetzt muss ich mich auch bedanken, hab ich nicht gewusst! :)

sehr gut, haben wir alles was neues gelernt :D
c++.de :: WinAPI ::  Problem mit Buttons und Klasse   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.