本文介绍在不使用应用程序向导创建服务器应用程序的情况下,您在可视化编辑服务器应用程序中实现就地框架窗口所必须执行的步骤。 可使用应用程序向导生成的应用程序或 Visual C++ 提供的示例中的现有就地框架窗口类,来代替本文中概述的下列过程。
声明就地框架窗口类
从
COleIPFrameWnd派生一个内嵌框架窗口类。在类头文件中使用 DECLARE_DYNCREATE 宏。
在类实现(.cpp)文件中使用IMPLEMENT_DYNCREATE宏。 这样,此类的对象就可以由框架创建。
在框架窗口类中声明成员
COleResizeBar。 如果要在服务器应用程序中支持就地调整大小,则需要这样做。如果有工具栏,请在框架窗口类中声明成员
CToolBar。当服务器处于就地活动状态时,请重写
OnCreateControlBars成员函数以创建工具栏。 例如:BOOL CInPlaceFrame::OnCreateControlBars(CFrameWnd* pWndFrame, CFrameWnd* pWndDoc) { UNREFERENCED_PARAMETER(pWndDoc); // Set owner to this window, so messages are delivered to correct app m_wndToolBar.SetOwner(this); // Create toolbar on client's frame window if (!m_wndToolBar.CreateEx(pWndFrame, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_SRVR_INPLACE)) { TRACE0("Failed to create toolbar\n"); return FALSE; } // TODO: Delete these three lines if you don't want the toolbar to be dockable m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); pWndFrame->EnableDocking(CBRS_ALIGN_ANY); pWndFrame->DockControlBar(&m_wndToolBar); return TRUE; }请参阅步骤 5 之后对该代码的讨论。
在主.cpp文件中包含该内嵌框架窗口类的头文件。
在
InitInstance应用程序类中,调用SetServerInfo文档模板对象的函数,以指定要用于打开和内嵌编辑的资源和内嵌框架窗口。
语句中的 if 函数调用系列使用服务器提供的资源来创建工具栏。 此时,工具栏是容器窗口层次结构的一部分。 由于此工具栏派生自 CToolBar,因此它将将其消息传递给其所有者(容器应用程序的框架窗口),除非更改所有者。 这就是为什么调用 SetOwner 是必要的。 此调用会将命令将发送到的窗口更改为服务器的就地框架窗口,从而使消息传递到服务器。 这样,服务器就可以对它提供的工具栏上的操作做出反应。
工具栏位图的 ID 应与服务器应用程序中定义的其他就地资源相同。 请参阅 菜单和资源:服务器添加 以获取详细信息。
有关详细信息,请参阅类库参考中的 COleIPFrameWnd、COleResizeBar 和 CDocTemplate::SetServerInfo。