Toon posts:

[WIN32>C++] Vraagje ivm static member functies

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig aan een kleine class die het MSN Popup venstertje (idd, dat ranzig blauw ding) nabootst (in C++ met de plain Win32 api)
Nu heb ik een class genaamd CPopupWindow, met daarin een aantal intialisatiefuncties en een Windowproc.

Omdat die windowproc een CALLBACK functie is, moest ik deze static declaren. In de windowproc heb ik echter ook een member variabele nodig, die opslaat welke bitmap als achtergrond te gebruiken. Dit is geen static variabele.
de class is dus dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class CPopupNote  
{
public:
    CPopupNote( HINSTANCE hInstance, LPCTSTR szResID );
    virtual ~CPopupNote();

    static BOOL CreateNoteWndClass( HINSTANCE hInstance );
    DWORD WINAPI ShowNote( LPCTSTR lpszMessage );

protected:
    static LRESULT CALLBACK NoteWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    HWND CreateNoteWindow( LPVOID lpData );


protected:
    HINSTANCE m_hInstance;
    LPCTSTR  m_szNoteBackground;

};

Het probleem is nu echter, dat ik een compile error krijg dat m_hInstance en m_szNoteBackground niet toegankelijk zijn vanuit een static functie. Niks abnormaals. Maar als ik ze dan ook static maak, krijg ik een 'unresolved extrernal symbol' link error.
Dus mijn vraag: Hoe kan ik deze variabelen aanspreken vanuit een static functie? MSDN hielp niet echt veel...

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Nou de member variabelen static maken helpt natuurlijk niet omdat je dan slechts 1 achtergrond kan gebruiken voor alle popups.
Ik heb niet zoveel verstand van de Win32 API. Maar ergens in je class maak je als het goed is een window aan en krijg je een handle voor terug. Deze handle moet je opslaan. Vervolgens zoek je in NoteWndProc door je lijst van pop-ups naar een pop-up die als handle de als parameter meegegeven handle heeft (HWND hWnd).

Verwijderd

Topicstarter
Op maandag 03 december 2001 20:25 schreef Orphix het volgende:
Nou de member variabelen static maken helpt natuurlijk niet omdat je dan slechts 1 achtergrond kan gebruiken voor alle popups.

Dat maakt niet zoveel uit. Bovendien heb ik de hInstance ook nodig, en die is wel altijd hetzelfde.

Maar ergens in je class maak je als het goed is een window aan en krijg je een handle voor terug. Deze handle moet je opslaan. Vervolgens zoek je in NoteWndProc door je lijst van pop-ups naar een pop-up die als handle de als parameter meegegeven handle heeft (HWND hWnd).


Uhm.. ja.. de code werkte al voorheen, maar nu ben ik hem in classes aan het gieten.
Probleem is dus toegang krijgen tot die (static) variabelen vanuit de static functie.

maar toch bedankt :)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23:59
Een helper functie maken waarbij je je objecten registreert en die de callback functie bevat, en forward naar je objecten?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
hmm heb het opgelost op een ietswat vuile manier vind ik.

in de classfile:
code:
1
2
extern HINSTANCE hInstance
extern LPCTSTR szNoteback

in de main file:
code:
1
2
3
4
5
6
7
8
HINSTANCE hInstance;
LPCTSTR szNoteback;

void Init()
{
 hInstance = .. ;
 szNoteback = MAKEINTRESOURCE( .. );
}

Dit kan ongetwijfeld mooier denk ik toch ?
Iemand nog suggesties ?

Verwijderd

Topicstarter
Heb dus betere oplossing gevonden
Heb de "this" pointer in de GWL_USERDATA van de window gestopt. Vervolgens deze weer opgevraagd in de WindowProc, en heb op die manier toegang tot de member vars gekregen.
Dit draadje mag dicht voor mij :)

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op maandag 03 december 2001 21:18 schreef SpHeaRe het volgende:
Heb dus betere oplossing gevonden
Heb de "this" pointer in de GWL_USERDATA van de window gestopt. Vervolgens deze weer opgevraagd in de WindowProc, en heb op die manier toegang tot de member vars gekregen.
Dit draadje mag dicht voor mij :)
Dat is dus ongeveer wat ik probeerde duidelijk te maken :Y)

Verwijderd

Topicstarter
Op maandag 03 december 2001 21:48 schreef Orphix het volgende:

[..]

Dat is dus ongeveer wat ik probeerde duidelijk te maken :Y)
argh sorry. |:(
Je omschrijving was me niet echt duidelijk :)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op maandag 03 december 2001 21:18 schreef SpHeaRe het volgende:
Heb dus betere oplossing gevonden
Heb de "this" pointer in de GWL_USERDATA van de window gestopt. Vervolgens deze weer opgevraagd in de WindowProc, en heb op die manier toegang tot de member vars gekregen.
Dit draadje mag dicht voor mij :)
Waarom stop je de member niet gewoon in de GWL_USERDATA?
Scheelt je een dereference.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Op dinsdag 04 december 2001 16:53 schreef MSalters het volgende:

[..]

Waarom stop je de member niet gewoon in de GWL_USERDATA?
Scheelt je een dereference.
Dan kan ik de andere members ook aanspreken.

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Op maandag 03 december 2001 21:18 schreef SpHeaRe het volgende:
Heb dus betere oplossing gevonden
Heb de "this" pointer in de GWL_USERDATA van de window gestopt. Vervolgens deze weer opgevraagd in de WindowProc, en heb op die manier toegang tot de member vars gekregen.
Dit draadje mag dicht voor mij :)
Wat in dit geval netter is, is om de windows procedure, geheel los van de class te definiëren.

In de create functie maak je je object aan, dit sla je op met SetWindowLong.

Waarom? Nu kun je alleen nog maar bij de public interface komen van de class. Message handling is iets wat buiten het object valt. Op basis van de messages wordt je object aangestuurd, dat wel.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23:59
The - DDD schreef het volgende:
Wat in dit geval netter is, is om de windows procedure, geheel los van de class te definiëren.

In de create functie maak je je object aan, dit sla je op met SetWindowLong.
Een helper functie maken waarbij je je objecten registreert en die de callback functie bevat, en forward naar je objecten?
Hmmm...lijkt dit niet erg veel op elkaar ? :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Op dinsdag 04 december 2001 23:08 schreef The - DDD het volgende:
Wat in dit geval netter is, is om de windows procedure, geheel los van de class te definiëren.

In de create functie maak je je object aan, dit sla je op met SetWindowLong.
Zoiets als ditdus (Schaamteloos uit de platform sdk gehaalt, maar altijd handig stukje code om te hebben)

Zelfde truc is ook uit te halen met Threadfuncties waar je de this pointer in de lParam kan dumpen overigens.

Verwijderd

Topicstarter
Hmm erg interessant allemaal.
Ga ik zeker eens proberen :)

.edit

Die code (uit het linkje) ziet er idd veel netter uit.
tnx
Pagina: 1