修改SDI主窗口Title

修改SDI主窗口Title


一般情况下,SDI主窗口标题形式为: "文档标题 - 主窗口标题"。
参见winfrm.cpp的代码:
void CFrameWnd::OnUpdateFrameTitle(BOOL bAddToTitle)
{
 ...
 UpdateFrameTitleForDocument(pDocument->GetTitle());
 ...
}

void CFrameWnd::UpdateFrameTitleForDocument(LPCTSTR lpszDocName)
{
 CString WindowText;

 if (GetStyle() & FWS_PREFIXTITLE)
 {
  // get name of currently active view
  WindowText += lpszDocName + _T(" - ") + m_strTitle;
 }
 else
 {
  WindowText += m_strTitle + _T(" - ") + lpszDocName;
 }
 AfxSetWindowText(m_hWnd, (LPCTSTR) WindowText);
}
可以看到, 主窗口最终显示的 Title 是由文挡名和主窗口标题组成的,修改文档标题或主窗口标题都能影响最后的结果。

有下面几种修改主窗口Title的方法:

方法一:文档标题的改变
   CDocument::SetTitle()
   例如,在OnNewDocument()中就可以用SetTitle()修改文档标题


方法二:主窗口标题的改变
   主窗口的标题默认是工程的文件名
   2.1 利用ResourceView打开工程的资源,修改String Table中的IDR_MAINFRAME的值
   2.2 在 CMainFrame::PreCreateWindow() 修改CMainFrame::m_strTitle
   以上办法只能修改主窗口Title 的组成内容,并不能彻底改变主窗口Title形式


方法三:在CXXXApp::InitInstance() 直接修改 主窗口Title
   m_pMainWnd->SetWindowText( _T( "主窗口Title" ) );
   m_pMainWnd->UpdateWindow();  
   这个办法倒是可以完全修改主窗口Title,但是一旦UpdateWindow,主窗口Title 又会被设置回去。


方法四:方法二的改进,修改m_strTitle后还要设置WS_OVERLAPPEDWINDOW
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
 m_strTitle = _T( "主窗口Title" );
 cs.style =WS_OVERLAPPEDWINDOW;
}
   这样就能保证主窗口Title始终保持不变。

方法五:处理WM_SETTEXT消息
这是终极办法,如果想要动态设置主窗口Title,只有用这个办法了。
任何设置标题的动作最终都是向主窗口发送WM_SETTEXT消息,我们只需要处理这个消息就可以了。
修改CMainFrame
MainFrame.h:
afx_msg LRESULT OnSetText( WPARAM wParam, LPARAM lParam);
MainFrame.cpp:
ON_MESSAGE(WM_SETTEXT, OnSetText)
LRESULT CMainFrame::OnSetText( WPARAM wParam, LPARAM lParam)
{
 lParam = (LPARAM)"主窗口标题";
 DefWindowProc (WM_SETTEXT, wParam, lParam);
 Invalidate();
 return 0;
}
在CMainFrame::OnSetText中你可以随意设置你的主窗口Title。
如果你只是想设置一个特定的主窗口标题,只需要按2.2提供的方法设置m_strTitle,而让CMainFrame::OnSetText直接返回。

<think> 我们参考了用户提供的引用内容,特别是引用[1]和引用[2]。 根据引用[1]:修改应用程序窗口的图标应在框架类中进行,因为框架窗口才有标题栏。而修改窗口标题(即标题栏上的文字)与图标修改的位置相同,也是在框架类中。 引用[2]提到:MFC程序的默认标题是“无标题-title”,其中title是应用程序的名称。修改窗口标题可以通过多种方式,包括重载文档类的SetTitle函数(设置前半部分)、使用SetWindowText设置整个标题、或者修改字符串资源。 用户要求修改的是“MFC窗口左上角标题栏名字”,即窗口标题。因此,我们主要关注如何修改窗口标题。 方法1:在框架类(通常是CMainFrame)中,使用SetWindowText函数。 在框架窗口创建之后(例如在OnCreate函数中或之后)调用SetWindowText。 方法2:通过修改字符串资源。 在资源视图的String Table中找到IDR_MAINFRAME,修改其值。例如,将原来的"无标题\nMyApp\n"改为"My New Title\nMyApp\n",注意保留换行符。 方法3:在文档类中重写SetTitle函数,设置标题的前半部分(即“无标题”部分),然后在框架类中设置后半部分(应用程序名称)可能需要结合使用。 但是,用户要求代码示例,且特别提到“标题栏名字”,我们推荐最直接的方法:在框架类的OnCreate函数中设置窗口标题。 代码示例(在框架类CMainFrame的OnCreate函数中): ```cpp int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; // 设置窗口标题 SetWindowText(_T("我的应用程序标题")); return 0; } ``` 注意:如果程序是多文档界面(MDI),则可能需要修改子框架窗口的标题,但用户问题没有明确,我们假设是单文档SDI)或多文档的主框架标题。 另外,如果希望修改应用程序图标(标题栏左上角的图标),则需要在框架类中加载新的图标并设置。引用[1]指出在框架类中修改图标,示例代码如下: ```cpp // 在CMainFrame类中,添加消息映射ON_WM_SETICON()(但实际上设置框架窗口图标通常在PreCreateWindow中) // 或者使用SetIcon函数,但更常见的是在框架类的PreCreateWindow中修改窗口类(WNDCLASS)的图标。 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // 加载图标资源 HICON hIcon = AfxGetApp()->LoadIcon(IDI_MY_ICON); if (hIcon) { cs.hIcon = hIcon; // 设置窗口图标 } return TRUE; } ``` 但是用户的问题只关注标题栏名字(文字),所以我们重点给出设置标题的代码。 综上所述,用户要求修改标题栏名字,我们推荐在框架类的OnCreate函数中使用SetWindowText。 相关问题: 1. 如何在MFC中修改应用程序的图标? 2. 如何动态更改MFC窗口的标题(例如根据当前打开的文件名)? 3. 在MFC中,如何修改子窗口(如MDI子窗口)的标题? </think> ### MFC修改窗口标题栏名称的代码示例 #### 1. **在框架类中修改标题(推荐方法)** 在MFC应用程序的框架类中(通常是`CMainFrame`类),使用`SetWindowText`函数设置标题栏名称: ```cpp // MainFrm.cpp(框架类实现文件) int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; // 设置标题栏名称 SetWindowText(_T("我的自定义标题")); return 0; } ``` #### 2. **修改字符串资源** 在资源视图(Resource View)中修改字符串资源`IDR_MAINFRAME`: 1. 打开`String Table`资源 2. 找到`IDR_MAINFRAME`条目 3. 将其值改为格式:`自定义标题\n文档类型\n文件扩展名` (例如:`我的程序\nMyApp\nMyApp Files (*.map)\n.map\n`) #### 3. **在文档类中动态修改** 在文档类中重写`SetTitle`方法,修改标题的前半部分: ```cpp // MyDoc.cpp(文档类实现文件) void CMyDoc::SetTitle(LPCTSTR lpszTitle) { CDocument::SetTitle(_T("自定义文档标题")); } ``` #### 4. **运行时动态修改** 在任何地方调用框架窗口的`SetWindowText`: ```cpp // 获取主框架指针并设置标题 CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd; if (pFrame) { pFrame->SetWindowText(_T("运行时动态标题")); } ``` #### 注意事项: 1. 修改框架类(`CMainFrame`)是最直接的方式[^1] 2. 标题栏属于非客户区,必须在框架窗口操作[^1] 3. 修改`IDR_MAINFRAME`会影响整个应用程序的标题结构[^2] --- ### 相关问题 1. 如何在MFC中动态更新标题栏内容(例如显示当前文档名)? 2. 修改MFC应用程序图标有哪些方法? 3. 如何自定义MFC标题栏按钮(最小化/最大化/关闭)的样式和事件? 4. 在MDI应用程序中如何分别设置主框架和子窗口的标题栏? 5. 为什么修改视类(CView)的背景色不影响标题栏?[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值