您好,欢迎来到好走旅游网。
搜索
您的当前位置:首页VC编程之标题栏和菜单

VC编程之标题栏和菜单

来源:好走旅游网


VC编程之标题栏和菜单 (转)

VC编程之标题栏和菜单 收藏

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\菜单项的位数.

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/bitxinhai/archive/2008/04/21/2312907.aspx

分享

0

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- haog.cn 版权所有 赣ICP备2024042798号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务