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