怎么遍历MFC打开的多个文档?

怎么遍历MFC打开的多个文档?

    需要使用打开的多个文档的数据,在哪可以遍历到呢?处理的例程应该放在哪呢?App?Frame?Doc?View...?

    嗯,我再想想

    在class CMultiDocTemplate定义中看到了:
                  CPtrList m_docList;          // open documents of this type

估计就是这家伙了,还有两个函数应该是用来取数据的

virtual POSITION GetFirstDocPosition() const;
virtual CDocument* GetNextDoc(POSITION& rPos) const;

然后得想办法拿到CMultiDocTemplate的handler,嘿嘿,这家伙就在CDocument类中:

CDocTemplate* GetDocTemplate() const;

这样看来在Doc处理该消息是比较自然的了。

嗯,先试试去

 

 

PS:在网上搜索了一下,有一篇说的比较接近,拿来主义,原创不详!内容如下:

在MFC的SDI和MDI中,你要想从你的CXXXApp(当然是继承于CWinApp了)得到CXXXView(当然继承于CView了)视图指针可不是一件很容易的事情哟,还是很迂回的。下面将介绍如何得到,OK,让我们开始吧。
   如果我们要得到视图指针,首先我们要得到指向文档的指针,如何得到文档类的指针,首先我们又要得到文档模板的指针(即CDocTemplate),如何得到文档模板的指针,很简单,就是通过CWinApp类即可得到。
具体过程如下:
1)得到文档模板的位置
2)根据模板的位置得到文档模板指针
3)根据文档模板得到文档的位置
4)根据文档的位置得到文档的指针
5)根据文档得到视图的位置
6)根据视图的位置得到视图的指针,这就是我们所要得到的。


OK,下面给出具体实现代码

// Get the position of the first document template
POSITION pos = GetFirstDocTemplatePosition();
// Do we have a valid template position?
if (pos)
{
   // Get a pointer to the document template
   CDocTemplate* pDocTemp = GetNextDocTemplate(pos);
   // Do we have a valid pointer?
   if (pDocTemp)
   {
    // Get the position of the first document
    POSITION dPos = pDocTemp->GetFirstDocPosition();
    // Do we have a valid document position?
    if (dPos)
    {
     // Get a pointer to the document
     CTaskingDoc* pDocWnd =
      (CTaskingDoc*)pDocTemp->GetNextDoc(dPos);
     // Do we have a valid pointer?
     if (pDocWnd)
     {
      // Get the position of the view
      POSITION vPos = pDocWnd->GetFirstViewPosition();
      // Do we have a valid view position?
      if (vPos)
      {
       // Get a pointer to the view
       CTaskingView* pView = (CTaskingView*)pDocWnd->GetNextView(vPos);
}
注意:有些if 语句要改为while  循环。

### 回答1: 在MFC中嵌入CEF(Chromium Embedded Framework)并打开多个网址可以通过以下步骤实现: 首先,你需要将CEF集成到你的MFC应用程序中。你可以从CEF的官方网站下载最新的CEF二进制文件,并按照官方文档中的指导进行安装和配置。安装完成后,你将得到一个CEF库文件和相应的头文件。 接下来,在MFC应用程序中创建一个派生自CWinApp的类,例如CMyApp。在CMyApp类的初始化函数中,需要添加CEF的初始化代码。这包括设置CEF的路径、版本和其他必要的配置参数。 然后,在你的MFC应用程序的主窗口或对话框中,添加一个CWnd控件作为CEF的容器。你可以使用CreateWindowEx函数创建一个属于你的CWnd派生类的窗口,并将其作为容器来嵌入CEF。 最后,在你的MFC应用程序中,添加一个方法来加载和显示网页。你可以使用CEF提供的CefBrowserHost接口来加载指定的网址,并将其显示在容器窗口中。你可以创建多个CefBrowserHost来加载和显示多个网页。 例如,你可以创建一个CefBrowserHost指针数组,每个指针对应一个网页。然后,循环遍历数组,为每个指针创建一个CEF窗口,并加载相应的网址。 总结起来,将CEF嵌入到MFC打开多个网址的主要步骤包括:下载和安装CEF,配置CEF的初始化参数,创建一个CEF的容器窗口,并使用CefBrowserHost加载和显示多个网页。具体的实现细节和代码可以根据你的需求进行调整和扩展。 ### 回答2: 在使用MFC嵌入CEF(Chromium Embedded Framework)实现同时打开多个网址的过程中,我们可以按照以下步骤进行: 1. 创建一个MFC应用程序,并在主窗口中添加一个Web浏览器控件。 2. 导入CEF库文件并进行相关的配置。 3. 在主窗口类中定义CEF浏览器对象变量,例如CefRefPtr<CefBrowser> m_browser。 4. 在主窗口的OnInitDialog()函数中,首先调用CEF框架的初始化函数,确保CEF能够正常工作。例如CefInitialize()。 5. 在OnInitDialog()函数中,使用CEF浏览器对象变量m_browser调用CEF创建新的浏览器窗口的函数,并指定打开的网址。例如m_browser = CefBrowserHost::CreateBrowserSync(...); 6. 在主窗口中添加打开新网址的按钮,将其与一个响应函数关联,例如OnOpenUrl()。 7. 在OnOpenUrl()函数中,可以通过调用CEF浏览器对象变量m_browser的LoadURL()函数来打开一个新网址。例如m_browser->GetMainFrame()->LoadURL(url); 8. 重复第7步,可以在OnOpenUrl()函数中多次调用LoadURL()函数来同时打开多个网址。 以上步骤仅是一个大致的流程,具体实现可能还需要考虑到处理多个网址的逻辑、界面的更新等问题。同时,在处理多个网址时,可能需要合理控制CEF的资源占用,避免内存或性能问题。 ### 回答3: CEF(Chromium Embedded Framework)是一种嵌入式的浏览器引擎,它可以让我们将现代化的浏览器功能集成到我们自己的应用程序中。在MFC(Microsoft Foundation Class)中,我们可以使用CEF来打开多个网址。 首先,我们需要在MFC应用程序中集成CEF。我们可以下载CEF的最新版本,并将其添加到我们的项目中。然后,我们需要在MFC应用程序的代码中初始化和启动CEF。 一旦CEF已经集成到MFC应用程序中,我们可以使用CEF提供的API来打开多个网址。我们可以创建一个cef::Browser类的实例,该实例表示一个浏览器窗口,并使用该实例的LoadURL()方法来加载指定的网址。 下面是一个简单的示例代码,用于在MFC打开多个网址: ```cpp #include "include/cef_base.h" #include "include/cef_browser.h" #include "include/cef_command_line.h" #include "include/cef_frame.h" #include "include/cef_runnable.h" #include "include/wrapper/cef_helpers.h" class MyBrowser : public CefBrowser { public: MyBrowser(CefRefPtr<CefBrowserHost> browser_host) : CefBrowser(browser_host) {} void LoadURL(const std::string& url) override { CefRefPtr<CefFrame> frame = GetMainFrame(); frame->LoadURL(url); } }; class CefApp : public CefApp { public: void OnContextInitialized() override { CefRefPtr<CefCommandLine> command_line = CefCommandLine::CreateCommandLine(); command_line->InitFromString(::GetCommandLine()); // Initialize CEF with the command line provided. CefInitialize(*command_line, nullptr, nullptr, nullptr); } void OnBeforeCommandLineProcessing( const CefString& process_type, CefRefPtr<CefCommandLine> command_line) override { // Disable GPU acceleration. command_line->AppendSwitch("disable-gpu"); } void OnRenderProcessThreadCreated( CefRefPtr<client::CefRenderProcessHandler> handler) override { AddCustomHandlers(renderer) ; } void OnRegisterCustomSchemes( CefRefPtr<CefSchemeRegistrar> registrar) override { RegisterCustomHandlers(registrar); } IMPLEMENT_REFCOUNTING(CefApp); }; class CefBrowserApp : public CWinApp { public: BOOL InitInstance() override { // Initialize CEF. CefMainArgs main_args(::GetModuleHandle(NULL)); // Create an instance of CefApp. CefRefPtr<CefApp> app(new CefApp()); // Execute the secondary process, if any. int exit_code = CefExecuteProcess(main_args, app, nullptr); if (exit_code >= 0) { // Terminate the main process, if the secondary process was started successfully. return FALSE; } // Create the main window and load the initial URL. m_mainWnd = new CMainFrame(); m_pMainWnd = m_mainWnd; CefWindowInfo window_info; CefBrowserSettings browser_settings; window_info.SetAsChild(m_mainWnd->m_hWnd, m_mainWnd->GetClientRect()); m_browser = CefBrowserHost::CreateBrowserSync( window_info, app, "https://www.example1.com", browser_settings, nullptr); // Open multiple URLs. m_browser->LoadURL("https://www.example2.com"); m_browser->LoadURL("https://www.example3.com"); // ... m_mainWnd->ShowWindow(SW_SHOW); m_mainWnd->UpdateWindow(); return TRUE; } int ExitInstance() override { CefShutdown(); return CWinApp::ExitInstance(); } private: CMainFrame* m_mainWnd; CefRefPtr<CefBrowser> m_browser; }; CefBrowserApp theApp; ``` 在以上示例代码中,我们在`CefBrowserApp::InitInstance()`函数中创建了一个名为`m_browser`的CEF浏览器实例,并使用`LoadURL()`方法加载了多个网址。在这个例子中,我们打开了3个网址,但你可以根据需要添加更多的URL。 总之,使用CEF嵌入到MFC打开多个网址的方法是:创建一个CEF浏览器实例,并使用`LoadURL()`方法加载多个网址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值