📄 patron.cpp
字号:
/*
* PATRON.CPP
* Patron Chapter 24
*
* WinMain which is all we need for the basic application.
*
* Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
*
* Kraig Brockschmidt, Microsoft
* Internet : kraigb@microsoft.com
* Compuserve: >INTERNET:kraigb@microsoft.com
*/
#define INITGUIDS
#include "patron.h"
ULONG g_cObj=0;
ULONG g_cLock=0;
HWND g_hWnd=NULL;
BOOL g_fUser=TRUE;
/*
* The in-place site needs to have access to the frame and its
* IOleInPlaceFrame interface. A global, pardon me, is the simplest
* way to achieve this.
*/
PCPatronFrame g_pFR;
/*
* WinMain
*
* Purpose:
* Main entry point of application. Should register the app class
* if a previous instance has not done so and do any other one-time
* initializations.
*/
int PASCAL WinMain (HINSTANCE hInst, HINSTANCE hPrev
, LPSTR pszCmdLine, int nCmdShow)
{
PCPatronFrame pFR;
FRAMEINIT fi;
WPARAM wRet=0;
SETMESSAGEQUEUE;
//Attempt to allocate and initialize the application
pFR=new CPatronFrame(hInst, hPrev, pszCmdLine, nCmdShow);
if (NULL==pFR)
return -1;
g_pFR=pFR;
fi.idsMin=IDS_FRAMEMIN;
fi.idsMax=IDS_FRAMEMAX;
fi.idsStatMin=IDS_STATMESSAGEMIN;
fi.idsStatMax=IDS_STATMESSAGEMAX;
fi.idStatMenuMin=ID_MENUFILE;
fi.idStatMenuMax=ID_MENUHELP;
fi.iPosWindowMenu=WINDOW_MENU;
fi.cMenus=CMENUS;
fi.x=CW_USEDEFAULT;
fi.y=CW_USEDEFAULT;
fi.cx=CW_USEDEFAULT;
fi.cy=CW_USEDEFAULT;
//If we can initialize pFR, start chugging messages
if (pFR->Init(&fi))
wRet=pFR->MessageLoop();
delete pFR;
return wRet;
}
/*
* ObjectDestroyed
*
* Purpose:
* Function for the Patron Document object to call when it gets
* destroyed. We destroy the main window if the proper conditions
* are met for shutdown.
*/
void ObjectDestroyed(void)
{
g_cObj--;
//No more objects, no locks, no user control, shut the app down.
if (0==g_cObj && 0==g_cLock && IsWindow(g_hWnd) && !g_fUser)
PostMessage(g_hWnd, WM_CLOSE, 0, 0L);
return;
}
/*
* CPatronFrame::CPatronFrame
* CPatronFrame::~CPatronFrame
*
* Constructor Parameters:
* hInst HINSTANCE from WinMain
* hInstPrev HINSTANCE from WinMain
* pszCmdLine LPSTR from WinMain
* nCmdShow int from WInMain
*/
CPatronFrame::CPatronFrame(HINSTANCE hInst, HINSTANCE hInstPrev
, LPSTR pszCmdLine, int nCmdShow)
: CFrame(hInst, hInstPrev, pszCmdLine, nCmdShow)
{
m_fInitialized=FALSE;
m_pIClassDataTran=NULL;
m_pDocCreated=NULL;
m_fEmbedding=FALSE;
m_dwRegCO=0;
m_pIClassFactory=NULL;
m_cRef=0;
m_hAccelIP=NULL;
m_hWndObj=NULL;
m_hMenuOrg=NULL;
m_hMenuTop=NULL;
m_fOurToolsShowing=TRUE;
m_fInContextHelp=FALSE;
m_pIOleIPActiveObject=NULL;
return;
}
CPatronFrame::~CPatronFrame(void)
{
//Opposite of CoRegisterClassObject, takes class factory ref to 1
if (0L!=m_dwRegCO)
CoRevokeClassObject(m_dwRegCO);
//This should be the last Release, which frees the class factory.
ReleaseInterface(m_pIClassFactory);
if (NULL!=m_pIClassDataTran)
{
m_pIClassDataTran->LockServer(FALSE);
m_pIClassDataTran->Release();
}
OleFlushClipboard();
if (m_fInitialized)
OleUninitialize();
return;
}
/*
* CPatronFrame::Init
*
* Purpose:
* Call OleInitialize then calling down into the base class
* initialization.
*
* Parameters:
* pFI PFRAMEINIT containing initialization
* parameters.
*
* Return Value:
* BOOL TRUE if initialization succeeded,
* FALSE otherwise.
*/
BOOL CPatronFrame::Init(PFRAMEINIT pFI)
{
HRESULT hr;
BOOL fRet;
CHECKVER_OLE;
if (FAILED(OleInitialize(NULL)))
return FALSE;
m_fInitialized=TRUE;
//Lock the data transfer object factory as an optimization.
hr=CoGetClassObject(CLSID_DataTransferObject
, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory
, (PPVOID)&m_pIClassDataTran);
if (SUCCEEDED(hr))
m_pIClassDataTran->LockServer(TRUE);
//Check for command line flags
ParseCommandLine();
if (NULL!=m_ppszCmdArgs)
{
if(0==lstrcmpi(m_ppszCmdArgs[0], TEXT("-Embedding"))
|| 0==lstrcmpi(m_ppszCmdArgs[0], TEXT("/Embedding")))
m_fEmbedding=TRUE;
}
g_fUser=!m_fEmbedding;
if (m_fEmbedding)
{
HRESULT hr;
m_pIClassFactory=new CLinkClassFactory(this);
if (NULL==m_pIClassFactory)
return FALSE;
//Since we hold on to this, we should AddRef it.
m_pIClassFactory->AddRef();
hr=CoRegisterClassObject(CLSID_PatronPages, m_pIClassFactory
, CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE, &m_dwRegCO);
if (FAILED(hr))
return FALSE;
}
//Load in-place accelerators
m_hAccelIP=LoadAccelerators(m_hInst
, MAKEINTRESOURCE(IDR_INPLACEACCELERATORS));
if (NULL==m_hAccelIP)
return FALSE;
fRet=CFrame::Init(pFI);
m_hMenuOrg=GetMenu(m_hWnd);
return fRet;
}
/*
* CPatronFrame::CreateCClient
*
* Purpose:
* Constructs a new client specific to the application.
*
* Parameters:
* None
*
* Return Value:
* PCClient Pointer to the new client object.
*/
PCClient CPatronFrame::CreateCClient(void)
{
return (PCClient)(new CPatronClient(m_hInst, this));
}
/*
* CPatronFrame::RegisterAllClasses
*
* Purpose:
* Registers all classes used in this application.
*
* Parameters:
* None
*
* Return Value:
* BOOL TRUE if registration succeeded, FALSE otherwise.
*/
BOOL CPatronFrame::RegisterAllClasses(void)
{
WNDCLASS wc;
//First let the standard frame do its thing
if (!CFrame::RegisterAllClasses())
return FALSE;
//We need double-clicks now and for object activation.
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wc.hInstance = m_hInst;
wc.cbClsExtra = 0;
wc.lpfnWndProc = PagesWndProc;
wc.cbWndExtra = CBPAGESWNDEXTRA;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE+1);
wc.lpszMenuName = NULL;
wc.lpszClassName = SZCLASSPAGES;
if (!RegisterClass(&wc))
return FALSE;
return TRUE;
}
/*
* CPatronFrame::PreShowInit
*
* Purpose:
* Called from Init before intially showing the window. We do
* whatever else we want here, modifying m_nCmdShow as necessary
* which affects ShowWindow in Init.
*
* Parameters:
* None
*
* Return Value:
* BOOL TRUE if this successful, FALSE otherwise.
*/
BOOL CPatronFrame::PreShowInit(void)
{
//Base class does nothing
CFrame::PreShowInit();
//Save the window handle for shutdown if necessary.
g_hWnd=m_hWnd;
//If we're -Embedding, don't show the window initially.
if (m_fEmbedding)
m_nCmdShow=SW_HIDE;
return TRUE;
}
/*
* CPatronFrame::OnCommand
*
* Purpose:
* WM_COMMAND handler for the Patron frame window that processes
* extra File menu items as well as the Page menu.
*
* Parameters:
* hWnd HWND of the frame window.
* wParam WPARAM of the message.
* lParam LPARAM of the message.
*
* Return Value:
* LRESULT Return value for the message.
*/
LRESULT CPatronFrame::OnCommand(HWND hWnd, WPARAM wParam
, LPARAM lParam)
{
PCPatronDoc pDoc;
//CHAPTER24MOD
BOOL fTemp;
//End CHAPTER24MOD
COMMANDPARAMS(wID, wCode, hWndMsg);
/*
* Don't bother with anything during first initialization,
* skipping many toolbar notifications.
*/
if (m_fInit)
return 0L;
pDoc=(PCPatronDoc)m_pCL->ActiveDocument();
//Also check for the open command now too.
if (NULL!=pDoc && ((IDM_VERBMIN <= wID) && (IDM_VERBMAX >= wID)
|| IDM_OPENOBJECT==wID))
{
MSG msg;
DWORD dw;
LONG iVerb=(long)(wID-IDM_VERBMIN);
//Include a message for in-place objects.
msg.hwnd=NULL;
msg.message=WM_COMMAND;
msg.wParam=wParam;
msg.lParam=lParam;
msg.time=GetMessageTime();
dw=GetMessagePos();
SETPOINT(msg.pt, LOWORD(dw), HIWORD(dw));
if (IDM_OPENOBJECT==wID)
iVerb=OLEIVERB_OPEN;
pDoc->ActivateObject(iVerb, &msg);
return 0L;
}
switch (wID)
{
case IDM_FILEPRINT:
pDoc->Print(m_hWnd);
return 0L;
case IDM_FILEPRINTERSETUP:
pDoc->PrinterSetup(m_hWnd, FALSE);
return 0L;
case IDM_EDITPASTESPECIAL:
pDoc->PasteSpecial(m_hWnd);
return 0L;
case IDM_EDITDELETEOBJECT:
pDoc->Delete();
return 0L;
case IDM_EDITINSERTOBJECT:
pDoc->InsertObject(m_hWnd);
return 0L;
case IDM_EDITCONVERT:
pDoc->ConvertObject(m_hWnd);
return 0L;
case IDM_EDITLINKS:
pDoc->EditLinks(m_hWnd);
return 0L;
//CHAPTER24MOD
case IDM_EDITOBJECTEVENTS:
pDoc->AssignEvents(m_hWnd);
break;
//End CHAPTER24MOD
case IDM_PAGENEWPAGE:
pDoc->NewPage();
break;
case IDM_PAGEDELETEPAGE:
pDoc->DeletePage();
break;
case IDM_PAGENEXTPAGE:
pDoc->NextPage();
break;
case IDM_PAGEPREVIOUSPAGE:
pDoc->PreviousPage();
break;
case IDM_PAGEFIRSTPAGE:
pDoc->FirstPage();
break;
case IDM_PAGELASTPAGE:
pDoc->LastPage();
break;
case IDM_PAGESHOWOBJECTS:
{
BOOL fTemp;
//First get the current state, then toggle it.
fTemp=pDoc->ShowOrQueryObjectTypes(TRUE, FALSE);
pDoc->ShowOrQueryObjectTypes(FALSE, !fTemp);
}
break;
//CHAPTER24MOD
case IDM_PAGEDESIGNMODE:
fTemp=pDoc->FToggleOrQueryDesignMode(TRUE, FALSE);
pDoc->FToggleOrQueryDesignMode(FALSE, !fTemp);
break;
case IDM_PAGEUIDISABLED:
fTemp=pDoc->FToggleOrQueryUIDead(TRUE, FALSE);
pDoc->FToggleOrQueryUIDead(FALSE, !fTemp);
break;
case IDM_PAGESHOWHATCHHANDLES:
fTemp=pDoc->FToggleOrQueryHatchHandles(TRUE, FALSE);
pDoc->FToggleOrQueryHatchHandles(FALSE, !fTemp);
break;
//End CHAPTER24MOD
case IDM_ENTERCONTEXTHELP:
case IDM_ESCAPECONTEXTHELP:
//Notify the object on entry and exit.
ContextSensitiveHelp(IDM_ENTERCONTEXTHELP==wID);
break;
default:
return CFrame::OnCommand(hWnd, wParam, lParam);
}
return 0L;
}
/*
* CPatronFrame::CreateToolbar
*
* Purpose:
* Procedure to create all the necessary toolbar buttons.
*
* Parameters:
* None
*
* Return Value:
* UINT Number of tools added to the bar.
*/
UINT CPatronFrame::CreateToolbar(void)
{
UINT iLast;
UINT uState=GIZMO_NORMAL;
UINT utCmd =GIZMOTYPE_BUTTONCOMMAND;
//Insert the standard ones.
iLast=CFrame::CreateToolbar();
//Remove Undo: we don't use it.
m_pTB->Remove(IDM_EDITUNDO);
/*
* Insert Print File Import in the 5th position and account
* for it in iLast.
*/
m_pTB->Add(utCmd, 4, IDM_FILEPRINT, m_dxB, m_dyB
, NULL, NULL, 6, uState);
iLast++;
m_pTB->Add(GIZMOTYPE_SEPARATOR, iLast++, 0, 6, m_dyB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -