// 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