zoukankan      html  css  js  c++  java
  • 动态修改CMFCMenuBar及CMFCToolBar的文字及Prompt,ToolTip文字

    1. 修改CMFCMenuBar菜单项的文字,分两种.

      A. 修改顶层有POP_UP属性的菜单文字,即类型单文档中的" 文件" ,"编辑","视图"等这类一直显示着的.

        因为CMFCMenuBar基类是CMFCToolBar,所以有有如下代码:   (特别注意: 在单文档中,此函数一定要在主窗口ShowWindow之后调用)

    [cpp] view plain copy
    1. //更新菜单栏父项,即无ID的项.  
    2.     CAdoString Str;  
    3.     CMFCToolBarButton  *pButton = NULL;  
    4.     int Index = 0;  
    5.     do  
    6.     {  
    7.         pButton = m_wndMenuBar.GetMenuItem(Index);  
    8.         if(pButton)  
    9.         {  
    10.             //由于无ID,就只能按索引来修改了,这里只修改了索引为0的菜单项,在单文档中是"文件"菜单项  
    11.             if(Index == 0)  
    12.             {  
    13.                 Str.LoadString(TEXT("IDS_FILE"));  
    14.                 pButton->m_strText = Str;  
    15.             }  
    16.   
    17.         }  
    18.         ++Index;  
    19.     }  
    20.     while( pButton != NULL );  

      B, 修改由顶层菜单弹出菜单的有ID的菜单项. 

          响应ON_UPDATE_COMMAND_UI 然后在其中修改,代码如下:

    [cpp] view plain copy
    1. void CMainFrame::OnUpdateFileNew(CCmdUI *pCmdUI)  
    2. {  
    3.     CAdoString Str;  
    4.     Str.LoadString(TEXT("IDS_FILE_NEW"));  
    5.   
    6.     //加上如下判断,是只更新菜单中这个ID对应的串,而工具栏中对应的串,在其它地方修改,  
    7.     //如果没有这个条件,工具栏上显示的文字将与菜单栏相同.  
    8.     if(pCmdUI->m_pMenu != NULL)   
    9.     {  
    10.         pCmdUI->SetText(Str);  
    11.     }  
    12.   
    13.     //特别注意: 如果这里调用这类的函数,可能导致工具栏不弹出ToolTip提示.  
    14.     //m_wndToolBar.AdjustLayout();   
    15. }  
    如果相让菜单中显示的文字和工具栏上文字相同,则去掉 if(pCmdUI->m_pMenu !=NULL)这句.


    2. 工具栏CMFCToolBar文字修改.

        A. 在ON_UPDATE_COMMAND_UI , 前面已经说过.

       B. 使用CMFCToolbar的方法修改. 代码如下:   (特别注意: 在单文档中,此函数一定要在主窗口ShowWindow之后调用)

    [cpp] view plain copy
    1. //修改工具栏文字  
    2.     UINT itemID = 0;  
    3.     int nCount  = m_wndToolBar.GetCount();  
    4.     forint i=0 ;i<nCount; ++i)  
    5.     {  
    6.         if( TBBS_SEPARATOR != m_wndToolBar.GetButtonStyle(i) )//分隔栏没有文字  
    7.         {  
    8.             itemID = m_wndToolBar.GetItemID(i);//根据命令ID修改对应文字.  
    9.             switch(itemID)  
    10.             {  
    11.             case ID_FILE_NEW:  
    12.                 Str.LoadString(TEXT("TOOL_NEW"));  
    13.                 m_wndToolBar.SetToolBarBtnText(i,Str);  
    14.                 break;  
    15.             case ID_FILE_OPEN:  
    16.                 Str.LoadString(TEXT("TOOL_OPEN"));  
    17.                 m_wndToolBar.SetToolBarBtnText(i,Str);  
    18.                 break;  
    19.             case ID_FILE_SAVE:  
    20.                 Str.LoadString(TEXT("TOOL_SAVE"));  
    21.                 m_wndToolBar.SetToolBarBtnText(i,Str);  
    22.                 break;  
    23.             case ID_FILE_PRINT:  
    24.                 Str.LoadString(TEXT("TOOL_PRINT"));  
    25.                 m_wndToolBar.SetToolBarBtnText(i,Str);  
    26.                 break;  
    27.             }  
    28.         }  
    29.   
    30.     }  

    3. 修改Prompt信息.

        Prompt信息分成两段: 一般格式如下:  

            保存活动文档 保存

        在编辑菜单项或者工具栏项时如果输入如上信息,则会被分成两段.   "保存活动文档" 和 " 保存".

        "保存活动文档" 这段会在你鼠标移动到菜单项上或者工具栏项上时,显示到 状态栏 中. 而 "保存"则作为菜单项和工具栏ToolTip的标题.  

        

       这两段字不能在同一个地方动态修改.

       要分为两次.

      A. 修改 前的部分.即  "  保存活动文档 保存 "   中的     "保存活动文档"  串.

      通过在主窗口类中重载虚函数: GetMessageString 实现修改,代码如下:

     

    [cpp] view plain copy
    1. void CMainFrame::GetMessageString(UINT nID, CString& rMessage) const  
    2. {  
    3.           
    4.     CAdoString Str;  
    5.   
    6.     //根据菜单或者工具栏命令ID加载自己的串,否则调用基类函数  
    7.     if( nID == ID_FILE_OPEN)  
    8.     {  
    9.          Str.LoadString(TEXT("IDS_TIP_FILE_OPEN"));  
    10.          rMessage = Str;  
    11.          return;  
    12.     }  
    13.     else if( nID == ID_FILE_NEW )  
    14.     {  
    15.         Str.LoadString(TEXT("IDS_TIP_FILE_NEW"));  
    16.         rMessage = Str;  
    17.         return;  
    18.     }  
    19.   
    20.     CMDIFrameWndEx::GetMessageString(nID, rMessage);  
    21. }  

    B. 修改 之后的部分, 即 "  保存活动文档 保存 "   中的     "保存"  串.

       些串的修改,需要派生CMFCToolBar类, 并重载虚函数OnToolHitTest.  代码如下:

     

    [cpp] view plain copy
    1. INT_PTR CMyMFCToolBar::OnToolHitTest(CPoint point, TOOLINFO* pTI) const  
    2. {  
    3.     static CString strText;  
    4.     CAdoString adoStr;  
    5.     INT_PTR hInt = CMFCToolBar::OnToolHitTest(point,pTI);//先调用基类函数,再修改串.  
    6.     strText = pTI->lpszText;  
    7.     int Index = strText.Find('(');  
    8.     if(Index > 0)  
    9.     {  
    10.         strText.Delete(0,Index);//去掉加速键前的文字,如 "New(Ctrl+N)前面的" new  
    11.     }  
    12.     else  
    13.     {  
    14.         strText.Empty(); //如果没有加速键文本,则全部清空.  
    15.     }  
    16.     if(pTI->uId == ID_FILE_NEW )  
    17.     {  
    18.         adoStr.LoadString(TEXT("TOOL_NEW"));  
    19.           
    20.     }  
    21.     else if(pTI->uId == ID_FILE_OPEN )  
    22.     {  
    23.         adoStr.LoadString(TEXT("TOOL_OPEN"));  
    24.     }  
    25.     else if(pTI->uId == ID_FILE_SAVE)  
    26.     {  
    27.         adoStr.LoadString(TEXT("TOOL_SAVE"));  
    28.     }  
    29.     else  
    30.     {  
    31.         ((CString&)adoStr) = TEXT("Other");  
    32.     }  
    33.     strText = adoStr + strText; //重新组合成: New(Ctrl+N)形式.  
    34.       
    35.     //基类中会释放这个指针pTI->lpszText,但是由于我们要修改这个串,  
    36.     //所以原来的空间不一定够,所以要释放掉原来的,并重新申请,  
    37.     int len = strText.GetLength()*sizeof(TCHAR);  
    38.     TCHAR *pBuf =(TCHAR*)malloc(len+10);  
    39.     memset(pBuf,0,len+10);  
    40.     _tcscpy_s(pBuf,strText.GetLength()+2,strText);  
    41.     free(pTI->lpszText);   
    42.     pTI->lpszText = pBuf;  
    43.   
    44.     return hInt;  
    45. }  

    至此, 动态修改CMFCMenuBar及CMFCToolBar的文字及Prompt,ToolTip文字.就全部完成.

    补充说明:  工具栏上的文字要使得修改后能马上看到效果,则要把如下函数多调用几次.

    [cpp] view plain copy
    1. m_wndToolBar.AdjustLayout();  
    2.     m_wndToolBar.RecalcLayout();  
    3.     m_wndToolBar.CalcFixedLayout(TRUE,FALSE);  
    4.     m_wndToolBar.AdjustLayout();  
    5.     m_wndToolBar.RecalcLayout();  
    6.     m_wndToolBar.CalcFixedLayout(TRUE,TRUE);  
    7.     m_wndToolBar.AdjustLayout();  
    8.     m_wndToolBar.RecalcLayout();  
    9.     m_wndToolBar.CalcFixedLayout(TRUE,TRUE);  

    由于文字改变后,工具栏的重新计算每个工具栏按钮的宽度及整个工具栏的宽度. 所认有以上函数的调用. 至于为什么要调用多次才能正确,确是没有去深究他.

    还有要注意,注册表里面保存有工具栏配置信息, 可能需要删除注册表项. 当然比较好的,还是在在CMFCToolBar的派生类中重载LoadState及SaveState函数,什么也不做,直接返回.

    [cpp] view plain copy
    1. BOOL CMyMFCToolBar::LoadState(  
    2.                        LPCTSTR lpszProfileName/*=NULL*/,  
    3.                        int nIndex/*=-1*/,  
    4.                        UINT uiID/*=(UINT)-1*/   
    5.                        )  
    6. {  
    7.     return TRUE;  
    8. }  


    不知道微软的东西是越来越难用,还是因为不用之不得其道 ,总感觉这些新类除了好看, 用起真是难用之极啊.

  • 相关阅读:
    修改目录所在的组、用户 分类: ubuntu 2013-08-27 15:55 215人阅读 评论(0) 收藏
    python之string模块 分类: python基础学习 python Module 2013-08-27 13:58 241人阅读 评论(0) 收藏
    python参数 分类: python基础学习 python 2013-08-23 15:06 217人阅读 评论(0) 收藏
    依次读取文件中的一个字符 分类: python基础学习 python 小练习 2013-08-22 11:14 289人阅读 评论(0) 收藏
    去除共同元素 分类: python基础学习 2013-08-19 21:38 216人阅读 评论(0) 收藏
    (学习)python非贪婪、多行匹配正则表达式例子 分类: 正则表达式 2013-08-19 11:21 2540人阅读 评论(2) 收藏
    KVM整理
    [BFS] [洛谷] P1443 吗的便利
    [DP] [01] [洛谷] P1510 味精填海
    [暴力] [HPU] 最大数
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468328.html
Copyright © 2011-2022 走看看