VC60实用小技巧.docx
《VC60实用小技巧.docx》由会员分享,可在线阅读,更多相关《VC60实用小技巧.docx(19页珍藏版)》请在冰豆网上搜索。
![VC60实用小技巧.docx](https://file1.bdocx.com/fileroot1/2022-10/28/e9da1d72-4b72-4c65-b29f-6a6375793bde/e9da1d72-4b72-4c65-b29f-6a6375793bde1.gif)
VC60实用小技巧
1.窗口最大最小化按纽的控制
①怎样在程序开始的时候让它最大化?
②vC做出来的exe文件在窗体的右上方是没有最大化和最小化按钮的,怎样实现这一功能?
③如何在显示窗口时,使最大化按钮变灰?
①在App类里的C…App:
:
InitInstance()中把m_pMainWnd->ShowWindow(SW_SHOW)改成m_pMainWnd->ShowWindow(SW_MAXIMIZE);
②在CreateWidnow时用WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX风格.
③第一种方法:
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs)
{
if(!
CFrameWnd:
:
PreCreateWindow(cs))
returnFALSE;
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
//disablethemaxminibox
cs.style&=~WS_MAXIMIZEBOX;
returnTRUE;
}
第二种方法:
CMenu*pMenu=AfxGetApp()->m_pMainWnd->GetSystemMenu(FALSE);
intx=pMenu->GetMenuItemCount();
UINTpID=pMenu->GetMenuItemID(x-1);
pMenu->EnableMenuItem(pID,MF_DISABLED);
第三种方法:
ModifyStyle(WS_MAXIMIZEBOX,0);
这个函数也可以是最大化按钮失效!
并且可以在程序中动态的改变窗口的风格
2.创建动态菜单
voidCMainFrame:
:
OnSelectState(NMTOOLBAR*pnmtb,LRESULT*plr)
{
CMenumenu;
if(!
menu.CreateMenu())
return;
menu.AppendMenu(MF_STRING,0,"开始");
menu.AppendMenu(MF_STRING,0,"结束");
CRectrc;
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风格显示既可。
BOOLCxxFrameWnd:
:
PreCreateWindow(CREATESTRUCT&cs)
{
cs.style&=~WS_MAXIMIZEBOX;
returnCFrameWnd:
:
PreCreateWindow(cs);
}
4.如何将标题栏上的右键菜单屏蔽掉?
[解决方法]
右键菜单是系统菜单,只要将其WS_SYSMENU的属性去掉即可.
[程序实现]
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
........
longstyle=GetWindowLong(m_hWnd,GWL_STYLE);
style&=~WS_SYSMENU;
SetWindowLong(m_hWnd,GWL_STYLE,style);
return0;
}
5.修改标题栏高度
NONCLIENTMETRICSnm
调用SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof(nm),&nm,0)
重设SystemParametersInfo(SPI_SETNONCLIENTMETRICS,sizeof(nm),&nm,0)
6.窗口最大化、最小化及关闭的消息是什么?
如何截获?
最大化、最小化将发送WM_SYSCOMMAND消息。
要处理该消息,可以这么做:
1、在Form的头文件中添加:
void__fastcallRestrictMinimizeMaximize(TMessage&Msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_SYSCOMMAND,TMessage,RestrictMinimizeMaximize)
END_MESSAGE_MAP(TForm)
2、在Form的单元文件中添加:
void__fastcallTForm1:
:
RestrictMinimizeMaximize(TMessage&Msg)
{
if(Msg.WParam==SC_MINIMIZE)
{
//catchesminimize...
}
elseif(Msg.WParam==SC_MAXIMIZE)
{
//catchesmaximize...
}
TForm:
:
Dispatch(&Msg);
//or"elseTForm:
:
Dispatch(&Msg)"totrap
}
关闭窗口的消息为WM_CLOSE,CBuilder提供了OnClose事件。
7.如何改变窗口标题?
[问题提出]
在应用程序的不同运行时期,要反映当前状态往往会修改应用程序标题.
[解决方法]
在MFC类库中提供了CWnd:
:
SetWindowText函数,通过该函数可以改变任何窗体(包括控件)的标题.
改变主窗体的标题:
CWnd*m_pMainWnd;
m_pMainWnd=AfxGetMainWnd();
m_pMainWnd->SetWindowText(_T("改变标题"));
当改变多视MDI的子窗口的标题时,用:
GetParentFrame()->SetWindowText(_T("MDIChild改变标题"));
当改变按钮的标题时(假设按钮的ID=IDC_BUTTON1):
GetDlgItem(IDC_BUTTON1)->SetWindowText(_T("Button改变标题"));
运行看看.
8.如何用VC动态修改应用程序菜单
[问题提出]
本文将介绍一些使用CMenu的方法,如查找指定菜单,在指定选项前添加菜单项.....
[解决方法]
使用CWnd:
:
GetMenu()访问主菜单,GetMenu()返回指向CMenu对象的指针,它有一些成员函数,答应我们修改一个菜单。
1)如何实现找到一个菜单项:
步骤如下:
{
//动态修改菜单:
//GettheMainMenu
CMenu*pMainMenu=AfxGetMainWnd()->GetMenu();
CMenu*pSubMenu=NULL;
inti;
for(i=0;i<(int)pMainMenu->GetMenuItemCount();i)
{
pSubMenu=pMainMenu->GetSubMenu(i);
if(pSubMenu&&pSubMenu->GetMenuItemID(0)==ID_FILE_NEW)
break;
}
CStrings;
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.屏蔽掉子框架的右上角的关闭按钮
intCChildFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CMDIChildWnd:
:
OnCreate(lpCreateStruct)==-1)
return-1;
。
。
。
CMenu*pSysMenu=GetSystemMenu(FALSE);
pSysMenu->EnableMenuItem(SC_CLOSE,MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
return0;
}
10.隐藏标题栏和菜单栏
隐藏标题栏ModifyStyle(WS_CAPTION,0)
隐藏菜单栏SetMenu(NULL)
11.动态增加或删除菜单
1、增加菜单
添加
CMenu*mainmenu;
m