积累的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();
}

积累的VC编程小技巧之标题栏和菜单,布布扣,bubuko.com

时间: 2024-10-09 23:07:42

积累的VC编程小技巧之标题栏和菜单的相关文章

积累的VC编程小技巧之对话框

1.用鼠标移动基于对话框的无标题栏程序的简单方法 void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point) {    //一句话解决问题     SendMessage(WM_SYSCOMMAND,0xF012,0);    CDialog::OnLButtonDown(nFlags, point);} 2.对话框消息映射 有对话框A,B从A中发消息给B然后B处理.准备工作,先定义消息,如下#define WM_B_NOTIFY WM_U

积累的VC编程小技巧之工具提示

1.用鼠标移动基于对话框的无标题栏程序的简单方法 void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point) {    //一句话解决问题     SendMessage(WM_SYSCOMMAND,0xF012,0);    CDialog::OnLButtonDown(nFlags, point);} 2.对话框消息映射 有对话框A,B从A中发消息给B然后B处理.准备工作,先定义消息,如下#define WM_B_NOTIFY WM_U

积累的VC编程小技巧之列表框

1.列表框中标题栏(Column)的添加 创建一个List Control,其ID为IDC_LIST,在其Styles属性项下的View项里选择Report.Align项里选择Top.Sort项里选择None. 然后在该List所在对话框的类(头文件)里创建ClistCtrl的一个对象m_list然后在.cpp文件的OnInitDialog()之类的函数里实现如下代码: CString strname[3]; strname[0]="Screen Name"; strname[1]=&

积累的VC编程小技巧之属性页

1.属性页的添加: 创建对话框的类,该类要从CpropertyPage继承:然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框类的对象m_skatch:最后,在.cpp文件里的OnInitDialog()之类的函数里实现如下代码: m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, 0); //使选项卡的按钮在下面 if(m_tabsheet.m_hWnd) m_tabsheet.

积累的VC编程小技巧之树操作

1.如何在TreeList中加图标? [问题提出]  请问treeview控件和treectrl控件的用法有何不同呢?向如何imagelist控件中加图象呀?  [解决方法]  1)    HICON hicon[8];    m_imageList.Create(16,16,0,8,8);    hicon[0]=AfxGetApp()->LoadIcon(IDI_ICON0);    hicon[1]=AfxGetApp()->LoadIcon(IDI_ICON1);    hicon[2

积累的VC编程小技巧之图标、光标及位图

1.图标透明 (1).Windows中的图标其实是有两个图像组成的,其中一个用于与它要显示的位置的图像做"AND"操作,另一个作"XOR"操作. 透明:用"白色"AND,用"黑色"XOR反色:用"白色"AND,用"白色"XOR正常色:用"黑色"AND,用正常颜色XOR.(2). WIN9X中好像是对像素的操作实现透明的WIN2K中就有API直接实现透明了!WIN2K中

积累的VC编程小技巧之框架窗口及其他

1.修改主窗口风格 AppWizard生成的应用程序框架的主窗口具有缺省的窗口风格,比如在窗口标题条中自动添加文档名.窗口是叠加型的.可改变窗口大小等.要修改窗口的缺省风格,需要重载CWnd::PreCreateWindow(CREATESTRUCT& cs)函数,并在其中修改CREATESTRUCT型参数cs.CWnd::PreCreateWindow 函数先于窗口创建函数执行.如果该函数被重载,则窗口创建函数将使用CWnd::PreCreateWindow 函数返回的CREATESTRUCT

积累的VC编程小技巧之文件操作

1.删除文件夹 // 删除文件夹及其所有内容void CBaseDoc::RemoveFolder(const CString &strPathName){    CString path = strPathName;    if (path.Right(1) != _T("\\"))        path += _T("\\");    path += _T("*.*");    CFileFind ff;    BOOL res =

积累的VC编程小技巧之组合框

1.如何正确的得到ComBox的指针 CComboBox *mComb = (CComboBox*)GetDlgItem(IDC_DuanCB); CComboBox *mComb = (CComboBox*)::GetDlgItem(m_hWnd,IDC_DuanCB); 2.CComboBox控件详解 CComboBox控件又称作组合框控件,其有三种形态可供选择,1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down list). CCom