标签:des style class ext get strong
①怎样在程序开始的时候让它最大化?
②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);
这个函数也可以是最大化按钮失效!
并且可以在程序中动态的改变窗口的风格
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();
}
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);
}
[解决方法]
右键菜单是系统菜单,只要将其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;
}
NONCLIENTMETRICS nm
调用SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof(nm),&nm,0)
重设SystemParametersInfo(SPI_SETNONCLIENTMETRICS,sizeof(nm),&nm,0)
最大化、最小化将发送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事件。
[问题提出]
在应用程序的不同运行时期,要反映当前状态往往会修改应用程序标题.
[解决方法]
在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 改变标题"));
运行看看.
[问题提出]
本文将介绍一些使用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);
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;
}
隐藏标题栏 ModifyStyle(WS_CAPTION,0)
隐藏菜单栏 SetMenu(NULL)
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;
}
}
使用语句 CWnd* m_pCWnd = AfxGetMainWnd( ),然后,再以如下形式调用SetWindowText()函数:
SetWindowText( *m_pCWnd,(LPCTSTR)m_WindowText);// m_WindowText可以是一个CString类的变量。
OnContextMenu事件
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();
}
积累的VC编程小技巧之标题栏和菜单,布布扣,bubuko.com
标签:des style class ext get strong
原文地址:http://www.cnblogs.com/lidabo/p/3703487.html