您的位置:首页 > 其它

使用单文档视图结构把Word嵌入到VC程序中(2)

2015-01-15 14:04 274 查看
环境;win7 64,vs2008 sp1,word2013

一.新建一单文档,复合文档选择容器,同时选中活动文档容器和支持复合文件



二.参考http://blog.csdn.net/dragoo1/article/details/41704245,使单文档打开的时候可以打开一个现有word。关键代码

[cpp] view
plaincopy





void CTest1203View::OnInitialUpdate()

{

CView::OnInitialUpdate();

// TODO: 写入最终选择模式代码之后移除此代码

m_pSelection = NULL; // 初始化选定内容

EmbedAutomateWord("D:\\test.docx", 0);

}

void CTest1203View::EmbedAutomateWord(CString sDocPath, int isNewDocDocment)

{

//Change the cursor so that theuser knows that something exciting is going

//on.

BeginWaitCursor();

CTest1203CntrItem*pItem = NULL;

TRY{

//Get thedocument that is associated with this view, and be sure that itis

//valid.

CTest1203Doc* pDoc =GetDocument();

ASSERT_VALID(pDoc);

//Create a newitem associated with this document, and be sure that it is

//valid.

pItem = new CTest1203CntrItem(pDoc);

ASSERT_VALID(pItem);

// Get the ClassID for the Word document.

// This is usedin creation.

CLSID clsid;

if(FAILED(::CLSIDFromProgID(L"Word.document",&clsid)))

//Anyexception will do. You just need to break out of the

//TRYstatement.

AfxThrowMemoryException();

if(isNewDocDocment==0) //如果是打开文档

{

if(!pItem->CreateFromFile(sDocPath, clsid))

AfxThrowMemoryException();

}

else

{

// Create theWord embedded item.

if(!pItem->CreateNewItem(clsid))

//Anyexception will do. You just need to break out of the

//TRYstatement.

AfxThrowMemoryException();

}

//Make sure thatthe new CContainerItem is valid.

ASSERT_VALID(pItem);

// Start theserver to edit the item.

pItem->DoVerb(OLEIVERB_SHOW,this);

// As anarbitrary user interface design, this sets the

// selection tothe last item inserted.

m_pSelection =pItem; // Setselection to the last inserted item.

pDoc->UpdateAllViews(NULL);

//Query for thedispatch pointer for the embedded object. In

//this case, thisis the Word document.

//LPDISPATCH lpDisp;

//lpDisp = pItem->GetIDispatch();

//Add text to theembedded Word document.

// CDocumentwdDoc;

// CRangewdRange;

//set CDocument0wdDoc to use lpDisp, the IDispatch* of the

//actualdocument.

// wdDoc.AttachDispatch(lpDisp);

//Get a CRangeobject for the document.

//wdRange =wdDoc.Range(COleVariant( (long)DISP_E_PARAMNOTFOUND, VT_ERROR),

// COleVariant( (long)DISP_E_PARAMNOTFOUND, VT_ERROR ) );

//Fill the rangewith the string "Hello, World!"

//wdRange.put_Text("Hello, World!" );

//wdRang.

}

//Clean up if something went wrong.

CATCH(CException, e){

if(pItem !=NULL){

ASSERT_VALID(pItem);

pItem->Delete();

}

AfxMessageBox(IDP_FAILED_TO_CREATE);

}

END_CATCH

//Set the cursor back to normal so theuser knows exciting stuff

//is no longer happening.

EndWaitCursor();

}

三.添加对MSWORD.OLB的引用

1.在stdafx.h添加如下代码

[cpp] view
plaincopy





//copy from C:\Program Files (x86)\Common Files\Microsoft Shared\OFFICE15\MSO.DLL(win7_x64 computer)

#import "lib\win7_x86\MSO.DLL" rename("RGB", "_RGB1") rename("DocumentProperties", "_DocumentProperties1")

//copy from C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB(win7_x64 computer)

#import "lib\win7_x86\VBE6EXT.OLB"

//copy from word2013

#import "lib\word\word2013\MSWORD.OLB" rename("ExitWindows", "_ExitWindows1"),rename("FindText", "_FindText1")

2.在CTest1203View.h添加2个public变量

[cpp] view
plaincopy





public:

Word::_ApplicationPtr g_lpApp;

Word::_DocumentPtr m_lpWord;

四.添加一个菜单,并添加相应事件

1.CTest1203View.h:

afx_msg void OnTest();

2.CTest1203View.cpp:

......

ON_COMMAND(ID_TEST, &CTest1203View::OnTest)

......

3.CTest1203View.cpp:

[cpp] view
plaincopy





void CTest1203View::OnTest()

{

// TODO: 在此添加命令处理程序代码

m_lpWord = m_pSelection->GetIDispatch();

g_lpApp = m_lpWord->GetApplication();

Word::SelectionPtr sel = g_lpApp->GetSelection();

sel->PutText("这是测试");

CString strPathName("D:\\test1.docx");

int filetype = 0;

CString sFileExt = "docx";

if(sFileExt=="docx")

filetype = 12;

CComVariant FileName(strPathName);

CComVariant FileFormat(filetype);

CComVariant LockComments(false),Password(_T(""));

CComVariant AddToRecentFiles(true),WritePassword(_T(""));

CComVariant ReadOnlyRecommended(false),EmbedTrueTypeFonts(false);

CComVariant SaveNativePictureFormat(false),SaveFormsData(false);

CComVariant SaveAsAOCELetter(false);

CComVariant Encoding(true);

CComVariant InsertLineBreaks(false);

CComVariant AllowSubstitutions(true);

CComVariant LineEnding(false);

CComVariant AddBiDiMarks(false);

CComVariant CompatibilityMode(14);

if(sFileExt=="docx")

{

CComVariant Encoding(false);

m_lpWord->SaveAs2(&FileName,&FileFormat,&LockComments,&Password,

&AddToRecentFiles,&WritePassword,&ReadOnlyRecommended,

&EmbedTrueTypeFonts,&SaveNativePictureFormat,&SaveFormsData,

&SaveAsAOCELetter, &Encoding, &InsertLineBreaks, &AllowSubstitutions, &LineEnding, &AddBiDiMarks, &CompatibilityMode);

}

else

{

m_lpWord->SaveAs(&FileName,&FileFormat,&LockComments,&Password,

&AddToRecentFiles,&WritePassword,&ReadOnlyRecommended,

&EmbedTrueTypeFonts,&SaveNativePictureFormat,&SaveFormsData,

&SaveAsAOCELetter);

}

}

4.CTest1203View.cpp:

[cpp] view
plaincopy





CTest1203View::~CTest1203View()

{

//释放容器

if(m_pSelection!=NULL)

{

//m_pSelection->Release();

m_pSelection->Delete();//该方法包含Release(),并有其他处理

m_pSelection = NULL;

}

//释放word

if (m_lpWord!=NULL)

{

try

{

m_lpWord->Release();

}

catch (...)

{

}

m_lpWord = NULL;

}

}

本文主要是对MSWORD.OLB引入,这样可以很方便的使用msword的Word::_DocumentPtr类,更容易操作word,比如插入文字,表格修改,文档保存等,其实这就是vba在vc(或c++)的使用,当然下一篇将介绍在网页中利用activex控件打开word,以及利用IDispatch* 同时支持word/wps
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: