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

📄 controlwps.cpp

📁 wps 操作程序。提供了wps常用的操用方法和源代码
💻 CPP
字号:
// ControlWPS.cpp: implementation of the CControlWPS class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ControlWPS.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CControlWPS::CControlWPS() :
m_pIDisp(NULL)
{
	CoInitialize(NULL);
}

CControlWPS::~CControlWPS()
{
	CloseWPS();
	CoUninitialize();
}

// 启动WPS文字,并添加居中文字,以及插入一幅图片
void CControlWPS::OpenWPS()
{
	USES_CONVERSION;

	CLSID clsid = {0}; 

	// 获取WPS文字的 CLSID
	HRESULT hr = CLSIDFromProgID(L"wps.application", &clsid);
	if(FAILED(hr))
		return;
	
	// 通过CLSID启动WPS
	hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&m_pIDisp);
	if(FAILED(hr))
		return;

	// 使WPS可见
	VARIANT var = {0};
	var.vt = VT_BOOL;
	var.boolVal = VARIANT_TRUE;
	PutProperty(m_pIDisp, L"Visible", &var);

	// 获取Documents集合
	VARIANT varDocuments = {0};
	GetProperty(m_pIDisp, L"Documents", &varDocuments);

	// 在Documents中新建一篇文档
	VARIANT varDocument = {0};
	Invoke0(varDocuments.pdispVal, L"Add", &varDocument);
	
	// 获取Selection对象
	VARIANT varSelection = {0};
	GetProperty(m_pIDisp, L"Selection", &varSelection);

	// 获取Selection的Range对象
	VARIANT varRange = {0};
	GetProperty(varSelection.pdispVal, L"Range", &varRange);

	// 获取ParagraphFormat对象,以便设置对齐方式
	VARIANT varParagraphFormat = {0};
	GetProperty(varSelection.pdispVal, L"ParagraphFormat", &varParagraphFormat);

	// 设置文字居中对齐
	var.vt = VT_I4;
	var.lVal = 1;
	PutProperty(varParagraphFormat.pdispVal, L"Alignment", &var);

	// 插入文字,该文字是居中显示的
	var.vt = VT_BSTR;
	var.bstrVal = ::SysAllocString(A2OLE("hello,world\n"));
	PutProperty(varRange.pdispVal, L"Text", &var);

	// 获取Shapes集合对象
	VARIANT varShapes = {0};
	GetProperty(varDocument.pdispVal, L"Shapes", &varShapes);

	// 设置参数,该参数将传入Shapes的AddPicture方法中
	CComVariant varParams[8];
	varParams[0].vt = VT_BSTR;			//	Anchor
	varParams[0].bstrVal = ::SysAllocString(A2OLE(""));
	varParams[1].vt = VT_I4;			//	Height
	varParams[1].lVal = 60;				
	varParams[2].vt = VT_I4;			//	Width
	varParams[2].lVal = 148;
	varParams[3].vt = VT_I4;			//	Top
	varParams[3].lVal = 50;
	varParams[4].vt = VT_I4;			//	Left
	varParams[4].lVal = 100;
	varParams[5].vt = VT_BOOL;			//	SaveWithDocument
	varParams[5].boolVal = VARIANT_TRUE;
	varParams[6].vt = VT_BOOL;			//	LinkToFile
	varParams[6].boolVal = VARIANT_FALSE;
	varParams[7].vt = VT_BSTR;			//	FileName
	varParams[7].bstrVal = ::SysAllocString(A2OLE("http://img.kingsoft.com/publish/kingsoft/images/gb/sy/logo.gif"));
	
	// 插入图片
	InvokeN(varShapes.pdispVal, L"AddPicture", varParams, 8, &var);
}

// 关闭WPS
void CControlWPS::CloseWPS()
{
	CComVariant varParams[3];
	varParams[0].vt = VT_BOOL;
	varParams[0].boolVal = VARIANT_FALSE;
	varParams[1].vt = VT_BOOL;
	varParams[1].boolVal = VARIANT_FALSE;
	varParams[2].vt = VT_BOOL;
	varParams[2].boolVal = VARIANT_FALSE;

	// 首先调用WPS.Application的Quit方法,并且不保存修改
	InvokeN(m_pIDisp, L"Quit", varParams, 3, NULL);
	if(m_pIDisp != NULL)
	{
		// 释放对象
		m_pIDisp->Release();
		m_pIDisp = NULL;
	}
}

// 执行没有参数的方法
HRESULT CControlWPS::Invoke0(IDispatch *pDisp, LPCOLESTR lpszName, VARIANT *pvarRet)
{
	if(pDisp == NULL)
		return E_FAIL;

	HRESULT hr;
	DISPID dispid;

	hr = pDisp->GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpszName, 1, LOCALE_USER_DEFAULT, &dispid);
	if (SUCCEEDED(hr))
	{
		DISPPARAMS dispparams = { NULL, NULL, 0, 0};
		return pDisp->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, pvarRet, NULL, NULL);
		
	}
	return hr;
}

// 执行含有N个参数的方法
HRESULT CControlWPS::InvokeN(IDispatch *pDisp, LPCOLESTR lpszName, VARIANT *varParams, int nParams, VARIANT *pvarRet)
{
	if(pDisp == NULL)
		return E_FAIL;

	HRESULT hr;
	DISPID dispid;
	
	hr = pDisp->GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpszName, 1, LOCALE_USER_DEFAULT, &dispid);
	if (SUCCEEDED(hr))
	{
		DISPPARAMS dispparams = { varParams, NULL, nParams, 0};
		return pDisp->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, pvarRet, NULL, NULL);
		
	}
	return hr;

}

// 获取属性值
HRESULT CControlWPS::GetProperty(IDispatch *pDisp, LPCOLESTR lpsz, VARIANT *pVar)
{
	if(pDisp == NULL)
		return E_FAIL;

	DISPID dwDispID;

	pDisp->GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpsz, 1, LOCALE_USER_DEFAULT, &dwDispID);
	DISPPARAMS dispparams = {NULL, NULL, 0, 0};
	
	return pDisp->Invoke(dwDispID, IID_NULL,
		LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,
		&dispparams, pVar, NULL, NULL);
}

// 设置属性值
HRESULT CControlWPS::PutProperty(IDispatch *pDisp, LPCOLESTR lpsz, VARIANT *pVar)
{
	if(pDisp == NULL)
		return E_FAIL;

	DISPID dwDispID;

	pDisp->GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpsz, 1, LOCALE_USER_DEFAULT, &dwDispID);
	DISPPARAMS dispparams = {NULL, NULL, 1, 1};
	dispparams.rgvarg = pVar;
	DISPID dispidPut = DISPID_PROPERTYPUT;
	dispparams.rgdispidNamedArgs = &dispidPut;
	
	if (pVar->vt == VT_UNKNOWN || pVar->vt == VT_DISPATCH || 
		(pVar->vt & VT_ARRAY) || (pVar->vt & VT_BYREF))
	{
		HRESULT hr = pDisp->Invoke(dwDispID, IID_NULL,
			LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUTREF,
			&dispparams, NULL, NULL, NULL);
		if (SUCCEEDED(hr))
			return hr;
	}
	
	return pDisp->Invoke(dwDispID, IID_NULL,
		LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT,
		&dispparams, NULL, NULL, NULL);
}

⌨️ 快捷键说明

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