I have taken working procedural code and tried to object orient it, all i really changed was instead of executing global methods i execute class members. i have made sure that works, i have tried procedural code executing those class members, it works. the only thing i really changed was making my WndProc static, and passing (void* this) to it as the LPVOID param, then casting it back. i think my problem is maybe in my WndProc method, but i don't know what it is. I have tried making my WndProc call MessageBox() and create a message box that tells that it was entered, i read that WndProc is called before CreateWindowEx or CreateWindow returns so, those messageboxes should appear, but they aren't so i can only assume that therin lies my problem. here is my WndProc: LRESULT CALLBACK GLWindow::WndProc(HWND hWnd, LPARAM lParam, WPARAM wParam, UINT uMsg) { // GLWindow is my window class, i am trying to create a wrapper to create openGL windows GLWindow* pWnd; if (uMsg == WM_NCCREATE) { MessageBox(hWnd,"WM_NCCREATE","WndProc Message",MB_OK | MB_ICONINFORMATION); assert(((LPCREATESTRUCT(lParam))->lpCreateParams)); SetWindowLong(hWnd, GWL_USERDATA, (long)((LPCREATESTRUCT(lParam))->lpCreateParams)); } else if (uMsg == WM_CREATE) { MessageBox(hWnd,"WM_CREATE","WndProc Message",MB_OK | MB_ICONINFORMATION); assert(((LPCREATESTRUCT(lParam))->lpCreateParams)); SetWindowLong(hWnd, GWL_USERDATA, (long)((LPCREATESTRUCT(lParam))->CreateParams)); } pWnd = GetGLWindowPtr(hWnd); if (pWnd != NULL) return pWnd->MsgHandler(hWnd, uMsg, wParam, lParam, pWnd); else return DefWindowProc(hWnd, uMsg, wParam, lParam); } can you see my problem? -Matt