间客的女主角结局:VC经验技巧:标题栏、按钮、菜单等。 - wonsoft的专栏 - CSDN博客
来源:百度文库 编辑:中财网 时间:2024/05/12 15:37:50
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
{
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
在vc中如何修改按钮等控件的颜色??
我的IE浏览器的菜单和工具按钮都不见了,只有标题栏和一片空白,怎么弄回来?
word文档的菜单怎么添加“保存”“打印预览”“撤销”等按钮?
VC++学习经验
ASP按钮菜单制作实例
做生意的技巧 经验?
如何用VC编写菜单?
VC++用菜单处理图象
请教通过司法考试的高手给点经验,学习方法,技巧等!
ie的地址栏,标准按钮全部没有了?甚至连文件编辑等菜单也没有了?
IE突然坏掉,打开后没有任何按钮,只有标题栏
文件夹窗口标题栏的按钮图案怎么改
在VB6中怎样可以向标题栏中添加按钮?
网业只有标题栏,没有菜单、工具栏怎么办?
VC++中如何添加一个按钮?
关于VC按钮控件的问题
VC++程序的默认按钮问题
关于VC++中的按钮控件子窗口
VC中圆形按钮实现 代码
“开始”按钮,有时单击不能弹出菜单,
下拉菜单的按钮如何调色?
C++ MFC 按钮关联弹出菜单
vfp连编后菜单按钮没有反应
VC如何进行跟踪调试技巧