1. 窗口最大最小化按纽的控制
① 怎样在程序开始的时候让它最大化?
② v 做出来的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的
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,Builder
7. 如何改变窗口标题 ?
[问题提出 ] 在应用程序的不同运行时期,要反映当前状态往往会修改应用程序标题. [解决方法] 在MFC类库中提供了CWnd::SetWindowText,
8. 如何用 V 动态修改应用程序菜单
[问题提出 ] 本文将介绍一些使用CMenu的方法,如查找指定菜单,在指定选项前添加菜单项..... [解决方法] 使用CWnd::GetMenu( )访问主菜单,GetMenu( )返回指向CMenu对象的
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(); }