单文档标题的修改

一、修改标题
方法1:在CMainFrame中PreCreateWindow(CREATESTRUCT& cs)进行更改,如下:

BOOL CKTLXSubjectShowFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: Add your specialized code here and/or call the base class
    cs.style &=~WS_MAXIMIZEBOX;//禁用最大化按钮
    cs.style &=~WS_SIZEBOX;
    cs.style &=~FWS_ADDTOTITLE;

    cs.lpszName = _T("测试标题");
    cs.cx = 970;
    cs.cy = 650;
    return CXTPFrameWnd::PreCreateWindow(cs);
}

方法2:在doc类中OnNewDocument函数修改,添加修改的标题,如下:

BOOL CKTLXSubjectShowDoc::OnNewDocument()
{
    if (!CDocument::OnNewDocument())
        return FALSE;

    SetTitle(_T("测试标题"));

    return TRUE;
}

二、修改标题后半部分
单文档标题通常会有两部分组成,例如:标题名称—工程名称,修改StringTable的IDR_MAINFRAME的标题,将第一个\n之前的字符串替换为标题\n\nTestSingleTitle\n\n\nTestSingleTitle.Document\nTestSingleTitle.Document
 三、去掉标题的后半部分

方法1:在CTestSingleTitleApp::InitInstance()中调用如下语句m_pMainWnd->SetWindowText(_T("标题"));或在其他地方用(AfxGetMainWnd())->SetWindowText(_T("标题"));也可以得到相同的结果。

方法2:可以通过利用CWnd::SetWindowText即:void SetWindowText( LPCTSTR lpszString );重载CFramWnd类的OnUpdateFrameTitle函数

void CMainFrame::OnUpdateFrameTitle(BOOL bAddToTitle)
{
    // TODO: 在此添加专用代码和/或调用基类 
    SetWindowText(_T("标题"));
    CFrameWnd::OnUpdateFrameTitle(bAddToTitle);
}

方法3:在CMainFrame的PreCreateWindow函数中修改窗口风格:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
          cs.style &= ~(LONG) FWS_ADDTOTITLE;
          return CFrameWnd::PreCreateWindow(cs);
}

 

<think>在MFC单文档应用程序中,修改标题通常涉及多个位置,因为MFC应用程序的标题由文档标题和框架标题组合而成。以下是详细步骤: 1. **修改主框架窗口标题**:通常在主框架类(如CMainFrame)中修改。 2. **修改文档标题**:在文档类(如CMyDoc)中修改,这会影响窗口标题的一部分以及文件保存对话框中的默认文件名。 3. **修改应用程序标题**:在应用程序类(如CMyApp)中修改,这会影响应用程序实例的标题。 具体步骤: ### 方法1:在框架类中修改(最常用) 在框架类(CMainFrame)的`OnCreate`函数中,使用`SetWindowText`设置窗口标题。但是注意,MFC默认会使用文档标题和应用程序名称组合。因此,直接设置框架标题会覆盖默认行为。 ```cpp // MainFrm.cpp int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; // 设置主框架窗口标题 SetWindowText(_T("aaa aa")); return 0; } ``` 但是,这种方法设置的标题可能会被文档标题覆盖。因此,更可靠的方法是在文档类中设置文档标题。 ### 方法2:在文档类中修改文档标题 在文档类中,重写`SetTitle`函数,或者在文档初始化时设置标题。 ```cpp // MyDoc.cpp BOOL CMyDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; // 设置文档标题 SetTitle(_T("aaa aa")); return TRUE; } ``` 注意:在单文档应用程序中,文档标题会显示在框架窗口的标题栏中。但是,默认情况下,框架窗口标题的格式为“文档标题 - 应用程序标题”。所以,如果你只想改变文档标题部分,可以在这里设置。 ### 方法3:修改应用程序标题 应用程序标题在资源文件中定义。修改方法: 1. 打开资源视图(Resource View) 2. 展开`String Table`,双击`IDR_MAINFRAME` 3. 修改`Caption`,例如:`aaa aa\n\nMyApp\n\n\nMyApp.Document\nMyApp Document` 但是,直接修改资源字符串会改变整个应用程序的标题模板。通常,这个字符串的格式为: ``` 窗口标题\n文档类型\n文档类型\n文档类型\n文件扩展名\n文件类型描述\n文件类型描述 ``` 其中,第一个`\n`之前的部分就是应用程序标题修改它即可改变标题中应用程序名称部分。 ### 方法4:动态修改整个标题(覆盖组合) 如果你希望完全控制标题,可以在框架类中重写`OnUpdateFrameTitle`函数: ```cpp // MainFrm.cpp void CMainFrame::OnUpdateFrameTitle(BOOL bAddToTitle) { // 不调用基类函数,避免MFC自动设置标题 // CFrameWnd::OnUpdateFrameTitle(bAddToTitle); // 直接设置标题 SetWindowText(_T("aaa aa")); } ``` ### 方法5:在视图类中修改(不推荐,但有时可行) 在视图类的`OnInitialUpdate`中: ```cpp void CMyView::OnInitialUpdate() { CView::OnInitialUpdate(); GetParentFrame()->SetWindowText(_T("aaa aa")); } ``` ### 完整示例:在框架类中动态修改标题 假设我们需要在程序运行时根据某些条件改变标题: ```cpp // MainFrm.h class CMainFrame : public CFrameWnd { // ... afx_msg void OnUpdateTitle(CCmdUI* pCmdUI); }; // MainFrm.cpp BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_UPDATE_COMMAND_UI(ID_UPDATE_TITLE, OnUpdateTitle) END_MESSAGE_MAP() void CMainFrame::OnUpdateTitle(CCmdUI* pCmdUI) { SetWindowText(_T("aaa aa")); } ``` ### 注意事项 - 修改标题时注意字符串编码:使用`_T()`宏确保Unicode和MBCS兼容。 - 避免在标题中使用特殊字符,如果必须使用,确保正确转义。 - 如果标题包含动态内容(如时间、数据等),需要定时刷新。 ### 总结 最常用的方法是在文档类中设置标题(`SetTitle`)或者修改资源字符串。如果希望完全自定义,可以重写框架类的`OnUpdateFrameTitle`。 §§相关问题§§: 1. 如何在MFC多文档应用程序中修改子窗口标题? 2. 如何动态更新MFC应用程序标题(例如每秒更新一次)? 3. 如何在MFC应用程序中同时显示文档名称和应用程序名称? 4. 如何修改MFC应用程序的窗口图标?</think>### Visual Studio 2010 MFC 单文档应用程序标题修改完整步骤 #### 方法1:修改文档标题(推荐方式) ```cpp // 在文档类中重写 SetTitle 方法 // MyDoc.h class CMyDoc : public CDocument { public: virtual void SetTitle(LPCTSTR lpszTitle); }; // MyDoc.cpp void CMyDoc::SetTitle(LPCTSTR lpszTitle) { // 调用基类方法设置文档标题 CDocument::SetTitle(_T("aaa aa")); // 同时更新框架窗口标题 CFrameWnd* pFrame = (CFrameWnd*)AfxGetApp()->m_pMainWnd; if (pFrame) { pFrame->SetWindowText(_T("aaa aa")); } } ``` #### 方法2:在框架类中修改 ```cpp // MainFrm.h class CMainFrame : public CFrameWnd { protected: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); }; // MainFrm.cpp int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; // 设置窗口标题 SetWindowText(_T("aaa aa")); return 0; } ``` #### 方法3:在应用程序初始化时修改 ```cpp // MyApp.h class CMyApp : public CWinApp { public: virtual BOOL InitInstance(); }; // MyApp.cpp BOOL CMyApp::InitInstance() { // ...其他初始化代码... // 创建文档模板 CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMyDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CMyView)); AddDocTemplate(pDocTemplate); // 创建主框架窗口 m_pMainWnd = new CMainFrame; m_pMainWnd->LoadFrame(IDR_MAINFRAME); m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); // 设置窗口标题 m_pMainWnd->SetWindowText(_T("aaa aa")); return TRUE; } ``` #### 方法4:修改字符串资源(静态修改) 1. 在资源视图中打开"String Table" 2. 找到ID为`IDR_MAINFRAME`的字符串 3. 修改字符串值(格式为:`窗口标题\n文档类型\n...`) ```cpp // 原始格式 "默认标题\nMyDoc\nMyApp\n\n\nMyApp.Document\nMyDoc Document" // 修改为 "aaa aa\nMyDoc\nMyApp\n\n\nMyApp.Document\nMyDoc Document" ``` ### 技术原理详解 1. **MFC标题管理机制**: - MFC使用文档/视图架构管理标题 - 默认标题 = 文档标题 + " - " + 应用程序名称 - 标题更新通过`CDocument::SetTitle()`触发 2. **标题修改优先级**: ```mermaid graph TD A[字符串资源IDR_MAINFRAME] -->|最低优先级| B(静态标题) C[文档类SetTitle] -->|中等优先级| D(文档相关标题) E[框架类SetWindowText] -->|最高优先级| F(直接控制) ``` 3. **动态更新标题**: ```cpp // 在视图类中响应事件更新标题 void CMyView::OnSomeEvent() { // 获取文档指针 CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // 更新文档标题 pDoc->SetTitle(_T("aaa aa")); // 或者直接更新框架 GetParentFrame()->SetWindowText(_T("aaa aa")); } ``` ### 常见问题解决方案 1. **标题被自动恢复问题**: ```cpp // 重写框架类的OnUpdateFrameTitle void CMainFrame::OnUpdateFrameTitle(BOOL bAddToTitle) { // 阻止MFC自动更新标题 // CFrameWnd::OnUpdateFrameTitle(bAddToTitle); // 手动设置标题 SetWindowText(_T("aaa aa")); } ``` 2. **多语言支持**: ```cpp // 在资源文件中添加多语言标题 STRINGTABLE BEGIN IDS_APP_TITLE_EN "aaa aa" IDS_APP_TITLE_CN "啊啊 啊啊" END // 代码中动态切换 void SetAppTitle(int lang) { CString strTitle; strTitle.LoadString(lang == 0 ? IDS_APP_TITLE_EN : IDS_APP_TITLE_CN); AfxGetMainWnd()->SetWindowText(strTitle); } ``` 3. **标题包含文档名**: ```cpp // 保留文档名但修改应用名 void CMyDoc::SetTitle(LPCTSTR lpszTitle) { CString newTitle; newTitle.Format(_T("%s - aaa aa"), lpszTitle); CDocument::SetTitle(newTitle); } ``` 4. **标题闪烁问题**: ```cpp // 使用双缓冲减少闪烁 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; cs.dwExStyle |= WS_EX_COMPOSITED; return TRUE; } ``` ### 最佳实践建议 1. **修改位置优先级**: - 简单修改:使用字符串资源(方法4) - 动态修改:使用文档类SetTitle(方法1) - 完全控制:框架类SetWindowText(方法2) 2. **修改时机**: - 应用启动时:在`InitInstance()`中 - 文档打开时:在`OnOpenDocument()`中 - 用户交互时:在命令处理函数中 3. **国际版应用程序**: - 将所有标题文本放在字符串资源中 - 使用`LoadString()`动态加载 - 避免在代码中硬编码标题文本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值