Problem mit Buttons und Klasse
-
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 Klasseclass 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 ?
-
Keiner der mir helfen kann ?
Ich denke nicht das es so schwer ist ^^ ,aber irgendwie hängts bei mir gerade
-
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 vonstd::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 allepublic
...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 derWM_CREATE
erstellen.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.
-
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
2. schonmal was von einem Elementinitialisierer/einer Initialisierungsliste gehört?
Ja, aber anscheinend wieder vergessen.
feld(HWND *hwnd) : bA1(false),bA2(false),bA3(false),bB1(false),bB2(false),bB3(false),bC1(false),bC2(false),bC3(false) { }
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.
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.
5. schonmal was von Kapselung gehört? Deine Klassenelemente sind alle public...
Das weiß ich das ist absicht gewesen weil ich etwas probiert habe
Du musst das Objekt feld dann aber schon in der WM_CREATE erstellen.
case WM_CREATE: feld Feld(&hwnd); return 0;
wenn du das so meinst, dann bekomm ich das hier
error C2360: Initialisierung von 'brett' durch 'case'-Marke übersprungen
hab ich übrigens auch schon versucht
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
-
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
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.
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 Objektfeld
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, aberstatic
oder erstellst es mitnew
. Die Static Methode finde ich persönlich am besten.
-
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
danke dir, und danke auch für die anderen sachen
-
Sc0rpe schrieb:
case WM_CREATE: feld Feld(&hwnd); return 0;
wenn du das so meinst, dann bekomm ich das hier
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.
case WM_CREATE: { feld Feld(&hwnd); } return 0;
Damit ist klar, dass es "Feld" nur in dem Block gibt und der Fehler ist weg.
-
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!
-
Ich bin Matrix... schrieb:
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