您的位置广东网盟 > 文章资讯 > 软件应用 > 编程开发 > VC/VC++ > 文章内容

积累的VC编程--标题栏和菜单

作者:佚名  来源:不详  发布时间:2008-7-30 21:35:30

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
调用SystemParametersInfoSPI_GETNONCLIENTMETRICS,sizeof(nm),&nm,0

重设SystemParametersInfoSPI_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_CLOSEC++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,命令IDIDC_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");

[1] [2]  下一页

Tags:广东网盟  
  •         用户名: 验证码: 验证码,看不清楚请点击刷新验证码 (注“”为必填内容。)


    文章评论: [ 查看全部 ] 网友评论
    关于网盟 | 网站帮助 | 广告合作 | 下载声明 | 友情连接 | 联系方式

    Copyright © 2003-2008 Gdwg.Net. All Rights Reserved .
    中国广东网管联盟设计维护.网站备案:粤ICP备08020875号