Newsgroup: it.comp.programmare.win32
Titolo: domanda da newbie (com'è giusto che sia...)

    Salve a tutti. Ho un piccolo prog in cui creo una finestra usando una
WNDCLASSEX e un CreateWindowEx (non so se i nomi sono giusti
ma spero si capisca). Sono riuscito a far funzionare tutto a gonfie vele.
I problemi sono nati quando ho deciso di creare un classe "mywindow"
che contenesse tutto (dalla proc dei messaggi a tutto il resto). Posso
fare in modo da definire esternamente il corpo della proc dei messaggi
(chiamiamola, per esempio, WndProc(...)  ) alla classe (magari con una
virtual) permettendo di registrare correttamente la WNDCLASSEX ?
Come posso fare?? (se avete bisogno del codice da vedere ditemelo
e ve lo mando, non mi sembrava il caso di mandare tutto qui subito).
Grazie
Alan.

 virtual) permettendo di registrare correttamente la WNDCLASSEX ?
Ciao,
premetto che sono alle prime armi con le classi e quindi la mia soluzione
potrebbe non essere la migliore.
Mi sono imbattuto nel tuo stesso problema e l'ho risolto dichiarando la
WndProc come static, di fatto le funzioni dichiarate static all'interno di
una classe non sono altro che funzioni "tradizionali" e quindi non hai
problemi ad assegnare la WndProc alla tua classe.
Attenzione però che per la sua natura di funzione esterna alla classe,
all'interno della WndProc non potrai accedere ai membri della classe
chiamante (di fatto gli unici argomenti accessibili sono quelli passati alla
funzione).
Per eliminare questo inconveniente ti suggerisco di passare il puntatore
this alla creazione della finestra ed associarlo quindi in WM_CREATE alla
finestra stessa con SetWindowLong(..,GWL_USERDATA,..), per richiamarlo
all'interno della WndProc  potrai usare GetWindowLong.
Spero che ti possa essere di aiuto... nell'attesa magari di qualche altra
dritta.
Ciao

 all'interno della WndProc  potrai usare GetWindowLong.
Come faccio a convertire un puntatore (in questo caso alla classe MY_WINDOW)
in un long?? (pensavo facesse una conversione automatica essendo un poi
il puntatore un numero...)
Grazie di nuovo.
Alan

 Alan
Devi usare il Type-cast..
Il compilatore converte automaticamente i numeri da un formato all'altro...
double to int, etc.
Limitadosi a segnalarti  la possibile perdita di dati.
Per i tipi di dati di dubbia interpretazione il compilatore ti richiede una
conversione esplicita e cioè vuole sapere come dovrà essere interpretato il
dato.
Per eseguire il Type-casting basta che fai precedere alla variabile la
scrita (typename) dove typename e il tipo di dati verso cui effettuare la
conversione, nel tuo caso avresti:
SetWindowLong(...,GWL_USERDATA,(LONG) this)    ;
Ciao!!

Ci avevo provato, ma sono talmente stupido da averli messi nel punto
sbagliato...

non mi fa creare la finestra lo stesso!!!
Secondo te dove ho sbagliato??
class SC_WINDOW{
public:
WNDCLASSEX wcex;
int KnX,KnY,KnBpp;
char* Ktitolo;
bool KbFullScreen;
HINSTANCE KhInstance;
LPCSTR KclassName;
HWND KhWnd,KhParentWnd;
RECT WindowRect;
PAINTSTRUCT ps;
HDC hDC;
char temp[20];
char *ptemp;
int dummy;
char szOutput[384];
static LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
SC_WINDOW *me=(SC_WINDOW*)GetWindowLong(hWnd,GWL_USERDATA);
switch (message)
{
case WM_PAINT:
me->Paint();
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam);
};
virtual void Paint(void)
{
};
bool Create(char* titolo, int width, int height, int bpp, bool
fullscreenflag,
HINSTANCE hInstance,LPCSTR className,HWND hParentWnd)
{
hDC=NULL;
temp[0]='\0';
dummy=0;
szOutput[0]
='\0';
KhParentWnd=hParentWnd;
Ktitolo=titolo;
KnX=width;
KnY=height;
KhInstance=hInstance;
KclassName=className;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;//this->WinProc;//(KhWnd,NULL,0,0);
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = KhInstance;
wcex.hIcon = LoadIcon(NULL, IDI_WINLOGO); // Load The Default Icon
wcex.hCursor = LoadCursor(NULL, IDC_ARROW); // Load The Arrow Pointer
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = KclassName;
wcex.hIconSm = NULL;
SetWindowLong(KhWnd,GWL_USERDATA,(long)this);
WindowRect.left=(long)0; // Set Left Value To 0
WindowRect.right=(long)KnX; // Set Right Value To Requested Width
WindowRect.top=(long)0; // Set Top Value To 0
WindowRect.bottom=(long)KnY; // Set Bottom Value To Requested Height
RegisterClassEx(&wcex);
AdjustWindowRectEx(&WindowRect, WS_OVERLAPPEDWINDOW, FALSE, WS_EX_APPWINDOW
| WS_EX_WINDOWEDGE); // Adjust Window To True Requested Size
//SI BLOCCA NELL'IF QUI SOTTO
if (!(KhWnd=CreateWindowEx( WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, KclassName,
Ktitolo,
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW,
0, 0,
WindowRect.right-WindowRect.left,
WindowRect.bottom-WindowRect.top,
KhParentWnd, NULL, KhInstance, NULL)))
{
MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE; // Return FALSE
}
ShowWindow(KhWnd,SW_SHOW);
UpdateWindow(KhWnd);
return true;
}
SC_WINDOW(void)
{
};
~SC_WINDOW(void)
{};
};


Che vuol dire si blocca?
Non ti crea la finestra?
Se č cosě allora chiama GetLastError e vedi cosa č andato storto.
Buon Lavoro



non mi fa creare la finestra lo stesso!!!
Secondo te dove ho sbagliato??
class SC_WINDOW{
public:
WNDCLASSEX wcex;
int KnX,KnY,KnBpp;
char* Ktitolo;
bool KbFullScreen;
HINSTANCE KhInstance;
LPCSTR KclassName;
HWND KhWnd,KhParentWnd;
RECT WindowRect;
PAINTSTRUCT ps;
HDC hDC;
char temp[20];
char *ptemp;
int dummy;
char szOutput[384];
static LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
SC_WINDOW *me=(SC_WINDOW*)GetWindowLong(hWnd,GWL_USERDATA);
switch (message)
{
case WM_PAINT:
me->Paint();
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam);
};
virtual void Paint(void)
{
};

HINSTANCE hInstance,LPCSTR className,HWND hParentWnd)
{
hDC=NULL;
temp[0]='\0';
dummy=0;
szOutput[0]
='\0';
KhParentWnd=hParentWnd;
Ktitolo=titolo;
KnX=width;
KnY=height;
KhInstance=hInstance;
KclassName=className;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;

wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = KhInstance;


wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = KclassName;
wcex.hIconSm = NULL;
SetWindowLong(KhWnd,GWL_USERDATA,(long)this);




RegisterClassEx(&wcex);

//SI BLOCCA NELL'IF QUI SOTTO
if (!(KhWnd=CreateWindowEx( WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, KclassName,
Ktitolo,
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW,
0, 0,
WindowRect.right-WindowRect.left,
WindowRect.bottom-WindowRect.top,
KhParentWnd, NULL, KhInstance, NULL)))
{
