Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

hwndproc

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 15.07.2010, 20:11    Titel: hwndproc Antworten mit Zitat

hallo zusammen!

mal eine frage an unsere windows-api-profis:

Ich programmiere ein windows programm das mehrere windows-fenster darstellt.

diese fenster erstelle ich mit createwindowex()

die anzahl der fenster ist dynamisch. Es gibt also keine feste anzahl von fenstern.

aber genau das ist mein problem:

ich weiss nicht, wie ich die hwndproc - funktion so programmiere, das sie verschiedene daten annehmen kann.

kann man der wcls-struktur irgendwie einen pointer zu einer user-struktur mitgeben die dann an die hwndproc-funktion weitergeleitet wird?

ich kann euch leider auch kein beispiel geben, aber ich hab mal ein bischen gegooglet.. das problem scheinen c-programmierer zu kennen.
sie übergeben einen pointer zu einer user-struktur irgendwie über lpParam, aber ich weiss nicht wie das geht traurig(
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 16.07.2010, 01:46    Titel: Antworten mit Zitat

Meine letzten Erfahrungen mit der WinAPI für GUI-Elemente ist zwar schon etwas länger her, aber für dein Problem hätt ich möglicherweise eine Lösung parat (ich denk es gibt auch noch andere Löungswege, evt. auch bessere):

Du kannst für jedes Fenster etwas zusätzlichen Speicherplatz anlegen lassen. Dazu musst du nur den Wert "cbWndExtra" deiner Fensterklasse entsprechend setzen.
"cbWndExtra" enthält die Anzahl der zusätzlich reservierten Bytes je angelegtem Fenster. Da du später immer nur 4 Bytes auslesen kannst sind nur Werte >= 4 sinnvoll.

Mit SetWindowLong und GetWindowLong kannst du Werte aus diesem reservierten Speicher auslesen/in diesen hineinschreiben (ich seh gerade dass diese zwei Funktionen anscheinend veraltet sind und SetWindowLongPtr bzw. GetWindowLongPtr genutzt werden sollten - auf den ersten Blick schauts recht ähnlich aus, probiers einfach aus. Da ich die neuen Funktionen noch nie verwendet hab beziehe ich mich im Folgenden auf die alten).

Die Funktionen erwarten beide jeweils das Handle zu deinem Fenster und den Byte-Index (beginnend ab 0) des zu lesenden/schreibenden 4Byte-Werts. Bei SetWindowLong ist zusätzlich der neue Wert zu übergeben.

Du müsst dich übrigens nicht an die 4-Byte grenzen halten sondern kannst auch mit einem Index von 1 die Bytes Nr. 2 bis 5 ansprechen.

Naja, weiteres dazu findest du in der MSDN zwinkern



Was du eventuell mit "Pointer zu einer Userstruktur per lParam übergeben" gemein haben könntest:

Bei CreateWindowEx kann man einen Parameter "lpParam" angeben. Wenn das Fenster erstellt wird erhält es eine WM_CREATE Nachricht, die einen Pointer auf einen CREATESTRUCT type in lParam enthält, welche wiederrum den Wert "lpCreateParams" enthält, in dem sich schließlich der Übergabeparameter findet.
Diesen Wert kannst du dann z.B. mit SetWindowLong speichern.
(Du kannst natürlich auch ohne Übergabeparameter arbeiten und nach CreateWindowEx wiederrum mit SetWindowLong den Wert manuell außerhalb der WndProc setzen)


Ich hoffe, dass mein verbliebenes Wissen noch brauchbar ist und die Vorgensweise so funktioniert. Viel Spaß beim Probieren.

MfG,
St_W
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
darkinsanity
aka sts


Anmeldungsdatum: 01.11.2006
Beiträge: 456

BeitragVerfasst am: 16.07.2010, 21:16    Titel: Antworten mit Zitat

Kann man die einzelnen Fenster nicht über das window handle (hWnd) identifizieren? Bei CreateWindowEx bekommst du so eins zurück, und so eins wird auch an WndProc übergeben.

Ich habs eben kurz ausprobiert. hWnd ist ja ein Pointer, also hab ich mir ihn einmal bei der Initialisierung ausgeben lassen und einmal aus WndProc heraus. Die beiden Pointer sind identisch, also sollte das doch klappen.
_________________
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Stueber



Anmeldungsdatum: 07.07.2008
Beiträge: 202

BeitragVerfasst am: 16.07.2010, 23:49    Titel: Antworten mit Zitat

Der letzte Parameter von CreateWindow() heißt lpParam und den Wert den du dort übergibst (ein Pointer auf einen UDT) bekommt die Fensterfunktion als LPARAM bei der ersten Nachricht, WM_CREATE. Für alle anderen Nachrichten gibt es zwei Möglichkeiten: das was St_W schon gesagt hat, was mir persönlich auch mehr gefällt, oder SetProp() und GetProp(). Bei SetProp() übergibst du den HWND, einen String und einen Wert mit 4 Byte (Pointer oder Integer). GetProp() kannst du dann in der Fensterfunktion verwenden. Du übergibst den HWND und den String und bekommst das zurück, was du mit dem entsprechenden String gesetzt hast.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 19.07.2010, 22:00    Titel: Antworten mit Zitat

cool!!! danke für eure erklärungen lächeln

mit setprop() und getprop() hats wunderbar geklappt grinsen

vielen vielen dank!!

bald werd ich wieder ein bischen quelltext posten grinsen .. das klappt aber schon jetzt ziemlich gut happy ..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
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.

 Impressum :: Datenschutz