JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=2a1c7aca158260c4ebec92566b138949Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Message Funktion als Klassenmethode
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 26.11.2004, 00:43    Titel: Message Funktion als Klassenmethode Antworten mit Zitat

OK mein Programm hat in einer Klasse 4 Childwindows vom Hauptfenster. Dafür möchte ich in die KLasse eine Nachrichtenfunktion also als Methode machen. Das dumme ist, die nachrichtenfunktion wird ja im allgemeinen über die Fensterklasse geregelt, und die kann man bei enem Child ja nicht angeben.
Ist übrigens mein erstes gröeres Windowsprogramm und mein allererstes das ein bischen OOP sein soll, und im Petzold steht dazu ja leider gar nix.
Soll ich vieleicht im Hauptfenster filtern, für welches Wnd die Nachricht ist, und wenn sie für ein Unterfenster ist, an die Klasse weiterleiten? Da muss es doch bestimmt ncoh ne bessere Lösung geben.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 26.11.2004, 19:36    Titel: Antworten mit Zitat

Öhhm was genau ist dein Problem ? Du hast das sehr kompliziert beschrieben, sry Razz
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 27.11.2004, 13:44    Titel: Antworten mit Zitat

ok, ich hab extrem viel rumgebastelt, oben den Text 3 mal neu geschrieben, weil mir immer ne andere Lösung einviel, und weiß jetzt genau was ich will:

Die CALLBACK Mehtode soll in einer Klasse eine Methode sein!

Ich hab mich schon wer weiß wie schlau gemacht, man muss die irgendwie static machen weil Windows keinen this-Pointer weiß und so, aber dann kann man halt nicht mehr auf die Elemente zugreifen. Hat jemand ne gute Idee, wie das zu Lösen wäre? Gibt dan auch manchmal Probleme wenn man halt mehrerer Objekte der Klasse haben will, und so. Irgendwie ganz kompliziert. Weiß also jemand wie man das einfach, elegant und funktionell lösen kann?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 27.11.2004, 14:53    Titel: Antworten mit Zitat

Vielleicht hilft dir das:
ZFX-FAQ
_________________
Kochen ist ein NP-schweres Optimierungsproblem.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 27.11.2004, 21:18    Titel: Antworten mit Zitat

oh, das sieht sehr gut aus. Nur ich hätte ein paar verständnifragen (wenn ich so was benutze, würde ich gerne wissen, wie es funktioniert...):
Es ist mir jetzt schon logisch geworden, warum meine Idee nicht funktionieren kann. Wenn mehrere Objekte die selbe Funktion benutzen, muss diese wissen, welche Variablen sie manipulieren muss, also muss wissen, zu welcher Klasse sie gehört. Dafür gibt es den unsichtbaren this-Zeiger, der eben diese Information leifert. Und Windows kann diesen Zeiger nicht wissen, da es ja keine Ahnung hat, das das Fenster in der Funktion erstellt wurde.
Deshalb muss die Funktion static sein, kann alo nciht auf die Elemente der Klasse zugreifen.
Die Lösung ist jetzt die, das man dem Fenster beim Erstellen den this Zeiger gibt, welcher in der WM_CREATE Nachricht mitgeliefert wird. Nur den Rest kapier ich jetzt gar nicht. Das mit dem Instance ist irgendwie komisch, da wird ja mit dem handle rgendwie wohl der Zeiger der bei erstellen übergeben wurde geholt, und damit eine nciht static LRESULT aber nicht CALLBACk Funktion aufgerufen?`Könnte mir das einer näher erklären?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 27.11.2004, 21:38    Titel: Antworten mit Zitat

Es ist eigentlich ganz einfach:
Die statische Callback wird für das Fenster registriert. Bei der WM_CREATE Nachricht wird der Zeiger auf die Fensterklassen-Instanz an die Callback Funktion übergeben und per SetWindowLong in der Fensterstruktur (die für jedes Fenster angelegt wird) gespeichert.

Wird die Callback Funktion dann aufgerufen holt sie sich den Zeiger aus der Fensterstruktur per GetWindowLong und ruft die nicht-statische Callback Methode der Fensterklassen-Instanz auf.
_________________
Kochen ist ein NP-schweres Optimierungsproblem.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 27.11.2004, 21:45    Titel: Antworten mit Zitat

äh, ok für einen der weiß wie es geht IST es easy.
Also Fensterklasseninstance ist ein Objekt der von mir geschrieben Klasse.(?)
Jedes Fenster hat also bei erstellen einen kleinen ExtraSpeicher von Windows, in den es z. B. eine (Überraschung!: Laughing ) this Zeiger speichern kann. Bevor jetzt also eine Nachricht bearbeitet wird, holt sich das Prog aus diese Extra Bonus speicher dem man beim Fnetsererstellen quasi als Werbegweschenk mitgeliefert bkommt sein this Zeiger und kann dann eine Methode von der Klasse auf die der Zeiger ezigt aufrufen.
Boh ey, ist ja clever. Nachdem ich das jetzt also hoffentlich gecheckt habe, kann ich mich in die wunderbare Programmierwelt der WinAPI mit vollem OOP-Support stürzen.
(wen meine Ausschweifungen wunder, ich hab grad nix besseres zu tun)
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 27.11.2004, 21:48    Titel: Antworten mit Zitat

Wenn du das Problem hast zu identifizieren an welches Fenster denn nun die Message gerichtet ist kannst du ja das handle benutzen Wink
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 27.11.2004, 21:48    Titel: Antworten mit Zitat

Genau so ist es Smile
_________________
Kochen ist ein NP-schweres Optimierungsproblem.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 27.11.2004, 21:51    Titel: Antworten mit Zitat

hm ja das mit dem Handle war mir klar, mein erster Ansatz war ja auch das die hauptnachrichtenfunktion nach entsprechender Handleprüfung das an die Klasse weitergibt. Aber das ist ja unfein udn doof.
Also dann mal Danke für die Hilfe, vieleicht kann ich ja auch nochmal was für euch tun.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 28.11.2004, 12:16    Titel: Antworten mit Zitat

Also im Prinzip funktioniert das mit den Nachrichten ja jetzt, nur kommen leider irgendiwe nicht alle an...
Das ganze ist relativ komisch, ist auch ein bisschen kompliziert.
Also die Klasse hat ja jetzt 4 Fenster die alle Child Fnetser des Hauptfensters sind. Das Hauptfenster stratet Maximiert, dann werden schonmal die Childfenster nicht angezeigt. Wenn ich es minimiere auch nciht. Wenn ich dann aber die Gräße ändere, dann werden sie zum ersten mal gezeichnet. Aber normalerweise sollten sie doch imemr sichtbar sein, schleißlich reagiere ich doch auf WM_PAINT.
Code:

LRESULT cWorkWindow::MessageProc(HWND hWnd, UINT Message, WPARAM wParam,
                         LPARAM lParam)
{
   short nWnd=0;
   for(int i=0; i<4; i++)
   {
      if(hWnd==m_hChilds[i])
      {
         nWnd=i;
      }
   }


   switch(Message)
   {
   case WM_DESTROY:
      break;
   case WM_SIZE:
      break;
   case WM_PAINT:
      DrawGrid(m_hChilds[nWnd], m_WndScroll[nWnd], 1);
      break;
   case WM_MOUSEMOVE:
      if(wParam & MK_LBUTTON)
      {
         m_WndScroll[nWnd].x=10;
         m_WndScroll[nWnd].y=20;
         Resize();//Damit es neu gemalt wird
      }
      break;
   default:
      return DefWindowProc(hWnd, Message, wParam, lParam);
   }

   return 0;
}

Das mit dem Scroll verschieben klappt irgendwie nur beim ersten Fenster also m_hChilds[0]. Außerdem fällt noch auf, das bei Größe verändern des Hauptfensters, was ja die erneute Ausrichtung und erneute Zeichnung der Childs mit sich bringt wieder nur das erste gezeichnet wird, solange ich die Maustaste gedrückt halte. Also ich drück, alles wird weiß, ziehe, man sieht nur das erste, und erst wenn ich die Maus loslasse, werden alle 4 gezeichnet.
Das find ich irgendwie verwirrend, weiß jemand vieleciht, woran das leigen könnte?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 02.12.2004, 16:52    Titel: Antworten mit Zitat

hm, kennt sich vieleciht irgendjemand mit komplexeren WIndows anwendungen aus? Ich glaub fast, es wäre das beste den Quellcode mal zu schicken, damit man sich den Fehler und den Code genauer anschauen kann. Würde sich hier evtl. irgendjemand bereit erklären sich das mal anzusehen? Snd ja auch nur knapp 50KB, weil hab ja fast noch nix gemacht.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 02.12.2004, 20:07    Titel: Antworten mit Zitat

Ich weiß jetzt nicht so genau, aber was machst du eigentlich bei Nachrichten für das Hauptfenster? Außerdem, wenn bei jedem Durchlauf nur eine Nachricht angenommen werden kann(falls es so ist) würde das erste Kind diese abfangen(durch die if-Schleife)
_________________
"Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 02.12.2004, 20:51    Titel: Antworten mit Zitat

Für Nachrichten ans Hauptfenster hab ich ne extra Funktion.

und das Handle kann dohc imemr nur für EIN Fenster gelten. Fänd ich sehr komisch, wenn zwei Fenster das gleiche Handle haben könnten, weil es ja eben als Idendifikation dienen sollte. Eine Nachricht ist demnach nur EINME Fnetser zugeordnet, wenn sie für meherer Fenster gilt, bekommt auch jedes Fenster eine (hoffentlich).
Und Nachrichten können schon deshalb nciht abgefangen werden, weil ja alle 4 Fenster das Gitter zeichnen, aber leider nicht alle auf den Mausklick reagieren.
Es ist auch sehr komisch, das sie nicht imemr neu gezeichnet werden. Beim Größeverändern schon, aber wird das Fenster maximiert, sieht man von den Childs gar nix, man sieht das Hintergrundgrau des Hauptfensters. Auch wenn man das Menü öffnet, hinterläßt es graue Bereiche. Das Fenster müsste ja eigenltich neu gezeichnet werden, also WM_PAINT müsste ausgelößt werden. Wird es aber irgendwie nicht, den sonst sähe man ja was.

Ich denke es wäre wohl echt am betsen wenn ich jemanden den Code schicken würde, denn alles hier an zu zeigen, das wäre schon ein bisschen lang.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 04.12.2004, 14:37    Titel: Antworten mit Zitat

also, ich hab jetzt herausgefunden, das die verschiebung in allen Fenstern funktioniert, sie nur nicht neu gezeichnet werden!
Wenn man das Fenster verschiebt(dann wird ja alles neu gezeichnet) stimmt es wieder, allersdings merkt man das kaum, da die Fenster ja wärend dem verschieben nicht sichtbar sind.
Mein Problem ist jetzt also, das diese verflxten Fnester nicht neu gezeichnet werden!
Statt Resize hab ich mal damit versucht:
Code:

case WM_MOUSEMOVE:
      if(wParam & MK_LBUTTON)
      {
         m_WndScroll[nWnd].x=10;
         m_WndScroll[nWnd].y=20;
         InvalidateRect(hWnd, NULL, 1);//Damit es neu gemalt wird
         UpdateWindow(hWnd);
      }
      break;

Das Ergebnis: Bei allen aßer dem ersten([0]) Fenstern wird der Inhalt zwar gelöscht, aber nicht neu gezeichnet!
Ich bin jetzt langam echt schon am verzweifeln, warum dsa bloß mit WM_PAINT nicht klappt!
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum