Hey,
Dla pewności chciałem się jeszcze zapytać o taką rzecz dot. WinApi:
jeśli mam klasę Window w której mam statyczną uniwersalną procedurę okna typu static LRESULT CALLBACK CommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); której celem jest pobranie wskaźnika do obiektu klasy Window i z niej wywołanie indywidualnej procedury, która jest virtualna to czy ta virtualna procedura musi mieć również "dodatek" CALLBACK i mieć taką samą ilość parametrów?
Czy może to być zwykła funkcja typu:
virtual LRESULT WinProc(UINT message, WPARAM wParam, LPARAM lParam); //bez CALLBACK oraz przekazanie 3 parametrów (bez HWND hwnd, które jest dostępne z poziomu klasy)

Cały kod uniwersalnej procedury wygląda tak (wersja zaproponowana przez @Azarien ):

LRESULT CALLBACK Window::CommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
	{

	if(message == WM_NCCREATE)
		{
		Window *current_window = (Window*)(((CREATESTRUCT*)lParam)->lpCreateParams);
		SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)current_window);
		}

	Window *current_window = (Window*)GetWindowLongPtr(hWnd, GWLP_USERDATA);
	if(current_window)
		return current_window->WndProc(hWnd, message, wParam, lParam);
	else
		return DefWindowProc(hWnd, message, wParam, lParam);
	}