//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1994. // // File: cwindow.cxx // // Contents: implementation for a window class // // Classes: CHlprWindow // // Functions: WindowProc // // History: 4-12-94 stevebl Created // //---------------------------------------------------------------------------- #include "cwindow.h" //+--------------------------------------------------------------------------- // // Member: CHlprWindow::Create // // Synopsis: Special version of CreateWindow. // // Arguments: [lpszClassName] - address of registered class name // [lpszWindowName] - address of window name // [dwStyle] - window style // [x] - horizontal position of window // [y] - vertical position of window // [nWidth] - window width // [nHeight] - window height // [hwndParent] - handle of parent or owner window // [hmenu] - handle of menu, or child window identifier // [hinst] - handle of application instance // // Returns: HWND of the created window // // Modifies: _hwnd, _hInstance // // History: 4-12-94 stevebl Created // // Notes: The window class must have been previously registered (as // is normal Windows procedure) and the callback function // must have been registered as ::WindowProc. ::WindowProc will // then forward all messages on to the CHlprWindow::WindowProc // method, allowing the window to directly access class members // (i.e. giving the WindowProc access to the "this" pointer). // //---------------------------------------------------------------------------- HWND CHlprWindow::Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hwndParent, HMENU hmenu, HINSTANCE hinst) { _hInstance = hinst; return(_hwnd = CreateWindow( lpszClassName, lpszWindowName, dwStyle, x, y, nWidth, nHeight, hwndParent, hmenu, hinst, this)); } //+--------------------------------------------------------------------------- // // Function: WindowProc // // Synopsis: Standard WindowProc that forwards Windows messages on to the // CHlprWindow::WindowProc method. // // Arguments: [hwnd] - window handle // [uMsg] - message // [wParam] - first message parameter // [lParam] - second message parameter // // History: 4-12-94 stevebl Created // // Notes: This Window procedure expects that it will receive a "this" // pointer as the lpCreateParams member passed as part of the // WM_CREATE message. It saves the "this" pointer in the // GWL_USERDATA field of the window structure. // //---------------------------------------------------------------------------- LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { CHlprWindow * pw; switch (uMsg) { case WM_CREATE: // Since this is the first time that we can get ahold of // a pointer to the window class object, all messages that might // have been sent before this are never seen by the Windows object // and only get passed on to te DefWindowProc // get a pointer to the window class object pw = (CHlprWindow *) ((CREATESTRUCT *)lParam)->lpCreateParams; // set its USERDATA DWORD to point to the class object SetWindowLong(hwnd, GWL_USERDATA, (long) pw); // Set it's protected _hwnd member variable to ensure that // member functions have access to the correct window handle. pw->_hwnd = hwnd; break; case WM_DESTROY: // This is our signal to destroy the window class object. pw = (CHlprWindow *) GetWindowLong(hwnd, GWL_USERDATA); SetWindowLong(hwnd, GWL_USERDATA, 0); delete pw; pw = (CHlprWindow *) 0; break; default: // get a pointer to the window class object pw = (CHlprWindow *) GetWindowLong(hwnd, GWL_USERDATA); break; } // and call its message proc method if (pw != (CHlprWindow *) 0) { return(pw->WindowProc(uMsg, wParam, lParam)); } else { return(DefWindowProc(hwnd, uMsg, wParam, lParam)); } }