现在的位置: 首页 > 综合 > 正文

VC经验技巧:标题栏、按钮、菜单等。

2013年02月28日 ⁄ 综合 ⁄ 共 6116字 ⁄ 字号 评论关闭

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

调用SystemParametersInfoSPI_GETNONCLIENTMETRICS,sizeof(nm),&nm,0

重设SystemParametersInfoSPI_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_CLOSEC++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,命令IDIDC_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();
}

 

(源文:http://hi.baidu.com/love_%CD%AE/blog/item/9e5a2e464e3e370d6b63e5dc.html

)

抱歉!评论已关闭.