我的应用程序是MFC单文档程序,我的本意是通过读取一个包含powerpoint文档的复合文档文件,然后让powerpoint在单文档窗口中放映。遇到的问题是放映的窗口位置不对,我用截图说明。
相关代码:       CMFCBindCntrItem *pActiveItem=(CMFCBindCntrItem*)GetNextClientItem(pos);

if(pActiveItem)
{
//显示激活Ole对象在第二个视图
// pActiveItem->Activate(OLEIVERB_SHOW,pFrame->GetDocView());
//    pActiveItem->GetInPlaceWindow()->SetFocus();
CMFCBindView *pView = pFrame->GetDocView();
pView->m_pSelection = (CMFCBindCntrItem*)pActiveItem;
//设置激活对象的在第一个视图
pFrame->GetObjListView()->m_listbox.SetCurSel(0);
}

CMFCBindCntrItem::m_nDocID=1; //下面都是office自动化的代码
pActiveItem->GetIDispatch(&lpDisp); Presentation.AttachDispatch(lpDisp);
 
Slides.AttachDispatch(Presentation.get_Slides());

Slide.AttachDispatch( Slides.Item(COleVariant((long)1)));
SlideShowSettings.AttachDispatch(Presentation.get_SlideShowSettings());
SlideShowSettings.put_LoopUntilStopped(TRUE);
SlideShowSettings.put_ShowType(1);
//下面这行代码就是让ppt进入放映状态,SlideShowWindow就是ppt的那个放映窗口对象
SlideShowWindow.AttachDispatch(SlideShowSettings.Run()); //******************************************************************************************
 //问题可能出现在下面代码里面
        /**
        *下面这两行代码去掉的话,ppt放映窗口将显示在左上角,父窗口自然就是桌面。我的意思是把父窗口设为我的单文档窗口视图,让ppt在我的应用程序视图里面放映。
        **/
HWND   hWnd   =   ::FindWindow(   "screenClass",   0   );
//视图窗口是用CSplitterWnd 把视图分成左右两个部分的右边部分,相关代码在下面  
::SetParent(   hWnd,  pFrame->GetDocView()->m_hWnd);         //下面四行代码就是设置放映窗口的位置和大小,去掉上面的两行代码,下面四行代码显示效果和位置都正确,如果不去掉的话,显示的原点不正确,不知道怎么回事
SlideShowWindow.put_Top(0);
SlideShowWindow.put_Left(0);
SlideShowWindow.put_Height(180);
SlideShowWindow.put_Width(240);
//*****************************************************************************************     //下面代码都是ppt控制的,和问题无关
pFrame->GetDocView()->SetFocus();
CSlideShowView SlideShowView = SlideShowWindow.get_View();
SlideShowView.First();
视图窗口出示化// Create the splitter and it's views
if (!m_wndSplitter.CreateStatic(this, 1, 2))
{
TRACE0("Failed to create splitter window\n");
return FALSE;
} ASSERT(RUNTIME_CLASS(CMFCBindView) == pContext->m_pNewViewClass); if (!m_wndSplitter.CreateView(0, 1, pContext->m_pNewViewClass,
CSize(rcClient.Width() - nIconPaneWidth, 50), pContext))
{
TRACE0("Failed to create main view\n");
return FALSE;
} if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CObjListView),
CSize(nIconPaneWidth, 0), pContext))
{
TRACE0("Failed to create object list view\n");
return FALSE;
}获取右边视图的方法   CMFCBindView* CMainFrame::GetDocView()
{
// returns the view that the ole items are embedded in
return (CMFCBindView*) m_wndSplitter.GetPane(0, 1);
}

解决方案 »

  1.   

    继续请教,刚才我搜了一些相关的坐标系转换的问题,还是非常困惑,ClientToScreen和ScreenToClient都是客户区和屏幕坐标之间的转换。我刚才试了一下用GetClientRect 来获取一下视图窗口的坐标,然后设置slideWindow的开始点,显示不对。        pFrame->GetDocView()->GetClientRect(&rectPos);
    SlideShowWindow.put_Top(rectPos.top);
    SlideShowWindow.put_Left(rectPos.left);
    SlideShowWindow.put_Height(180);
    SlideShowWindow.put_Width(240);
             
    应该怎样写呢?
       另外这里面的坐标还不是像素坐标,我是参考一个VB的例子来的   With .SlideShowSettings
    .ShowType = ppShowTypeSpeaker
              With .Run                                   
                                .Width = VB6.FromPixelsX(frmSS.Width, VB6.ScaleMode.Points)
                            .Height = VB6.FromPixelsY(frmSS.Height, VB6.ScaleMode.Points
     End With
    End With
    screenClasshWnd = FindWindow("screenClass", 0)
    SetParent(screenClasshWnd, frmSS.Handle.ToInt32)这里面的坐标都用FromPixelsX(frmSS.Width, VB6.ScaleMode.Points)做了转换,在VC里面应当怎么转换呢。
      

  2.   

    我觉得是没有对pFrame->GetDocView()->m_hWnd进行Invalidate,
    "screenClass"窗口现在是其子窗口,没有得到刷新,还停留在原来的位置上。
    可以重载OnSize和OnMove来处理,将screenClass Move到指定的位置上。
    坐标是客户区坐标,直接用就行。我现在考虑的问题是:如果有多个ppt播放窗口,就有多个screenClass类窗口吧,而且可以同时播放(试过了),那么如何区分不同的窗口--对应哪个文档?