VC编程之标题栏和菜单

VC编程之标题栏和菜单

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); 
这个 函数也可以是最大化按钮失效! 
并且可以在程序中动态的改变窗口的风格

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();
}

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(...))
和左键单击(CxxToolBar:: OnLButtonDown(...))涵数中分别加入下面代码既可:
if (IsFloating()) //工具条正在浮动状态中
{
   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);
}

 

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;
}

5. 修改标题栏高度

NONCLIENTMETRICS nm

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

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

 

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事件

 

7.如何改变窗口标题?

  [问题提出]
    在应用程序的不同运行时期,要反映当前状态往往会修改应用程序标题.

  [解决方法]
    在MFC类库中提供了CWnd::SetWindowText函数,通过该函数可以改变任何窗体(包括控件)的标题.
    改变主窗体的标题:
    CWnd *m_pMainWnd;
    m_pMainWnd=AfxGetMainWnd();
    m_pMainWnd->SetWindowText(_T("改变标题"));
    当改变多视MDI的子窗口的标题时,用:
    GetParentFrame()->SetWindowText(_T("MDI Child改变标题"));
    当改变按钮的标题时(假设按钮的ID=IDC_BUTTON1):
    GetDlgItem(IDC_BUTTON1)->SetWindowText(_T("Button 改变标题"));
    运行看看.

 

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

  [问题提出]
    本文将介绍一些使用CMenu的方法,如查找指定菜单,在指定选项前添加菜单项.....

  [解决方法]
    使用CWnd::GetMenu( )访问主菜单,GetMenu( )返回指向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",i);//菜单项的位数.
         AfxMessageBox(s);
         ASSERT(pSubMenu);
    }



    2) 动态编辑菜单:
    步骤如下(可以用上例的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)

 

11.动态增加或删除菜单

1、 增加菜单
添加

CMenu *mainmenu;
mainmenu=AfxGetMainWnd()->GetMenu(); //得到主菜单
(mainmenu->GetSubMenu (0))->AppendMenu (MF_SEPARATOR);//添加分隔符
(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 (0))->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;
    }
}

 

12.另一种改变窗口标题的方法

  使用语句 CWnd* m_pCWnd = AfxGetMainWnd( ),然后,再以如下形式调用SetWindowText()函数

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();
}

http://blog.csdn.net/bitxinhai/article/details/2312907

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值