CLIENT.CPP
/* 
 * CLIENT.CPP 
 * Patron Chapter 22 
 * 
 * Implementation of the CPatronClient class that just makes sure 
 * we get a CPatronDoc on doc creation and that we initialize fully. 
 * 
 * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved 
 * 
 * Kraig Brockschmidt, Microsoft 
 * Internet  :  kraigb@microsoft.com 
 * Compuserve:  >INTERNET:kraigb@microsoft.com 
 */ 
 
 
#include "patron.h" 
 
 
/* 
 * CPatronClient::CPatronClient 
 * CPatronClient::~CPatronClient 
 * 
 * Constructor Parameters: 
 *  hInst           HINSTANCE of the application. 
 *  pFR             PCFrame to the frame object. 
 */ 
 
CPatronClient::CPatronClient(HINSTANCE hInst, PCFrame pFR) 
    : CClient(hInst, pFR) 
    { 
    return; 
    } 
 
 
CPatronClient::~CPatronClient(void) 
    { 
    return; 
    } 
 
 
 
 
 
/* 
 * CPatronClient::CreateCDocument 
 * 
 * Purpose: 
 *  Constructs a new document specific to the application. 
 * 
 * Parameters: 
 *  None 
 * 
 * Return Value: 
 *  PCDocument      Pointer to the new document object. 
 */ 
 
PCDocument CPatronClient::CreateCDocument(void) 
    { 
    return (PCDocument)(new CPatronDoc(m_hInst, m_pFR, m_pAdv)); 
    } 
 
 
 
//CHAPTER22MOD 
/* 
 * CPatronClient::SetMenu 
 * 
 * Purpose: 
 *  Changes the frame-level menu, isolating the rest of the 
 *  application from MDI/SDI considerations. 
 * 
 * Parameters: 
 *  hWndFrame       HWND of the frame window. 
 *  hMenu           HMENU to set in the frame for the current 
 *                  document. 
 *  hMenuWin        HMENU of the window menu. 
 * 
 * Return Value: 
 *  None 
 */ 
 
void CPatronClient::SetMenu(HWND hWndFrame, HMENU hMenu 
    , HMENU hMenuWin) 
    { 
   #ifdef MDI 
     MDISETMENU(m_hWnd, hMenu, hMenuWin); 
     MDIREFRESHMENU(m_hWnd); 
   #else 
    if (NULL!=hMenu) 
        ::SetMenu(hWndFrame, hMenu); 
   #endif 
 
    DrawMenuBar(hWndFrame); 
    return; 
    } 
 
 
 
 
 
/* 
 * CPatronClient::MoveWithoutFamily 
 * 
 * Purpose: 
 *  This specific in-place activation function applies moves the 
 *  client window but to leave all child windows within it exactly 
 *  where they are to keep in-place objects in the same absolute 
 *  screen position. 
 * 
 * Parameters: 
 *  prc             LPRECT containing the new space for the client 
 *  dx, dy          ints specifying how much to move the client 
 * 
 * Return Value: 
 *  None 
 */ 
 
void CPatronClient::MoveWithoutFamily(LPRECT prc, int dx, int dy) 
    { 
    RECT        rc; 
    HWND        hWndFrame; 
    HWND        hWnd; 
    POINT       pt; 
 
    hWndFrame=GetParent(m_hWnd); 
    SendMessage(hWndFrame, WM_SETREDRAW, FALSE, 0L); 
 
    ShowWindow(m_hWnd, SW_HIDE); 
    SetWindowPos(m_hWnd, NULL, prc->left, prc->top 
        , prc->right-prc->left, prc->bottom-prc->top 
        , SWP_NOZORDER | SWP_NOACTIVATE); 
 
    //Move all children of the client 
    hWnd=GetWindow(m_hWnd, GW_CHILD); 
 
    while (NULL!=hWnd) 
        { 
        GetWindowRect(hWnd, &rc); 
        SETPOINT(pt, rc.left, rc.top); 
        ScreenToClient(m_hWnd, &pt); 
 
        if (pt.x!=dx && pt.y!=dy && !IsZoomed(hWnd)) 
            { 
            //Move window in the opposite direction as the client 
            SetWindowPos(hWnd, NULL, pt.x-dx, pt.y-dy 
                , rc.right-rc.left, rc.bottom-rc.top 
                , SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE); 
            } 
 
        hWnd=GetWindow(hWnd, GW_HWNDNEXT); 
        } 
 
    SendMessage(hWndFrame, WM_SETREDRAW, TRUE, 0L); 
    ShowWindow(m_hWnd, SW_SHOW); 
 
    return; 
    } 
 
 
 
/* 
 * CPatronClient::CallContextHelpOnDocuments 
 * 
 * Purpose: 
 *  Calls IOleInPlaceUIWindow->ContextSensitiveHelp for each 
 *  document window as required in an MDI container.  This does 
 *  nothing in SDI. 
 * 
 * Parameters: 
 *  fEnterMode      BOOl to pass to the documents 
 * 
 * Return Value: 
 *  None 
 */ 
 
void CPatronClient::CallContextHelpOnDocuments(BOOL fEnterMode) 
    { 
    LPOLEINPLACEUIWINDOW    pUIWin; 
    HWND                    hWndT; 
    PCPatronDoc             pDoc; 
 
    //Loop through the documents calling their functions. 
    hWndT=GetWindow(m_hWnd, GW_CHILD); 
 
    for ( ; hWndT; hWndT=GetWindow(hWndT, GW_HWNDNEXT)) 
        { 
        //Skip if icon title window 
        if (NULL!=GetWindow(hWndT, GW_OWNER)) 
            continue; 
 
        pDoc=(PCPatronDoc)SendMessage(hWndT, DOCM_PDOCUMENT 
            , 0, 0L); 
 
        if (NULL==pDoc) 
            continue; 
 
        pDoc->QueryInterface(IID_IOleInPlaceUIWindow 
            , (PPVOID)&pUIWin); 
 
        if (NULL==pUIWin) 
            continue; 
 
        pUIWin->ContextSensitiveHelp(fEnterMode); 
        pUIWin->Release(); 
        } 
 
    return; 
    } 
 
 
//End CHAPTER22MOD