100分求教,怎么在MFC窗口内嵌入WORD,通过点击Button生成?感谢!

KuGames KuGamesNet网络科技有限公司 技术经理  2012-08-17 02:08:32
困扰很多天了,也找了很多资料仍然没有结果。所以恳求大家帮助!想做的是这样的一个东西:

点击VC6中的“!”感叹号运行我们的project出现的界面是一个大窗口内部嵌入三个的小窗口,类似于我们汉字的“田”字(右边中间那横可以去掉),在一个窗口中有几个小窗口,而且窗口之间可以通过鼠标拉动边界,样子就像QQ窗口,一个窗口中用来发信息的,一个显示信息的,旁边还有个QQ秀之类的窗口。这些只是铺垫,不是问题本身,这些不需要大家考虑。

现在的问题是,三个嵌在一起的小窗口中,我们随便给个编号是A,B,C吧,其实只拿出其中A,B窗口来说就行了,类似于汉字的“日”字倒着的样子,左右分割成两个小窗口A和B,其中A窗口上有个Button,通过点击Button可以打开WORD(或EXCEL或任何东西,只求能教教我怎么实现),但是注意!不能弹出来!而是在B窗口内!是在B窗口的内部打开的,可以隐藏掉标题栏也可以不用,这无所谓,只要求嵌进去,到底怎么嵌进去啊!我真的快崩溃了!

我问题描述得很清楚了吧?在同一个窗口的AB子窗口中通过A的按钮在B打开嵌入的WORD,C#有现成案例,可惜我新手C#看不懂,求高手大神为我指点一下,我把C#案例贴给大家看看,求高手看过后能用C++翻译一下,万分感谢!http://www.codeproject.com/Articles/15760/How-to-Integrate-Excel-in-a-Windows-Form-Applicati

再不做出来,我就要被炒了,求大家帮帮忙吧!!!
...全文
491 点赞 收藏 22
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
CarlZhou 2013-05-23
引用 21 楼 KuGames 的回复:
[Quote=引用 18 楼 的回复:] 《Visual C++开发实战1200例》这本书不错,你可以看下http://www.verycd.com/topics/2914781/
《Visual   C++开发实战1200例》这本书不错,你可以看下http://www.verycd.com/topics/2914781/
[/Quote] 非常感谢你提供的资料!!谢谢你的帮助!谢谢!!
我最近也在做这个方面的工作 能不能问你实现了没的啊 给个思路可以么?
回复
KuGames 2012-08-19
[Quote=引用 18 楼 的回复:]

《Visual C++开发实战1200例》这本书不错,你可以看下http://www.verycd.com/topics/2914781/
《Visual   C++开发实战1200例》这本书不错,你可以看下http://www.verycd.com/topics/2914781/

[/Quote]
非常感谢你提供的资料!!谢谢你的帮助!谢谢!!
回复
KuGames 2012-08-19
[Quote=引用 17 楼 的回复:]

方法三的一个代码片段:C/C++ code

void COffCtlView::EmbedAppWord(CString aFileName)
{

if(!m_wdApp.CreateDispatch(_T("Word.Application")))
{
AfxMessageBox(_T("Cannot start E……
[/Quote]
还有你,长得像贝爷的r3000,真是太感谢了!!
希望你有机会来福建省福州市,能请你吃饭!非常感谢你的热心帮助!我自己搜索很多资料的时候,也见过你!因为头像一直感觉是贝爷,没想到你也来帮我回答问题!很感谢!!!
回复
KuGames 2012-08-19
[Quote=引用 13 楼 的回复:]

第二个链接打开也很快,不过估计第一个链接就可以解决了。算了,我帮你贴出第二个链接内容吧。

C/C++ code

2010-03-03
Tag:word 自动化 VC MFC
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://air-head.blogbus.com/logs/59826305.html

概述
本文只是对vc中使用word的初步介绍,为涉及……
[/Quote]
真是太感谢了!!@gibsonboy
你真是非常热心!非常感谢!有机会来福州希望能请你吃饭!非常感谢你的热心帮助!
回复
whucv 2012-08-18
《Visual C++开发实战1200例》这本书不错,你可以看下http://www.verycd.com/topics/2914781/
《Visual C++开发实战1200例》这本书不错,你可以看下http://www.verycd.com/topics/2914781/
回复
康斯坦汀 2012-08-18
方法三的一个代码片段:

void COffCtlView::EmbedAppWord(CString aFileName)
{

if(!m_wdApp.CreateDispatch(_T("Word.Application")))
{
AfxMessageBox(_T("Cannot start Excel and get Application object."));
return;
}
else
{
m_wdApp.put_ScreenUpdating(TRUE);
m_wdApp.put_Visible(TRUE);

m_childWnd = ::FindWindow(_T("Opusapp"), m_wdApp.get_Caption());
::SetParent(m_childWnd,this->m_hWnd);
RECT rect;
GetWindowRect(&rect);
int Width= rect.right - rect.left;
int Height= rect.bottom - rect.top;

m_wdDocs = m_wdApp.get_Documents();

COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR),
vtFalse((short)FALSE);


m_wdDoc = m_wdDocs.Open(COleVariant(aFileName),vtOptional,vtOptional,vtOptional,vtOptional,vtOptional,
vtOptional,vtOptional,vtOptional,vtOptional,vtOptional,vtOptional,vtOptional,vtOptional,vtOptional,vtOptional);

LONG style = ::GetWindowLong(m_childWnd,GWL_STYLE);
style&=~WS_CAPTION &~WS_MINIMIZEBOX &~WS_MAXIMIZEBOX &~WS_THICKFRAME &~WS_SYSMENU |FWS_ADDTOTITLE;
::SetWindowLong(m_childWnd,GWL_STYLE,style);

m_RibbonWnd = GetRibbonWnd(m_childWnd);

ShowRibbonBar(m_bHideToolbar);
m_wdApp.put_ScreenUpdating(TRUE);

/* g_lpWndDefProc = (WNDPROC)::SetWindowLong(m_RibbonWnd, GWL_WNDPROC, (LONG)SubWindowProc);*/

InvalidateAllChildWindows(this->m_hWnd);

}

}

回复
康斯坦汀 2012-08-18
很容易的,基本上三个方法,大概提示你一下, 相关资料自己网上关键字搜。

方法一: 用DsoFramer控件,http://download.csdn.net/detail/naqinga/2607346
方法二: 用WebBrowser
方法三:直接嵌word实例,隐藏其工具栏。

具体看有关文档,做程序员一点点英语能力还有一点点学习能力是必须的,否则不如改行。
回复
dickbarry 2012-08-18
崩溃....
http://blog.csdn.net/winpassword/article/details/2774675
回复
dickbarry 2012-08-18
http://bbs.csdn.net/
这里有个demo
回复
gibsonboy 2012-08-17
第二个链接打开也很快,不过估计第一个链接就可以解决了。算了,我帮你贴出第二个链接内容吧。


2010-03-03
Tag:word 自动化 VC MFC
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://air-head.blogbus.com/logs/59826305.html

概述
本文只是对vc中使用word的初步介绍,为涉及编辑等问题
主要参看http://support.microsoft.com/?scid=kb;zh-cn;316207&spid=2989&sid=15
增加自己创建时遇到问题的解决

1.用向导创建MFC应用程序.
2.选则多文档,在复合文档类型中选择container(容器)
3.添加关于word的引用,如果使用的是Com的方式,那么不需要做3.4步骤.
4.注意
默认导入时的引用文件为
//#import "C:\\Program Files\\Microsoft Office\\Office12\\MSWORD.OLB" no_namespace
可能无法正确使用,所以需做如下调整
#import "C:\\Program Files\\Microsoft Office\\Office12\\MSWORD.OLB" auto_search auto_rename no_auto_exclude rename("ExitWindows", "WordExitWindows")
using namespace Word;
5.修改CntrItem.h文件
class CTestWord2CntrItem : public COleDocObjectItem,默认继承自COleClientItem
在CntrItem.cpp中做相应调整
解决word在view中的显示问题.

6.为CTestWord2CntrItem添加共有成员函数
public:
LPDISPATCH GetIDispatch();
实现如下:
LPDISPATCH CTestWord2CntrItem::GetIDispatch()
{
//The this and m_lpObject pointers must be valid for this function
//to work correctly. The m_lpObject is the IUnknown pointer to
// this object.
ASSERT_VALID(this);

ASSERT(m_lpObject != NULL);

LPUNKNOWN lpUnk = m_lpObject;

//The embedded application must be running in order for the rest
//of the function to work.
Run();

//QI for the IOleLink interface of m_lpObject.
LPOLELINK lpOleLink = NULL;
if (m_lpObject->QueryInterface(IID_IOleLink,
(LPVOID FAR*)&lpOleLink) == NOERROR)
{
ASSERT(lpOleLink != NULL);
lpUnk = NULL;

//Retrieve the IUnknown interface to the linked application.
if (lpOleLink->GetBoundSource(&lpUnk) != NOERROR)
{
TRACE0("Warning: Link is not connected!\n");
lpOleLink->Release();
return NULL;
}
ASSERT(lpUnk != NULL);
}

//QI for the IDispatch interface of the linked application.
LPDISPATCH lpDispatch = NULL;
if (lpUnk->QueryInterface(IID_IDispatch, (LPVOID FAR*)&lpDispatch)
!=NOERROR)
{
TRACE0("Warning: does not support IDispatch!\n");
return NULL;
}

//After you verify that it is valid, return the IDispatch
//interface to the caller.
ASSERT(lpDispatch != NULL);
return lpDispatch;
}

7.修改TestWord2View.cpp文件
void CTestWord2View::OnInitialUpdate()
{
CView::OnInitialUpdate();


// TODO: remove this code when final selection model code is written
m_pSelection = NULL; // initialize selection
EmbedAutomateWord();

}

8.为TestWord2View.cpp增加,共有函数
public:
void EmbedAutomateWord();
实现如下:
void CTestWord2View::EmbedAutomateWord()
{
//Change the cursor so that the user knows that something exciting is going
//on.
BeginWaitCursor();

CTestWord2CntrItem* pItem = NULL;
TRY
{
//Get the document that is associated with this view, and be sure that it is
//valid.
CTestWord2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

//Create a new item associated with this document, and be sure that it is
//valid.
pItem = new CTestWord2CntrItem(pDoc);
ASSERT_VALID(pItem);

// Get the Class ID for the Word document.
// This is used in creation.
CLSID clsid;
if(FAILED(::CLSIDFromProgID(L"Word.document",&clsid)))
//Any exception will do. You just need to break out of the
//TRY statement.
AfxThrowMemoryException();

// Create the Word embedded item.
if(!pItem->CreateNewItem(clsid))
//Any exception will do. You just need to break out of the
//TRY statement.
AfxThrowMemoryException();

//Make sure that the new CContainerItem is valid.
ASSERT_VALID(pItem);

// Start the server to edit the item.
pItem->DoVerb(OLEIVERB_SHOW, this);

// As an arbitrary user interface design, this sets the
// selection to the last item inserted.
m_pSelection = pItem; // Set selection to the last inserted item.
pDoc->UpdateAllViews(NULL);

//Query for the dispatch pointer for the embedded object. In
//this case, this is the Word document.
LPDISPATCH lpDisp;
lpDisp = pItem->GetIDispatch();

//Add text to the embedded Word document.
CDocument0 wdDoc;
CRange wdRange;

//set CDocument0 wdDoc to use lpDisp, the IDispatch* of the
//actual document.
wdDoc.AttachDispatch(lpDisp);


//Get a CRange object for the document.
//wdRange = wdDoc.Range(COleVariant( (long)DISP_E_PARAMNOTFOUND, VT_ERROR ),
// COleVariant( (long)DISP_E_PARAMNOTFOUND, VT_ERROR ) );

//Fill the range with 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 the user knows exciting stuff
//is no longer happening.
EndWaitCursor();
}

9.编译运行.
回复
KuGames 2012-08-17
[Quote=引用 10 楼 的回复:]

http://support.microsoft.com/kb/238611
http://air-head.blogbus.com/logs/59826305.html
[/Quote]
@gibsonboy
(idea)

谢谢你提供的资料!不过第二条链接转半天打不开,第一条微软官方的,确实没找到,谢谢你帮我找到,我会仔细看看的!再次感谢gibsonboy的热心帮助!!!
回复
seven807173440 2012-08-17
[Quote=引用 9 楼 的回复:]

http://www.pudn.com/downloads37/sourcecode/windows/activex/detail119324.html

http://sohu2000000.blog.163.com/blog/static/11921260200982210590931/

我印象中是有office控件的,如果只是单纯的打开,用控件就够了
[/Quote]
第一个是单文档,看一眼就知道了,很简单的一个例子,而且,我没那个网站的帐号。
第二个链接,很悲剧,打不开,谢谢你帮我顶一下帖子!
回复
dickbarry 2012-08-17
回复
seven807173440 2012-08-17
[Quote=引用 7 楼 的回复:]

你到底是要word还是excel?
[/Quote]
大哥,您能仔细看看描述吗?您会什么就用什么?能到达目的地,管你是坐汽车还是走路,不是吗?
我写的这句话:
“通过点击Button可以打开WORD(或EXCEL或任何东西,只求能教教我怎么实现)”
不是说得很清楚吗?

所以,那您纠结到底是WORD还是EXCEL这个问题干嘛呢???你要是懂WORD就向您请教WORD,要是懂EXCEL做法就请教您EXCEL的,对您来说有区别,对我来说还真没区别,只不过文件名换一下,类库换一下的事情,关键问题是怎么去实现而不是纠结坐自行车还是小汽车?

当然,您要是不愿意赐教,那我也无话可说,还是谢谢您顶帖。
回复
你到底是要word还是excel?
回复
KuGames 2012-08-17
跪求大神现身!!!
回复
KuGames 2012-08-17
唉,不知道你有没有看描述,我还加黑字,那些,窗口拆分不需要你们考虑,我要问的问题在下面~~~~~
[Quote=引用 4 楼 的回复:]

CSplitterWnd 去创建拆分窗口
[/Quote]
回复
Gloveing 2012-08-17
CSplitterWnd 去创建拆分窗口
回复
KuGames 2012-08-17
up!大神!
回复
加载更多回复
相关推荐
发帖
界面
创建于2007-09-28

1.5w+

社区成员

VC/MFC 界面
申请成为版主
帖子事件
创建了帖子
2012-08-17 02:08
社区公告
暂无公告