Listing 1: The twindow class


// Article code listings for "C++ Classes for MDI Window
// Management" by Steve Welstead.  Note:  These listings are for
// illustrative purposes only, to accompany the article.
// Complete code for compilation is supplied electronically
// (see page 3 for details)

class twindow {
   public:
   WNDCLASS wndclass;
   HWND hwindow;
   LPCSTR the_title;
   twindow (HINSTANCE hInstance,
       LRESULT CALLBACK window_proc,int window_extra,
       LPCSTR menu_name,LPCSTR title_name,
       LPCSTR class_name,LPCSTR icon_name);
   virtual void register_window_class (void);
   virtual void set_global_ptr (void);
   virtual int respond_wm_create (HWND hwnd);
   virtual int respond_wm_command (WPARAM wParam,
       LPARAM lParam);
   virtual int respond_wm_paint (void);
   virtual int respond_wm_mdiactivate (HWND hwnd,
       WPARAM wParam,LPARAM lParam);
   virtual int respond_wm_size (LPARAM lParam);
   virtual int respond_wm_queryendsession (void);
   virtual int respond_wm_close (void);
   virtual int respond_wm_destroy (HWND hwnd);
   virtual LRESULT CALLBACK default_window_proc
      (HWND hwnd,UINT message,WPARAM wParam,
      LPARAM lParam);
   virtual LRESULT CALLBACK handle_message
      (HWND hwnd,UINT message,WPARAM wParam,
      LPARAM lParam); };

twindow::twindow (HINSTANCE hInstance,
       LRESULT CALLBACK window_proc,int window_extra,
       LPCSTR menu_name,LPCSTR title_name,
       LPCSTR class_name,LPCSTR icon_name) {
   wndclass.style       = CS_HREDRAW | CS_VREDRAW;
   wndclass.lpfnWndProc = (WNDPROC)window_proc;
   wndclass.cbClsExtra  = 0 ;
   wndclass.cbWndExtra  = window_extra ;
   wndclass.hInstance   = hInstance ;
   wndclass.hIcon = LoadIcon (hInstance,icon_name ?
    icon_name : IDI_APPLICATION);
   wndclass.hCursor = LoadCursor (NULL,IDC_ARROW);
   wndclass.hbrBackground =
       (HBRUSH)GetStockObject(WHITE_BRUSH);
   wndclass.lpszMenuName  = menu_name;
   wndclass.lpszClassName = class_name;
   the_title = title_name;
   hwindow = 0;
   }

// Override this in descendants:
void twindow::set_global_ptr (void) {};

void twindow::register_window_class (void) {
     RegisterClass (&wndclass);
     set_global_ptr ();
     }

int twindow::respond_wm_create (HWND hwnd) {
     hwindow = hwnd; return 0;}
int twindow::respond_wm_command (WPARAM,LPARAM) {
     return 0;}
int twindow::respond_wm_paint (){ return 0;}
int twindow::respond_wm_mdiactivate
    (HWND,WPARAM,LPARAM) { return 0;}
int twindow::respond_wm_size (LPARAM) { return 0;}
int twindow::respond_wm_queryendsession () {
     return 0;}
int twindow::respond_wm_close () { return 0;}
int twindow::respond_wm_destroy (HWND) {return 0;}
LRESULT CALLBACK twindow::default_window_proc
    (HWND hwnd,UINT message,WPARAM wParam,
       LPARAM lParam) {
    return (LRESULT CALLBACK) DefWindowProc (hwnd,
      message,wParam,lParam); }

LRESULT CALLBACK twindow::handle_message (HWND hwnd,
   UINT message, WPARAM wParam, LPARAM lParam) {
     // If "respond_..." procedure actually does something,
     // then return, otherwise drop through to default.
     hwindow = hwnd;
     switch (message) {
      case WM_CREATE:
           if (respond_wm_create (hwnd)) return 0;
           break;
      case WM_COMMAND:
           if (respond_wm_command (wParam,lParam))
           return 0; break;
      case WM_PAINT:
           if (respond_wm_paint ()) return 0;
           break;
      case WM_MDIACTIVATE:
           if (respond_wm_mdiactivate(hwnd,
          wParam,lParam)) return 0; break;
      case WM_SIZE:

if (respond_wm_size(lParam))

          return 0; break;
      case WM_QUERYENDSESSION:
           if (respond_wm_queryendsession())
          return 0; break;
      case WM_CLOSE:
           if (respond_wm_close()) return 0;
           break;
      case WM_DESTROY:
           if (respond_wm_destroy(hwnd)) return 0;
           break;
      }  //  end switch
     return default_window_proc (hwindow,message,
     wParam,lParam); }
// End of File