Listing 3: Sample application

#include <windows.h>
#include <windowsx.h>
#include "WndObj.h"

CMainWindow::CMainWindow()
{
    //Override class name and style attributes.
    _pszClassName = "CMainWindow";
    _pszTitle = "My Window";
    _dwStyle = WS_OVERLAPPEDWINDOW | WS_VISIBLE;
    _WndClass.style |= CS_HREDRAW | CS_VREDRAW;
}

CChildWindow::CChildWindow()
{
    //Override class name and style attributes.
    _pszClassName = "CChildWindow";
    _dwStyle |= WS_CHILD;
}

LRESULT CChildWindow::WindowProc(HWND hwnd, UINT msg,
      WPARAM wParam, LPARAM lParam, PBOOL pbProcessed)
{
    //call base class first.
    LRESULT lResult = CMainWindow::WindowProc(hwnd, msg, wParam,
        lParam, pbProcessed);
    BOOL bWasProcessed = *pbProcessed;
    *pbProcessed = TRUE;

    switch(msg)
    {
        HANDLE_MSG(hwnd, WM_DESTROY, OnDestroy);
        HANDLE_MSG(hwnd, WM_PAINT, OnPaint);

    default:
        //We did not process the message.
        //Indicate whether the base class's handler did.
        *pbProcessed = bWasProcessed;
        return lResult;
    }
}

void CChildWindow::OnDestroy(HWND hwnd)
{
    PostQuitMessage(0);
}

void CChildWindow::OnPaint(HWND hwnd)
{
    RECT rect;
    HDC hDC = GetDC(hwnd);
    PAINTSTRUCT PaintStruct;
    BeginPaint(hwnd, &PaintStruct);
    GetClientRect(hwnd, &rect);
    DrawText(hDC, "Hello, Object-Oriented World!", 29, &rect,
             DT_VCENTER | DT_CENTER | DT_SINGLELINE);
    EndPaint(hwnd, &PaintStruct);
    ReleaseDC(hwnd, hDC);
}