qq_41945416 2025-11-01 11:09 采纳率: 90.6%
浏览 4
已结题

关于mfc多文档的编程 的问题

关于mfc多文档的编程 的问题
1.1 用户可能会打开 多个文档 如何在不同的文档里 打开不同的子对话框?
1.2 多文档的 窗口上的 默认图标 和标题 Demo1 如何更改?

  • 写回答

3条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-11-01 11:25
    关注

    让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。

    如果答案让您满意,请采纳、点赞、关注,非常感谢!
    .
    每日一句正能量,让它带给您好心情:每一个不曾放弃的瞬间,都在为未来积蓄力量。
    .

    MFC多文档编程问题解答

    1.1 在不同文档中打开不同的子对话框

    方法一:在文档类中管理对话框

    // 在您的文档类头文件中
    class CMyDocument : public CDocument
    {
    public:
        CMyChildDialog* GetChildDialog() { return &m_childDialog; }
        
    protected:
        CMyChildDialog m_childDialog; // 子对话框成员变量
    };
    
    
    // 在视图类中访问
    void CMyView::OnSomeCommand()
    {
        CMyDocument* pDoc = GetDocument();
        if (pDoc && pDoc->GetChildDialog())
        {
            if (!pDoc->GetChildDialog()->GetSafeHwnd())
            {
                pDoc->GetChildDialog()->Create(IDD_MY_DIALOG, this);
            }
            pDoc->GetChildDialog()->ShowWindow(SW_SHOW);
        }
    }
    

    方法二:动态创建对话框

    // 在文档类中
    class CMyDocument : public CDocument
    {
    public:
        void CreateDocumentSpecificDialog()
        {
            if (!m_pChildDialog)
            {
                m_pChildDialog = new CMySpecificDialog();
                m_pChildDialog->Create(IDD_SPECIFIC_DIALOG, AfxGetMainWnd());
            }
            m_pChildDialog->ShowWindow(SW_SHOW);
        }
        
    private:
        CMySpecificDialog* m_pChildDialog;
    };
    

    方法三:使用文档模板关联

    // 在应用程序初始化中
    BOOL CMyApp::InitInstance()
    {
        // 创建多文档模板
        CMultiDocTemplate* pDocTemplate;
        pDocTemplate = new CMultiDocTemplate(
            IDR_MYTYPE,
            RUNTIME_CLASS(CMyDocument),
            RUNTIME_CLASS(CChildFrame), // 自定义子框架
            RUNTIME_CLASS(CMyView));
        AddDocTemplate(pDocTemplate);
        
        return TRUE;
    }
    

    1.2 更改多文档窗口的默认图标和标题

    更改应用程序图标

    方法一:在资源文件中修改

    1. 在资源视图(Resource View)中找到 IDR_MAINFRAME 图标
    2. 右键点击选择"替换图标"
    3. 导入或创建新的图标文件

    方法二:编程方式修改主框架图标

    // 在主框架类中
    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
        if(!CMDIFrameWnd::PreCreateWindow(cs))
            return FALSE;
        
        // 设置窗口标题
        cs.style &= ~FWS_ADDTOTITLE;
        
        return TRUE;
    }
    
    
    // 在OnCreate函数中设置图标
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
        if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
            return -1;
        
        // 设置主窗口图标
        HICON hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
        SetIcon(hIcon, TRUE);  // 大图标
        SetIcon(hIcon, FALSE); // 小图标
        
        return 0;
    }
    

    更改文档类型图标和标题

    // 在文档模板创建时设置
    BOOL CMyApp::InitInstance()
    {
        CMultiDocTemplate* pDocTemplate;
        pDocTemplate = new CMultiDocTemplate(
            IDR_MYTYPE,                    // 资源ID(包含图标、菜单等)
            RUNTIME_CLASS(CMyDocument),
            RUNTIME_CLASS(CChildFrame),
            RUNTIME_CLASS(CMyView));
        
        // 设置文档标题
        pDocTemplate->SetDocStrings(_T("\nMyDoc\nMy Document\nMy Files (*.my)\n.my"));
        
        AddDocTemplate(pDocTemplate);
        
        return TRUE;
    }
    

    更改子窗口标题

    // 在文档类中重写SetTitle
    void CMyDocument::SetTitle(LPCTSTR lpszTitle)
    {
        // 调用基类设置标题
        CDocument::SetTitle(_T("我的自定义标题"));
        
        // 或者根据文档内容设置
        CString strTitle;
        strTitle.Format(_T("Demo1 - %s"), GetPathName());
        CDocument::SetTitle(strTitle);
    }
    

    资源文件配置

    resource.h.rc 文件中:

    // resource.h
    #define IDR_MAINFRAME                   128
    #define IDR_MYTYPE                      129
    
    
    // 在.rc文件中
    IDR_MAINFRAME ICON "main.ico"
    IDR_MYTYPE ICON "document.ico"
    

    动态修改窗口标题

    // 在任何需要的地方
    CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
    if (pMainFrame)
    {
        pMainFrame->SetWindowText(_T("我的应用程序 - Demo1"));
    }
    

    通过以上方法,您可以实现在不同文档中打开不同的子对话框,并自定义多文档应用程序的图标和标题显示。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月9日
  • 已采纳回答 11月1日
  • 创建了问题 11月1日