积累的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(); }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值