LRESULT Label::WindowProcProxy(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { // Get a 'this' pointer from the window data Label *label = (Label *) GetWindowLongPtr(hWnd, GWLP_THIS); if (message == WM_NCCREATE) { // WM_NCCREATE is our first chance to get our 'this' pointer, which // was passed in to CreateWindowEx label = (Label *) ((LPCREATESTRUCT) lParam)->lpCreateParams; if (label) { // Create is still inside CreateWindowEx, so mWindow hasn't been // assigned. Assign it here so we can use it in the WM_[NC]CREATE // handler. label->mWindow = hWnd; // Put a 'this' pointer in the window data so we can get it later SetWindowLongPtr(hWnd, GWLP_THIS, (LONG_PTR) label); } } if (label) { // Relay the message return label->WindowProc(message, wParam, lParam); } // Any messages sent before WM_NCCREATE wind up here return DefWindowProc(hWnd, message, wParam, lParam); }