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(); } 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wonsoft/archive/2008/08/02/2759089.aspx
|
|