MFC 修改单文档标题

一、改善标题艺术1:在CMainFrame中PreCreateWindow(CREATESTRUCT
cs卡塔尔(قطر‎举行改进,如下:BOOLCKTLXSubjectShowFrame::PreCreateWindow(CREATESTRUCTcs卡塔尔{//TODO:Addyourspecializedcodehereand/orcallthebaseclasscs.style=~WS_MAXIMIZEBOX;//禁止使用最大化按键cs.style=~WS_SIZEBOX;cs.style=~FWS_ADDTOTITLE;cs.lpszName=_T(测量检验标题卡塔尔(قطر‎;cs.cx=970;cs.cy=650;returnCXTPFrameWnd::PreCreateWindow(csState of Qatar;}方法2:在doc类中OnNewDocument函数改过,增多匡正的标题,如下:BOOLCKTLXSubjectShowDoc::OnNewDocument(卡塔尔{if(!CDocument::OnNewDocument())returnFALSE;SetTitle(_T(测量检验标题卡塔尔State of Qatar;returnTRUE;}二、修正标题后半片段单文书档案标题平日会有两有的构成,比方:标题名称—工程名称,修正StringTable的IDSportage_MAINFRAME的标题,将率先个n在此以前的字符串替换为

 AppWizard生成的应用程序框架的主窗口具有缺省的窗口作风,比方在窗口标题条中自动添Gavin书档案名、窗口是叠合型的、可转移窗口大小等。要校订窗口的缺省风格,供给重载CWnd::PreCreateWindow(CREATESTRUCT&  
cs)函数,并在里头校订CREATESTRUCT型参数cs。
CWnd::PreCreateWindow  
函数先于窗口创设函数实行。假诺该函数被重载,则窗口创设函数将运用CWnd::PreCreateWindow  
函数重返的CREATESTRUCT  
cs参数所定义的窗口作风来创建窗口;不然使用预约义的窗口作风。
CREATESTRUCT构造定义了成立函数创设窗口所用的带头参数,其定义如下:

1.窗口最大最小化按纽的支配

①如何在前后相继起头的时候让它最大化?

②vc++做出来的exe文件在窗体的右上方是绝非最大化和最小化按键的,怎么样达成这一效果与利益?

③什么在彰显窗口时,使最大化按键变灰?

 

在App类里的C…App::InitInstance()中把m_pMainWnd->ShowWindow(SW_SHOW)改成m_pMainWnd->ShowWindow(SW_MAXIMIZE);

在CreateWidnow时用WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX 风格.

    ③ 第一种艺术:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 

if( !CFrameWnd::PreCreateWindow(cs) ) 
return FALSE; 
// TODO: Modify the Window class or styles here by modifying 
//  the CREATESTRUCT cs 
// disable the maxmini box 
cs.style &= ~WS_MAXIMIZEBOX; 
return TRUE; 
}

第二种办法:

CMenu *pMenu=AfxGetApp()->m_pMainWnd->GetSystemMenu(FALSE); 
         int x=pMenu->GetMenuItemCount( ); 
         UINT pID=pMenu->GetMenuItemID(x-1); 
         pMenu->EnableMenuItem(pID, MF_DISABLED);

其二种艺术:

ModifyStyle(WS_MAXIMIZEBOX, 0); 
那几个函数也足以是最大化开关失效! 
还要能够在程序中动态的更改窗口的风骨

 

标题nnTestSingleTitlennnTestSingleTitle.DocumentnTestSingleTitle.Document

[cpp] view
plaincopyprint?

2.创造动态菜单

void CMainFrame::OnSelectState(NMTOOLBAR* pnmtb, LRESULT *plr)

{

       CMenu menu;

       if(!menu.CreateMenu())

       return;

       menu.AppendMenu(MF_STRING,0,”开始”);

       menu.AppendMenu(MF_STRING,0,”结束”);

       CRect rc;

       m_wndToolBar.SendMessage(TB_GETRECT, pnmtb->iItem,
(LPARAM)&rc); 

       m_wndToolBar.ClientToScreen(&rc);

       menu.TrackMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,

                     rc.left, rc.bottom, this, &rc);

//     menu.DestroyMenu();

       menu.detach();

}

 

三、去掉题指标后半局地

  1. typedef   struct   tagCREATESTRUCT   {     
  2. LPVOID   lpCreateParams;   //   创立窗口的基本参数      
  3. HANDLE   hInstance;   //   具有将成立的窗口的模块实例句柄      
  4. HMENU   hMenu;   //   新窗口的菜单句柄      
  5. HWND   hwndParent;   //   新窗口的父窗口句柄      
  6. int   cy;   //   新窗口的冲天      
  7. int   cx;   //   新窗口的宽窄      
  8. int   y;   //   新窗口的左上角Y坐标      
  9. int   x;   //   新窗口的左上角X坐标      
  10. LONG   style;   //   新窗口的风格      
  11. LPCST陆风X8   lpszName;   //   新窗口的名称      
  12. LPCSTTucson   lpszClass;   //   新窗口的窗口类名      
  13. DWOHavalD   dwExStyle;   //   新窗口的扩展参数      
  14. }   CREATESTRUCT;     

    typedef struct tagCREATESTRUCT {
    LPVOID lpCreateParams; // 创制窗口的基本参数
    HANDLE hInstance; // 具备将开创的窗口的模块实例句柄
    HMENU hMenu; // 新窗口的美食指南句柄
    HWND hwndParent; // 新窗口的父窗口句柄
    int cy; // 新窗口的惊人
    int cx; // 新窗口的增长幅度
    int y; // 新窗口的左上角Y坐标
    int x; // 新窗口的左上角X坐标
    LONG style; // 新窗口的风骨
    LPCST兰德酷路泽 lpszName; // 新窗口的称号
    LPCSTHighlander lpszClass; // 新窗口的窗口类名
    DWOPRADOD dwExStyle; // 新窗口的扩充参数
    } CREATESTRUCT;

3.如何制止对话框关闭按键和生成工具条上的系统菜单

1、禁绝对话框中的关闭开关有三种方式。
第一种艺术,用ModiftMenu(卡塔尔涵数来达成:

CMenu* pMenu = this->GetSystemMenu(FALSE);
pMenu->ModifyMenu(SC_CLOSE,MF_BYCOMMAND | MF_GRAYED );

其次种办法,用EnableMenuItem(卡塔尔国涵数来促成:

CMenu* pMenu = this->GetSystemMenu(FALSE);
pMenu->EnableMenuItem( SC_CLOSE, MF_BYCOMMAND|MF_GRAYED);

2、幸免浮动工具条上的体系菜单。
新建八个CToolBar的派生类CxxToolBar,在新类中的左键双击(CxxToolBar::OnLButtonDblClk(…State of Qatar卡塔尔(قطر‎
和左键单击(CxxToolBar:: OnLButtonDown(…State of Qatar卡塔尔国涵数中分头参预上边代码既可:
if (IsFloating(卡塔尔国State of Qatar //工具条正在变化状态中
{
   CWnd* pMiniFrame;
   CWnd* pDockBar;

   pDockBar = GetParent();
   pMiniFrame = pDockBar->GetParent();

   //去除其上系统菜单
   pMiniFrame->ModifyStyle(WS_SYSMENU, NULL);

   //重绘工具条
   pMiniFrame->ShowWindow(SW_HIDE);
   pMiniFrame->ShowWindow(SW_SHOW);
}

3、幸免窗口最大化开关
在PreCreateWindow(卡塔尔(قطر‎涵数中去掉WS_MAXIMIZEBOX风格展现既可。
BOOL CxxFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.style &= ~WS_MAXIMIZEBOX;
    return CFrameWnd::PreCreateWindow(cs);
}

 

办法1:在CTestSingleTitleApp::InitInstance(卡塔尔(قطر‎中调用如下语句m_pMainWnd-SetWindowText(_T(标题卡塔尔(قطر‎State of Qatar;或在其余地方用(AfxGetMainWnd(State of QatarState of Qatar-SetWindowText(_T(标题卡塔尔State of Qatar;也足以获得平等的结果。

 

4.什么样将题目栏上的右键菜单屏蔽掉?

  [赶尽杀绝办法]
    右键菜单是系统菜单,只要将其WS_SYSMENU的属性去掉就可以.
  [程序实现]
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
         ……..
   long style = GetWindowLong(m_hWnd, GWL_STYLE);
         style &= ~WS_SYSMENU;
         SetWindowLong(m_hWnd, GWL_STYLE, style);

   return 0;
    }

 

艺术2:可以由此选择CWnd::SetWindowText即:void SetWindowText( LPCTST奥迪Q7lpszString 卡塔尔(قطر‎;重载CFramWnd类的OnUpdateFrameTitle函数

CREATESTRUCT结构的style域定义了窗口的风格。举个例子,缺省的MDI主窗口的风骨中就总结FWS_ADDTOTITLE(在题目条中突显当前的行事文书档案名)、FWS_PREFIXTITLE(把文书档案名放在程序标题的前边)、WS_THICKFRAME(窗口具备可缩放的边框)等作风。由于各个风格参数由逻辑或(“|”)组合在一齐的,由此加多某种风格,就只需用“|”把相应的参数加到CREATESTRUCT布局的style域中;删除已部分风格,则需用“&”连接CREATESTRUCT布局的style域与该风格的逻辑非值。
CREATESTRUCT布局的x、y、cx、cy域分别定义了窗口的发端地方和大小,由此,在CWnd::PreCreateWindow  
函数中给它们赋值,将能定义窗口的起来展现地点和尺寸。
下例中的代码将主框窗口的大小将固定为1/3显示器,标题条中仅展现窗口名,不突显文书档案名。

5.改换标题栏中度

NONCLIENTMETRICS nm

调用SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof(nm),&nm,0)

重设SystemParametersInfo(SPI_SETNONCLIENTMETRICS,sizeof(nm),&nm,0)

 

voidCMainFrame::OnUpdateFrameTitle(BOOLbAddToTitle卡塔尔{//TODO:在这里增加专项使用代码和/或调用基类
SetWindowText(_T(标题));CFrameWnd::OnUpdateFrameTitle(bAddToTitle);}

[cpp] view
plaincopyprint?

6.窗口最大化、最小化及停业的消息是什么样?怎样收获?

最大化、最小化将发送WM_SYSCOMMAND新闻。要拍卖该音信,能够如此做: 
    1、在Form的头文件中拉长: 
     void __fastcall RestrictMinimizeMaximize(TMessage &Msg); 
     
     BEGIN_MESSAGE_MAP 
     MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage,
RestrictMinimizeMaximize) 
     END_MESSAGE_MAP(TForm) 
    2、在Form的单元文件中加上: 
     
     void __fastcall TForm1::RestrictMinimizeMaximize(TMessage&
Msg) 
     { 
     if (Msg.WParam == SC_MINIMIZE) 
     { 
     //catches minimize… 
     } 
     else if (Msg.WParam == SC_MAXIMIZE) 
     { 
     //catches maximize… 
     } 
     TForm::Dispatch(&Msg); 
     // or “else TForm::Dispatch(&Msg)” to trap 
     } 
    关闭窗口的音信为WM_CLOSE,C++Builder提供了OnClose事件。

 

措施3:在CMainFrame的PreCreateWindow函数中期维修改窗口作风:

  1. BOOL   CMainFrame::PreCreateWindow(CREATESTRUCT&   cs)     
  2. {     
  3. //   TODO:   Modify   the   Window   class   or   styles   here   by   modifying   
      
  4. //   the   CREATESTRUCT   cs      
  5.   
  6. //   改良主窗风格      
  7. cs.style   &=   ~FWS_ADDTOTITLE;   //去除标题条中的文书档案名      
  8. cs.style   &=   ~WS_THICKFRAME;   //去除可改换大小的边框      
  9. cs.style   |=   WS_DLGFRAME;   //增添无法改善大小的边框      
  10.   
  11. //   分明主窗的朗朗上口和早先地方      
  12. int   cxScreen   =   ::GetSystemMetrics(SM_CXSCREEN卡塔尔国;//获得显示屏宽      
  13. int   cyScreen   =   ::GetSystemMetrics(SM_CYSCREEN卡塔尔(قطر‎;   //获得显示器高      
  14. cs.x   =   0;   //   主窗坐落于左上角   
      
  15. cs.y   =   0;     
  16. cs.cx   =   cxScreen/2;   //   主窗宽为三分之一显示器宽      
  17. cs.cy   =   cxScreen/2;   //   主窗高为四分之二荧屏高      
  18. return   CMDIFrameWnd::PreCreateWindow(cs);     
  19. }   

    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
    // TODO: Modify the Window class or styles here by modifying
    // the CREATESTRUCT cs

    // 改良主窗风格
    cs.style &= ~FWS_ADDTOTITLE; //去除标题条中的文书档案名
    cs.style &= ~WS_THICKFRAME; //去除可改造大小的边框
    cs.style |= WS_DLGFRAME; //扩大不能更正大小的边框

    // 鲜明主窗的深浅和先导地方
    int cxScreen = ::GetSystemMetrics(SM_CXSCREEN卡塔尔;//取得显示屏宽
    int cyScreen = ::GetSystemMetrics(SM_CYSCREENState of Qatar; //得到显示屏高
    cs.x = 0; // 主窗坐落于左上角
    cs.y = 0;
    cs.cx = cxScreen/2; // 主窗宽为52%显示屏宽
    cs.cy = cxScreen/2; // 主窗高为53%显示屏高
    return CMDIFrameWnd::PreCreateWindow(cs);
    }

7.怎么着转移窗口题目?

  [主题材料建议]
    在应用程序的差异运转年代,要展示当前气象往往会改善应用程序标题.

  [赶尽杀绝办法]
    在MFC类库中提供了CWnd::SetWindowText函数,通过该函数能够变动任何窗体(包罗控件State of Qatar的标题.
    退换主窗体的标题:
    CWnd *m_pMainWnd;
    m_pMainWnd=AfxGetMainWnd();
    m_pMainWnd->SetWindowText(_T(“更正标题”卡塔尔(قطر‎卡塔尔(قطر‎;
    当退换多视MDI的子窗口的标题时,用:
    GetParentFrame()->SetWindowText(_T(“MDI Child改造标题”State of Qatar卡塔尔国;
    当退换开关的标题时(假诺按键的ID=IDC_BUTTON1):
    GetDlgItem(IDC_BUTTON1)->SetWindowText(_T(“Button 改变标题”卡塔尔(قطر‎卡塔尔国;
    运营看看.

 

BOOLCMainFrame::PreCreateWindow(CREATESTRUCTcs){cs.style=~(LONG)FWS_ADDTOTITLE;returnCFrameWnd::PreCreateWindow(cs);}

 

8.如何用VC++ 动态修正应用程序菜单

  [难题建议]
    本文将介绍部分利用CMenu的法子,如搜寻内定菜单,在钦点选项前加多菜单项…..

  [消除措施]
    使用CWnd::GetMenu( 卡塔尔访谈主菜单,GetMenu(
State of Qatar重临指向CMenu对象的指针,它有局地分子函数,允许大家改革二个美食指南。
    1卡塔尔国 怎样达成找到二个菜单项:
    步骤如下:
    {
         //动态校勘菜单:
         // Get the Main Menu
         CMenu* pMainMenu = AfxGetMainWnd()->GetMenu();
         CMenu* pSubMenu = NULL;
         int i;
         for (i=0; i<(int)pMainMenu->GetMenuItemCount(); i++)
         {
            pSubMenu = pMainMenu->GetSubMenu(i);
            if (pSubMenu && pSubMenu->GetMenuItemID(0) ==
ID_FILE_NEW)
               break;
         }
         CString s;
         s.Format(“%d”,iState of Qatar;//菜单项的位数.
         AfxMessageBox(s);
         ASSERT(pSubMenu);
    }

    2State of Qatar 动态编辑菜单:
    步骤如下(能够用上例的pSubMenu,要加的菜谱你和煦定义.卡塔尔(قطر‎:
    1卡塔尔(قطر‎ 增添四个号称Wzd2,命令ID为IDC_NAME_NEW1的菜单命令到该菜单中,能够用:
         pSubMenu->AppendMenu(0,IDC_NAME_NEW1,”New&1″);

    2) 在New1前插入New2,可以用:
        
pSubMenu->InsertMenu(IDC_NAME_NEW1,MF_BYCOMMAND,IDC_NAME_NEW2,
“New&2”);

    3) 把New1改变成New3,可以用:
        
pSubMenu->ModifyMenu(IDC_NAME_NEW1,MF_BYCOMMAND,IDC_NAME_NEW3,
“New&3”);

    4卡塔尔(قطر‎ 删除该菜单中第二项,能够用:
         pSubMenu->RemoveMenu(1,MF_BYPOSITION);

 

修改窗口类,完毕转移背景颜色

9.屏蔽掉子框架的右上角的闭馆开关

 int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
。。。
    CMenu* pSysMenu = GetSystemMenu(FALSE);
    pSysMenu->EnableMenuItem(SC_CLOSE,MF_BYCOMMAND
|MF_DISABLED|MF_GRAYED);
    return 0;
}

 

方法一:

10.隐藏标题栏和菜单栏

藏匿标题栏 ModifyStyle(WS_CAPTION,0)
隐蔽菜单栏 SetMenu(NULL卡塔尔国

 

[cpp] view
plaincopyprint?

11.动态扩大或删除菜单

1、 扩大菜单
添加

CMenu *mainmenu;
mainmenu=AfxGetMainWnd(卡塔尔(قطر‎->GetMenu(卡塔尔国; //取得主菜单
(mainmenu->GetSubMenu (0))->AppendMenu
(MF_SEPARATOMuranoState of Qatar;//加多分隔符
(mainmenu->GetSubMenu
(0))->AppendMenu(MF_STRING,ID_APP_ABOUT,
                                        _T(“Always on &Top”卡塔尔卡塔尔;
//增多新的菜单项
                                        DrawMenuBar(卡塔尔(قطر‎; //重画菜单

2、 删除菜单

删除

CMenu *mainmenu;
mainmenu=AfxGetMainWnd(卡塔尔->GetMenu(卡塔尔国; //获得主菜单

CString str ;
for(int i=(mainmenu->GetSubMenu
(0State of QatarState of Qatar->GetMenuItemCount(卡塔尔国-1;i>=0;i–卡塔尔 //得到菜单的项数。
{
    (mainmenu->GetSubMenu
(0))->GetMenuString(i,str,MF_BYPOSITION);
    //将钦定菜单项的竹签拷贝到钦定的缓冲区。MF_BYPOSITION的解释见上。
    if(str==”Always on &Top”卡塔尔 //假如是刚刚我们扩充的菜单项,则删除。
    {
        (mainmenu->GetSubMenu
(0))->DeleteMenu(i,MF_BYPOSITION);
        break;
    }
}

 

  1. BOOL CMainWindow::PreCreateWindow(CREATESTRUCT& cs)  
  2. {  
  3.     // TODO: 在这增加专项使用代码和/或调用基类
      
  4.     if( CFrameWnd::PreCreateWindow(cs))  
  5.     {     
  6.         //改造窗口类   
  7.         WNDCLASS   wndclass;   
  8.   
  9.         ::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass);   
  10.         //wndclass.hbrBackground   =   (HBRUSH)(COLOR_3DFACE   +   1); 
      
  11.         //wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
      
  12.         wndclass.hbrBackground=CreateSolidBrush(RGB(0,100,100));  
  13.         wndclass.hbrBackground=m_BKBrush;//m_BKBrush无法为函数局地变量   
  14.         wndclass.hbrBackground=*(new CBrush(陆风X8GB(25,25,0卡塔尔卡塔尔卡塔尔;//最方便的法门   
  15.         //wndclass.hCursor   =   AfxGetApp()-> LoadCursor(IDC_CURSOR1); 
      
  16.         wndclass.lpszClassName   =   _T(“newViewClassName “);   
  17.         VERIFY(AfxRegisterClass(&wndclass));   
  18.         cs.lpszClass=wndclass.lpszClassName;  
  19.         return TRUE;  
  20.     }  
  21.     return FALSE;  
  22. }  

    BOOL CMainWindow::PreCreateWindow(CREATESTRUCT& cs)
    {

    // TODO: 在此添加专用代码和/或调用基类
    if( CFrameWnd::PreCreateWindow(cs))
    {   
        //改变窗口类
        WNDCLASS   wndclass; 
    
        ::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass); 
        //wndclass.hbrBackground   =   (HBRUSH)(COLOR_3DFACE   +   1); 
        //wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
        wndclass.hbrBackground=CreateSolidBrush(RGB(0,100,100));
        wndclass.hbrBackground=m_BKBrush;//m_BKBrush不能为函数局部变量
        wndclass.hbrBackground=*(new CBrush(RGB(25,25,0)));//最方便的方法
        //wndclass.hCursor   =   AfxGetApp()-> LoadCursor(IDC_CURSOR1); 
        wndclass.lpszClassName   =   _T("newViewClassName "); 
        VERIFY(AfxRegisterClass(&wndclass)); 
        cs.lpszClass=wndclass.lpszClassName;
        return TRUE;
    }
    return FALSE;
    

    }

12.另一种转移窗口题指标艺术

  使用语句 CWnd* m_pCWnd = AfxGetMainWnd(
卡塔尔国,然后,再以如下格局调用SetWindowText(State of Qatar函数:

SetWindowText( *m_pCWnd,(LPCTSTR)m_WindowText);//
m_WindowText能够是一个CString类的变量。

 

 

13.上下文菜单事件触发事件

OnContextMenu事件

 

方法二:

14.显得和藏身程序菜单

CWnd *pWnd=AfxGetMainWnd();
if(b_m卡塔尔 //隐藏菜单
{
    pWnd->SetMenu(NULL);
    pWnd->DrawMenuBar();
    b_m=false;
}
else
{
    CMenu menu;
    menu.LoadMenu(IDR_MAINFRAME卡塔尔国; ////突显菜单 也可转移菜单项
    pWnd->SetMenu(&menu);
    pWnd->DrawMenuBar();
    b_m=true;
    menu.Detach();
}

 

[cpp] view
plaincopyprint?

  1. BOOL CMFC_单文档View::PreCreateWindow(CREATESTRUCT& cs)  
  2. {  
  3.     WNDCLASS   wndclass;     
  4.   
  5.     //1.调用基类的同名函数,以自动生成一个窗口类供改进  
  6.     CView::PreCreateWindow(cs);  
  7.       
  8.     //2.得到窗口类   
  9.     ::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass);  
  10.   
  11.     //3.改革窗口类   
  12.     wndclass.hbrBackground=CreateSolidBrush(RGB(0,100,100));    
  13.     OutputDebugString(wndclass.lpszClassName);  
  14.   
  15.     //4.更新窗口类   
  16.     //反注册MFC自动生成的窗口类(因为新旧窗口类名称一致)
      
  17.     ::UnregisterClass(cs.lpszClass,AfxGetInstanceHandle());  
  18.     //注册改善后的窗口类   
  19.     AfxRegisterClass(&wndclass);  
  20.   
  21.     //因为新旧窗口类名称一致,不必实践上边那句代码
      
  22.     //cs.lpszClass=wndclass.lpszClassName;
      
  23.       
  24.     //注意重回TRUE   
  25.     return TRUE;  
  26. }  
You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图