145 lines
4.6 KiB
C++
145 lines
4.6 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// 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));
|
|
}
|
|
}
|
|
|
|
|