Newsgroup: it.comp.programmare.win32
Titolo: Puntatori a funzioni membro

Salve a tutti,
stavo scrivendo una classe che creava una finestra window, ma ho avuto dei
problemi...
Nel costruttore della classe creo la finestra tramite la funzione
CreateWindow, e proprio quì ho dei problemi:
{
  WndClass.style         = CS_DBLCLKS | CS_SAVEBITS;
  WndClass.lpfnWndProc   = (WNDPROC)ProcFin;
  WndClass.cbClsExtra    = 0 ;
  WndClass.cbWndExtra    = 0 ;
  WndClass.hInstance     = hInstance ;
  WndClass.hIcon         = NULL;
  WndClass.hCursor       = NULL;
  WndClass.hbrBackground = NULL;
  WndClass.lpszMenuName  = NULL;
  WndClass.lpszClassName = "Window" ;
  RegisterClass(&WndClass);
  PWin = CreateWindow("Window", "Main Window", NULL, 0, 0, 0, 0, NULL, NULL,
hInstance, NULL);
 ...
}
La struttura WndClass ha bisogno dell'indirizzo di una funzione WNDPROC da
chiamare quando arrivano dei messaggi alla finestra.
ProcFin è una funzione WNDPROC dichiarata all'intero della classe.
Al secondo rigo mi dà questo errore:
error C2440: "cast di tipo": impossibile convertire da "overloaded-function"
a "WNDPROC"
        Nessuna delle funzioni dell'ambito corrente aventi questo nome
corrisponde al tipo di destinazione
Più o meno riesco a capire il perchè, ossia perchè finchè non viene
istanziato nessun oggetto della mia classe quella funzione è come se non
esistesse. In pratica non saprebbe quale funzione chiamare riferita a un
particolare oggetto.
Ho quindi sostituito ProcFin con this->ProcFin, sperando che la cosa
funzionasse... :-( purtroppo no!
Come posso fare?
Ho avuto lo stesso problema per creare dei thread su delle funzioni membro,
ma ero riuscito a risolvere in questo modo quì:
Dichiaro friend la funzione ausiliaria affinchè possa accedere a FunzThread
che è privata.
class Pippo
{  friend void RunFunzThread(Pippo *);
    private:
   void FunzThread();
}
Nel costruttore creo il thread lanciando la funzione ausiliaria passandogli
come parametro il puntatore all'oggetto corrente
Pippo::Pippo
(
)
{
  CreateThread(.... ..., RunFunzThread, this, .... ....);
}
Questa è la funzione membro della classe che dovrebbe essere eseguita in
thread
void Pippo::FunzThread
(
)
{  .....
}
La funzione ausiliaria lancia la funzione membro che viene eseguita in un
thread a parte
void RunFunzThread
( Pippo * P
)
{
  P->FunzThread();
}
In questo modo (brutto o meno) sono riuscito a fare ciò che volevo, solo che
non posso farlo nel problema che vi ho posto perchè non posso passare alla
funzione ProcFin il puntatore all'oggetto corrente (deve essere una
WNDPROC)!
Scusate la lunghezza del post, ma volevo spiegarvi bene la situazione...non
so più cosa inventarmi! :-(
Grazie
Giovanni.

Il problema in realtà non è una novità, e anzi, il parametro LPVOID delle
ThreadProc è fatto appositamente allo scopo; comunque ci sono
essenzialmente due soluzioni: la prima è mantenere un array di handles a
tutte le finestre che crei nel tuo progr. e cercare quella giusta ogni
volta che ti viene chiamata la WNDPROC confrontando l'handle di ogni
iterazione con il parametro HWND (credo che sia più o meno la soluzione
optata dai creatori di MFC); la seconda invece consiste nel creare una
WNDCLASS per ciascuna finestra che crei, in modo tale da poter assegnare
una WNDPROC per ciascuna finestra. Questa seconda soluzione comunque non è
applicabile se devi creare tante finestre identiche utilizzando la stessa
WNDCLASS.
Spero di esserti stato chiaro, ciao e buon lavoro.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

ProcFin ?na funzione WNDPROC dichiarata all'intero della classe.
ci ho provato anche io. Sinceramente non sono stato tanto li' a
scervellarmi su come far "mangiare" al compilatore la funzione membro
ma semplicemente ho creato una funzione WNDPROC esterna alla classe
che si trova nello stesso file .cpp (nel mio caso e' tutto in un unico
file .cpp per comodita' nella creazione della DLL che contiente
tutto).
Se riesci a far funzionare tutto con una WNDPROC interna alla classe
fammi sapere.
-- 
Scritto da Gordon
E-mail: tbeqba@_EVZHBIVZV_avpu.vg

 ha scritto nel messaggio
news:ch05h7$ku9$1...@news.newsland.it...

Ti ringrazio per la risposta, in effetti è proprio quello che ho fatto! :-)
Pensavo fosse una soluzione un pò sporca, e invece mi consola sapere che in
questi casi si fa così! :-)
Grazie
Giovanni.

"Gordon" <tbeqba@_EVZHBIVZV_avpu.vg> ha scritto nel messaggio
news:f767j0hfpnj0fufkr...@4ax.com...

Inizialmente avevo fatto come dicevi tu, ma nel momento in cui crei una
seconda istanza della tua classe, questa ti crea un'altra finestra e
l'associa alla stessa WNDPROC!
Se la WNDPROC non interagisce con la classe allora OK, in caso contrario è
un problema invece!
Grazie cmq della risp...
Ciao
Giovanni      :-)

Se la WNDPROC non interagisce con la classe allora OK, in caso contrario ?un problema invece!
terro' presente per sviluppi futuri :)


fammi sapere.
basta dichiararla static.

basta dichiararla static.
Grazie :)
