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

📄 axdoccontaineritem.cpp

📁 制作ACTIVEX文档容器编程代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
   OLECMDTEXT* pcmdtext)
{
	METHOD_PROLOGUE_EX_(CAXDocContFrameHook, OleCommandTarget)

	HRESULT	hr=NOERROR;

	COleCmdUI state(rgCmds, cCmds, pguidCmdGroup);
	if (pcmdtext == NULL)
		state.m_nCmdTextFlag = 0;
	else
		state.m_nCmdTextFlag = pcmdtext->cmdtextf;
				
	for (state.m_nIndex = 0; state.m_nIndex < cCmds; state.m_nIndex++)
	{
		state.m_nID = rgCmds[state.m_nIndex].cmdID;
		state.DoUpdate(AfxGetMainWnd(), TRUE);
	}
				
	if (pcmdtext != NULL && pcmdtext->rgwz != NULL &&
		(pcmdtext->cmdtextf != OLECMDTEXTF_NONE))
	{
		USES_CONVERSION;
		ASSERT(cCmds == 1);
		state.m_strText = state.m_strText.Right(pcmdtext->cwBuf-1);
		pcmdtext->cwActual = state.m_strText.GetLength();
					
#ifdef _UNICODE
		lstrcpyW(pcmdtext->rgwz, (LPCTSTR) state.m_strText);
#elif defined(OLE2ANSI)
		lstrcpy(pcmdtext->rgwz, state.m_strText);
#else
		lstrcpyW(pcmdtext->rgwz, T2W((LPCTSTR) state.m_strText));
#endif
	}

	return hr;
}

        
STDMETHODIMP CAXDocContFrameHook::XOleCommandTarget::Exec(const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt,
   VARIANTARG* pvarargIn, VARIANTARG* pvarargOut)
{
	METHOD_PROLOGUE_EX_(CAXDocContFrameHook, OleCommandTarget);

	HRESULT		hr=NOERROR;
	OLECMD		cmd;

	COleCmdUI	state(&cmd, 1, pguidCmdGroup);

	state.m_nIndex = 0;
	cmd.cmdf = 0;
	cmd.cmdID = nCmdID;
	state.m_nID = nCmdID;

	// help via Doc Object targeting is not supported

	if (nCmdExecOpt == OLECMDEXECOPT_SHOWHELP)
		hr = OLECMDERR_E_DISABLED;
	else
	{
		// is the command supported?

		if (!state.DoUpdate(AfxGetMainWnd(), TRUE))
			hr = OLECMDERR_E_NOTSUPPORTED;
		else
		{
			if (cmd.cmdf & OLECMDF_ENABLED)
			{
				if (AfxGetMainWnd()->OnCmdMsg(state.m_nID, CN_COMMAND, NULL, NULL))
					hr = S_OK;
				else
					hr = E_FAIL;
			}
			else
				hr = OLECMDERR_E_DISABLED;
		}
	}
	
	return hr;
}



/////////////////////////////////////////////////////////////////////////////
// CAXDocContainerCntrItem::XOleIPSiteEx implementation

STDMETHODIMP_(ULONG) CAXDocContainerCntrItem::XOleIPSiteEx::AddRef()
{
	METHOD_PROLOGUE_EX_(CAXDocContainerCntrItem, OleIPSiteEx)
	return pThis->ExternalAddRef();
}

STDMETHODIMP_(ULONG) CAXDocContainerCntrItem::XOleIPSiteEx::Release()
{
	METHOD_PROLOGUE_EX_(CAXDocContainerCntrItem, OleIPSiteEx)
	return pThis->ExternalRelease();
}

STDMETHODIMP CAXDocContainerCntrItem::XOleIPSiteEx::QueryInterface(
	REFIID iid, LPVOID* ppvObj)
{
	METHOD_PROLOGUE_EX_(CAXDocContainerCntrItem, OleIPSiteEx)
	return pThis->ExternalQueryInterface(&iid, ppvObj);
}

STDMETHODIMP CAXDocContainerCntrItem::XOleIPSiteEx::GetWindow(HWND* lphwnd)
{
	METHOD_PROLOGUE_EX_(CAXDocContainerCntrItem, OleIPSiteEx)

	*lphwnd = pThis->m_pView->GetSafeHwnd();
	return *lphwnd != NULL ? S_OK : E_FAIL;
}

STDMETHODIMP CAXDocContainerCntrItem::XOleIPSiteEx::ContextSensitiveHelp(
	BOOL fEnterMode)
{
	METHOD_PROLOGUE_EX_(CAXDocContainerCntrItem, OleIPSiteEx)

	if (pThis->m_pInPlaceFrame == NULL)
		return E_UNEXPECTED;

	// simply delegate to frame window implementation
	return pThis->m_pInPlaceFrame->
		m_xOleInPlaceFrame.ContextSensitiveHelp(fEnterMode);
}

STDMETHODIMP CAXDocContainerCntrItem::XOleIPSiteEx::CanInPlaceActivate()
{
	METHOD_PROLOGUE_EX(CAXDocContainerCntrItem, OleIPSiteEx)

	return pThis->CanActivate() ? S_OK : S_FALSE;
}

STDMETHODIMP CAXDocContainerCntrItem::XOleIPSiteEx::OnInPlaceActivate()
{
	METHOD_PROLOGUE_EX(CAXDocContainerCntrItem, OleIPSiteEx)
	ASSERT_VALID(pThis);

	SCODE sc = E_UNEXPECTED;
	TRY
	{
		pThis->OnActivate();
		sc = S_OK;
	}
	END_TRY

	return sc;
}

STDMETHODIMP CAXDocContainerCntrItem::XOleIPSiteEx::OnUIActivate()
{
	METHOD_PROLOGUE_EX(CAXDocContainerCntrItem, OleIPSiteEx)
	ASSERT_VALID(pThis);

	SCODE sc = E_UNEXPECTED;
	TRY
	{
		pThis->OnActivateUI();
		sc = S_OK;
	}
	END_TRY

	return sc;
}

STDMETHODIMP CAXDocContainerCntrItem::XOleIPSiteEx::GetWindowContext(
	LPOLEINPLACEFRAME* lplpFrame,
	LPOLEINPLACEUIWINDOW* lplpDoc,
	LPRECT lpPosRect, LPRECT lpClipRect,
	LPOLEINPLACEFRAMEINFO lpFrameInfo)
{
	METHOD_PROLOGUE_EX(CAXDocContainerCntrItem, OleIPSiteEx)
	ASSERT_VALID(pThis);

	*lplpFrame = NULL;  // init these in-case of mem-alloc failure
	*lplpDoc = NULL;

	CFrameWnd* pMainFrame = NULL;
	CFrameWnd* pDocFrame = NULL;

	SCODE sc = E_UNEXPECTED;
	TRY
	{
		// get position of the item relative to activation view
		CRect rect;
		pThis->OnGetItemPosition(rect);
		::CopyRect(lpPosRect, &rect);
		pThis->OnGetClipRect(rect);
		::CopyRect(lpClipRect, &rect);

		// get the window context information
		if (pThis->OnGetWindowContext(&pMainFrame, &pDocFrame, lpFrameInfo))
		{
			// hook IOleInPlaceFrame interface to pMainFrame
			if (pThis->m_pInPlaceFrame == NULL)
				pThis->m_pInPlaceFrame = new CAXDocContFrameHook(pMainFrame, pThis);
			pThis->m_pInPlaceFrame->InternalAddRef();
			*lplpFrame = (LPOLEINPLACEFRAME)pThis->m_pInPlaceFrame->
				GetInterface(&IID_IOleInPlaceFrame);

			// save accel table for IOleInPlaceFrame::TranslateAccelerators
			pThis->m_pInPlaceFrame->m_hAccelTable = lpFrameInfo->haccel;

			// hook IOleInPlaceUIWindow to pDocFrame
			if (pDocFrame != NULL)
			{
				if (pThis->m_pInPlaceDoc == NULL)
					pThis->m_pInPlaceDoc = new CAXDocContFrameHook(pDocFrame, pThis);
				pThis->m_pInPlaceDoc->InternalAddRef();
				*lplpDoc = (LPOLEINPLACEUIWINDOW)pThis->m_pInPlaceDoc->
					GetInterface(&IID_IOleInPlaceUIWindow);
			}
			sc = S_OK;
		}
	}
	CATCH_ALL(e)
	{
		// cleanup memory that may be partially allocated
		delete *lplpFrame;
		ASSERT(*lplpDoc == NULL);
		e->Delete();
	}
	END_CATCH_ALL

	return sc;
}

STDMETHODIMP CAXDocContainerCntrItem::XOleIPSiteEx::Scroll(SIZE scrollExtent)
{
	METHOD_PROLOGUE_EX(CAXDocContainerCntrItem, OleIPSiteEx)
	ASSERT_VALID(pThis);

	SCODE sc = E_UNEXPECTED;
	TRY
	{
		if (!pThis->OnScrollBy(CSize(scrollExtent)))
			sc = S_FALSE;
		else
			sc = S_OK;
	}
	END_TRY

	return sc;
}

STDMETHODIMP CAXDocContainerCntrItem::XOleIPSiteEx::OnUIDeactivate(BOOL fUndoable)
{
	METHOD_PROLOGUE_EX(CAXDocContainerCntrItem, OleIPSiteEx)
	ASSERT_VALID(pThis);

	SCODE sc = E_UNEXPECTED;
	TRY
	{
		pThis->OnDeactivateUI(fUndoable);
		sc = S_OK;
	}
	END_TRY

	return sc;
}

STDMETHODIMP CAXDocContainerCntrItem::XOleIPSiteEx::OnInPlaceDeactivate()
{
	METHOD_PROLOGUE_EX(CAXDocContainerCntrItem, OleIPSiteEx)
	ASSERT_VALID(pThis);

	SCODE sc = E_UNEXPECTED;
	TRY
	{
		pThis->OnDeactivate();
		sc = S_OK;
	}
	END_TRY

	return sc;
}

STDMETHODIMP CAXDocContainerCntrItem::XOleIPSiteEx::DiscardUndoState()
{
	METHOD_PROLOGUE_EX(CAXDocContainerCntrItem, OleIPSiteEx)
	ASSERT_VALID(pThis);

	SCODE sc = E_UNEXPECTED;
	TRY
	{
		pThis->OnDiscardUndoState();
		sc = S_OK;
	}
	END_TRY

	return sc;
}

STDMETHODIMP CAXDocContainerCntrItem::XOleIPSiteEx::DeactivateAndUndo()
{
	METHOD_PROLOGUE_EX(CAXDocContainerCntrItem, OleIPSiteEx)
	ASSERT_VALID(pThis);

	SCODE sc = E_UNEXPECTED;
	TRY
	{
		pThis->OnDeactivateAndUndo();
		sc = S_OK;
	}
	END_TRY

	return sc;
}

STDMETHODIMP CAXDocContainerCntrItem::XOleIPSiteEx::OnPosRectChange(
	LPCRECT lpPosRect)
{
	METHOD_PROLOGUE_EX(CAXDocContainerCntrItem, OleIPSiteEx)
	ASSERT_VALID(pThis);

	SCODE sc = E_UNEXPECTED;
	TRY
	{
		CRect rect;
		rect.CopyRect(lpPosRect);
		pThis->OnChangeItemPosition(rect);
		sc = S_OK;
	}
	END_TRY

	return sc;
}

/////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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