⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kyofficectrl.cpp

📁 支持在线编辑的活动文档控件
💻 CPP
字号:
// KyOfficeCtrl.cpp : Implementation of CKyOfficeCtrl

#include "stdafx.h"
#include "KyOffice.h"
#include "MainFrm.h"
#include "CntrItem.h"
#include "DocManagerEx.h"
#include "KyOfficeDoc.h"
#include "KyOfficeView.h"
#include "KyOfficeCtrl.h"
#include "InPlacePrevw.h"


/////////////////////////////////////////////////////////////////////////////
// CKyOfficeCtrl

CKyOfficeCtrl::CKyOfficeCtrl()
{
	m_bWindowOnly		=	TRUE;
	m_szOldUserName		=	_T("");
	m_szWordUserName	=	_T("");
} 

LRESULT CKyOfficeCtrl::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
	// TODO : Add Code for message handler. Call DefWindowProc if necessary.
	CKyOfficeApp * pTheApp = (CKyOfficeApp*)AfxGetApp();
	ASSERT_VALID(pTheApp);

	if(pTheApp->CreateFramework())
		m_pMainFrame = (CMainFrame*)pTheApp->m_pMainWnd;

	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
	{
		m_pMainFrame->ModifyStyle(WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_THICKFRAME, WS_CHILD|WS_CLIPCHILDREN, SWP_FRAMECHANGED|SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_SHOWWINDOW);
		::SetParent(m_pMainFrame->GetSafeHwnd(), m_hWnd);

		m_pMainFrame->SetOfficeCtrl(this);

		CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
		ASSERT_VALID(pActiveView);
		pActiveView->SetOfficeCtrl(this);

		CKyOfficeDoc * pDocument = (CKyOfficeDoc*)m_pMainFrame->GetActiveDocument();
		ASSERT_VALID(pDocument);
		pDocument->SetOfficeCtrl(this);
	}
	return 0;
}

LRESULT CKyOfficeCtrl::OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
	// TODO : Add Code for message handler. Call DefWindowProc if necessary.
	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
		m_pMainFrame->SendMessage(WM_CLOSE);
	return 0;
}

LRESULT CKyOfficeCtrl::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
	// TODO : Add Code for message handler. Call DefWindowProc if necessary.
	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
		m_pMainFrame->MoveWindow(0, 0, LOWORD(lParam), HIWORD(lParam));
	return 0;
}

HRESULT CKyOfficeCtrl::OnDraw(ATL_DRAWINFO& di)
{
	return S_OK;
}

LRESULT CKyOfficeCtrl::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
	// TODO : Add Code for message handler. Call DefWindowProc if necessary.
	//先关闭当前文档
	CloseFile();
	return 0;
}

STDMETHODIMP CKyOfficeCtrl::ShowOpenDialog()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	CKyOfficeApp * pTheApp = (CKyOfficeApp*)AfxGetApp();
	ASSERT_VALID(pTheApp);

	if(m_pMainFrame)
		pTheApp->OnFileOpen();
	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::OpenFile(BSTR bstrFilePath, VARIANT_BOOL * pVal)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	USES_CONVERSION;
	LPCTSTR lpstrPathName = W2A(bstrFilePath);

	CFileStatus st;
	if(CFile::GetStatus(lpstrPathName, st))
	{
		*pVal = AfxGetApp()->OpenDocumentFile(lpstrPathName) != NULL ? VARIANT_TRUE : VARIANT_FALSE;
	}
	else
	{
		CString szText;
		szText.Format("指定的文件 '%s' 不存在!", lpstrPathName);
		AfxMessageBox(szText, MB_OK|MB_ICONERROR);
	}
	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::CloseFile()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
	{
		CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
		ASSERT_VALID(pActiveView);

		CWaitCursor	w;
		pActiveView->DoCloseDocument();
	}

	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::SaveAs(BSTR bstrNewFilePath, VARIANT_BOOL bReplace, VARIANT_BOOL * pVal)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
	{
		CKyOfficeDoc * pDocument = (CKyOfficeDoc*)m_pMainFrame->GetActiveDocument();
		ASSERT_VALID(pDocument);

		USES_CONVERSION;
		LPCTSTR lpstrPathName = W2A(bstrNewFilePath);

		if(pDocument->GetDocItem() != NULL)
		{
			CWaitCursor	w;
			*pVal = pDocument->DoSave(lpstrPathName, bReplace) == TRUE ? VARIANT_TRUE : VARIANT_FALSE;
		}
	}
	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::ShowSaveAsDialog(VARIANT_BOOL bReplace, VARIANT_BOOL *pVal)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
	{
		CKyOfficeDoc * pDocument = (CKyOfficeDoc*)m_pMainFrame->GetActiveDocument();
		ASSERT_VALID(pDocument);

		if(pDocument->GetDocItem() != NULL)
		{
			CWaitCursor	w;
			*pVal = pDocument->DoSave(NULL, bReplace) == TRUE ? VARIANT_TRUE : VARIANT_FALSE;
		}
	}
	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::PrintPreview()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
	{
		CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
		ASSERT_VALID(pActiveView);

		CWaitCursor	w;
		pActiveView->DoFilePrintPreview();
	}
	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::get_Toolbars(VARIANT_BOOL *pVal)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	*pVal = (m_bToolbars == 0) ? VARIANT_FALSE : VARIANT_TRUE;
	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::put_Toolbars(VARIANT_BOOL newVal)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	m_bToolbars = (newVal == VARIANT_FALSE) ? FALSE : TRUE;
	//OnObjectUIChange();
	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
	{
		CKyOfficeDoc * pDocument = (CKyOfficeDoc*)m_pMainFrame->GetActiveDocument();
		ASSERT_VALID(pDocument);

		CKyOfficeCntrItem * pDocItem = pDocument->GetDocItem();
		if(pDocItem != NULL)
		{
			pDocItem->ExecCommand(OLECMDID_HIDETOOLBARS, OLECMDEXECOPT_DODEFAULT);
			TurnOffWebToolbar(pDocItem->m_pInPlaceFrame->m_lpActiveObject);
		}

		m_pMainFrame->RecalcLayout();
	}
	return S_OK;
}

int EvalException(int n_except)
{
  // Trap a few standard errors usually caused by bad
  // passed in data or internal corruption. Other items should 
  // always be passed down the chain to NT or a waiting debugger...
    if ((n_except == STATUS_ACCESS_VIOLATION) ||
		(n_except == STATUS_INTEGER_OVERFLOW) ||
        (n_except == STATUS_INTEGER_DIVIDE_BY_ZERO))   
        return EXCEPTION_EXECUTE_HANDLER;

    return EXCEPTION_CONTINUE_SEARCH;
}

#define E_WIN32_ACCESSVIOLATION   0x800701E7   //HRESULT_FROM_WIN32(ERROR_INVALID_ADDRESS)

STDAPI AutoDispInvoke(LPDISPATCH pdisp, LPOLESTR pwszname, DISPID dspid,
	WORD wflags, DWORD cargs, VARIANT* rgargs, VARIANT* pvtret)
{
    HRESULT    hr;
    DISPID     dspidPut = DISPID_PROPERTYPUT;
    DISPPARAMS dspparm = {NULL, NULL, 0, 0};

	if(pdisp == NULL)
		return E_POINTER;

    dspparm.rgvarg = rgargs;
    dspparm.cArgs = cargs;

	if ((wflags & DISPATCH_PROPERTYPUT) || (wflags & DISPATCH_PROPERTYPUTREF))
	{
		dspparm.rgdispidNamedArgs = &dspidPut;
		dspparm.cNamedArgs = 1;
	}

	__try
	{
		if (pwszname)
		{
			hr = pdisp->GetIDsOfNames(IID_NULL, &pwszname, 1, LOCALE_USER_DEFAULT, &dspid);
			if (FAILED(hr)) return (hr);
		}

        hr = pdisp->Invoke(dspid, IID_NULL, LOCALE_USER_DEFAULT,
            (WORD)(DISPATCH_METHOD | wflags), &dspparm, pvtret, NULL, NULL);

    }
    __except(EvalException(GetExceptionCode()))
    {
        hr = E_WIN32_ACCESSVIOLATION;
    }

    return hr;
}

void CKyOfficeCtrl::TurnOffWebToolbar(LPOLEINPLACEACTIVEOBJECT lpObject)
{
	/*
	MSWord::_ApplicationPtr pApplication = NULL;
	MSWord::_DocumentPtr pDocument = NULL;
	if(lpObject && SUCCEEDED(lpObject->QueryInterface(IID__Document, (void**)&pDocument)))
	{
		CComQIPtr<MSWord::_Application> spApp(pDocument->Application);
		CComPtr < Office::_CommandBars> spCmdBars; 
		if(SUCCEEDED(spApp->get_CommandBars(&spCmdBars)))
		{
			_bstr_t bstrWebName = _T("Web");
			Office::CommandBarPtr pWebbar = spCmdBars->GetItem(bstrWebName);
			if(pWebbar)
				pWebbar->PutVisible(VARIANT_FALSE);
		}
	}
	*/

	IDispatch * pdisp;
	VARIANT    vtT[5];

	if ((lpObject) && (SUCCEEDED(lpObject->QueryInterface(IID_IDispatch, (void**)&pdisp))))
	{
		if (SUCCEEDED(AutoDispInvoke(pdisp, 
				L"CommandBars", 0, DISPATCH_PROPERTYGET, 0, NULL, &vtT[0])))
		{
			ASSERT(vtT[0].vt == VT_DISPATCH);
			vtT[1].vt = VT_BSTR; vtT[1].bstrVal = SysAllocString(L"Web");

			if (SUCCEEDED(AutoDispInvoke(vtT[0].pdispVal, 
				L"Item", 0, DISPATCH_PROPERTYGET, 1, &vtT[1], &vtT[2])))
			{
				ASSERT(vtT[2].vt == VT_DISPATCH);
				vtT[3].vt = VT_BOOL; vtT[3].boolVal = 0;
				AutoDispInvoke(vtT[2].pdispVal, 
					L"Visible", 0, DISPATCH_PROPERTYPUT, 1, &vtT[3], &vtT[2]);
				VariantClear(&vtT[2]);
			}

			VariantClear(&vtT[1]);
			VariantClear(&vtT[0]);
		}

		pdisp->Release();
	}
}

STDMETHODIMP CKyOfficeCtrl::SaveFile(VARIANT_BOOL *pVal)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	*pVal = VARIANT_FALSE;

	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
	{
		CKyOfficeDoc * pDocument = (CKyOfficeDoc*)m_pMainFrame->GetActiveDocument();
		ASSERT_VALID(pDocument);

		*pVal = (pDocument->DoFileSave() == FALSE) ? VARIANT_FALSE : VARIANT_TRUE;
	}
	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::GetPathName(BSTR *pVal)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	*pVal = NULL;

	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
	{
		CKyOfficeDoc * pDocument = (CKyOfficeDoc*)m_pMainFrame->GetActiveDocument();
		ASSERT_VALID(pDocument);

		CString strPathName = pDocument->GetPathName();
		*pVal = strPathName.AllocSysString();
	}

	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::IsOpened(VARIANT_BOOL *pVal)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	*pVal = VARIANT_FALSE;

	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
	{
		CKyOfficeDoc * pDocument = (CKyOfficeDoc*)m_pMainFrame->GetActiveDocument();
		ASSERT_VALID(pDocument);

		CString strPathName = pDocument->GetPathName();
		*pVal = (strPathName.IsEmpty() == FALSE) ? VARIANT_FALSE : VARIANT_TRUE;
	}
	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::IsModified(VARIANT_BOOL *pVal)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	*pVal = VARIANT_FALSE;

	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
	{
		CKyOfficeDoc * pDocument = (CKyOfficeDoc*)m_pMainFrame->GetActiveDocument();
		ASSERT_VALID(pDocument);

		*pVal = (pDocument->IsModified() == FALSE) ? VARIANT_FALSE : VARIANT_TRUE;
	}
	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::AboutBox()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	CDialog dlg(IDD_DIALOG_ABOUT);
	dlg.DoModal();
	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::PrintFile()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
	{
		CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
		ASSERT_VALID(pActiveView);

		CWaitCursor	w;
		pActiveView->DoFilePrint();
	}
	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::SetWordUserName(BSTR bstrUserName)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	USES_CONVERSION;
	
	m_szWordUserName = W2A(bstrUserName);
	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::New()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here

	CWaitCursor	w;
	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
	{
		CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
		ASSERT_VALID(pActiveView);
		
		//先关闭		
		//pActiveView->DoCloseDocument();

		//新建文档
		pActiveView->DoNew();
	}
	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::NewDoc()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	CWaitCursor	w;
	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
	{
		CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
		ASSERT_VALID(pActiveView);
		
		//先关闭		
		//pActiveView->DoCloseDocument();

		//新建文档
		pActiveView->DoNew(CLSID_WORDDOCUMENT);
	}
	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::NewPpt()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	CWaitCursor	w;
	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
	{
		CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
		ASSERT_VALID(pActiveView);
		
		//先关闭		
		//pActiveView->DoCloseDocument();

		//新建文档
		pActiveView->DoNew(CLSID_PPTPRESENTATION);
	}
	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::NewExcelWorkBook()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	CWaitCursor	w;
	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
	{
		CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
		ASSERT_VALID(pActiveView);
		
		//先关闭		
		//pActiveView->DoCloseDocument();

		//新建文档
		pActiveView->DoNew(CLSID_EXCELWORKBOOK);
	}
	return S_OK;
}

STDMETHODIMP CKyOfficeCtrl::NewExcelChart()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState())

	// TODO: Add your implementation code here
	CWaitCursor	w;
	if(m_pMainFrame && m_pMainFrame->GetSafeHwnd())
	{
		CKyOfficeView * pActiveView = (CKyOfficeView*)m_pMainFrame->GetActiveView();
		ASSERT_VALID(pActiveView);
		
		//先关闭		
		//pActiveView->DoCloseDocument();

		//新建文档
		pActiveView->DoNew(CLSID_EXCELCHART);
	}
	return S_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -