Newsgroup: it.comp.lang.c++
Titolo: classi con funzioni esterne

Salve,
ho il seguente problema:
ho creato una classe A contenente delle finestre,
queste finestre per essere create hanno bisogno di una funzione predefinita 
del tipo:
LRESULT CALLBACK WinProc(HWND Finestra, UINT Messaggio, WPARAM Parametro1, 
LPARAM Parametro2)
per questo motivo queste funzioni non le posso mettere nella classe 
altrimenti mi ritrovo con un errore del tipo:
impossibile convertire da 'LRESULT (__stdcall 
nomeclasse::* )(HWND,UINT,WPARAM,LPARAM)' a 'WNDPROC'
il problema è che queste funzioni gestiscono il comportamento delle finestre 
quindi devono conoscere la classe, cioè devo fare qualcosa del tipo se è 
premuto un pulsante allora devo eseguire la funzione PremutoPulsante() 
dichiarate nella classe.
Ora, se dichiaro la funzione WinProc nella classe come statica, mi conosce 
tutti i membri e viene accettata per la costruzione delle finestre, ma poi 
mi ritrovo un errore del tipo "PremutoPulsante() non è statica ma viene 
chiamata da una funzione statica".
In pratica devo fare qualcosa del tipo:
WinProc
{
    // devo riuscire ad usare i mebri della classe
}
class A
{
    // uso WinProc così com'è
};
// Dichiaro un'istanza della classe
A pippo;
L'unica soluzione che mi è venuta in mente è creare delle funzioni generiche 
esterne alla classe che conoscano pippo. Quindi da WinProc posso fare 
pippo.PremutoPulsante();
Il problema è che questo va bene se so già di dover creare solo pippo, ma se 
voglio creare anche pluto?
Idee? 

non ricordo bene perchè è molto tempo che non li uso, ad ogni modo...
dovresti poter setare il puntatore all' oggetto che controlla la
finestra (che nel tuo caso sarà di classe A) attraverso SetWindowLong
e poi recuperarlo all'interno della funzione WinProc attraverso
GetWindowLong
In questo modo riesci a
- ad associare all'handle della finestra il puntatore dell'oggetto che
la deve controllare (tramite SetWindowLong, o forse direttamente nella
funzione che costruisce la finestra ... una cosa tipo CreateWindowEx)
- passare dall'handle della finestra al puntatore all'oggetto (tramite
GetWindowLong)
prova a googlare un po' con questi termini: SetWindowLong,
GetWindowLong, CreateWindowEx
ciao,
Marco
P.S. ... forse l'argomento centra più con
it.comp.programmare.win32 ...

 chiamata da una funzione statica".
Delle API di Windows non so niente e in questo newsgroup sono OT.
Pero' di solito in questi casi la funzione mette a disposizione un
parametro user defined che si puo' usare per passare informazioni alla
callback, come l'oggetto corrente.
Ciao,
Nicola

 In pratica devo fare qualcosa del tipo:
Sei OT, ma...
class Window
{
public:
	static LRESULT CALLBACK StaticWindowProc(
		HWND hwnd,
		UINT uMsg,
		WPARAM wParam,
		LPARAM lParam)
	{
		Window *Temp = GetWindowLongPtr(hwnd, GWLP_USERDATA) ;
		return Temp->WindowProc(hwnd, uMsg, wParam, lParam) ;
	}
	LRESULT CALLBACK WindowProc(
		HWND hwnd,
		UINT uMsg,
		WPARAM wParam,
		LPARAM lParam)
	{
		// la solita roba
	}
} ;
...scritto di getto, non son sicuro che compili ma il metodo č questo.

 ....scritto di getto, non son sicuro che compili ma il metodo è questo.
Meglio usare le SetProp(), GetProp() e RemoveProp().
Ciao