MFC菜单、工具栏、状态栏

MFC菜单

1 MFC菜单相关类

CMenu类 -封装HMENU句柄,及相关的菜单的API函数.

2 菜单的用法

再来建一遍项目吧(还没到想吐的地步)

1.

计算机生成了可选文字: 王在共享FIlesProjedsotherDOCUmentS一司ATLc0M仰pwiZ”『d…兰Audi0E丝eCtDMo岁i'”『d国Cluste'Res"urceType朔2”『d网f""tom仰pwiZ”『d瞥uatab"seProj"ct陛oeVstudi0A四一inwiZard…夕91『ectMusicT001wiZa『d陀91『eCtx9APpwi砂『d隧Ext竺n哇edsto『edP『oc湖Z”『d旧lsAPIExte"51""wi'”『d阴M竺ketile晚MFCActivexControlwiZard团MFCApp湖zard!dll】朋MFcApp钻zard【exe!.卜Newoatabasewizard酬概絮糕司到win32staticLibra甲2溉黔Location:0:、MFC\day02、codes、MFCMenu日C!eatenewworkspace‘创dtocurrentworkspace一旦ependenCyof:terMS一刁l而而花节饰1ication国win32DvnamioLinkLibra甲《pla廿orms:护V晒n32》

2.

计算机生成了可选文字: fin32么pplication一Step1ofl正在共,口1口What匕ndofwindowsapplicationwouldyou!iketocreate?广An炙mptyprojed.广A切Iical''Hello业orld!,"applica石on.

3.修改stdafx.h头文件,将#include <Windows.h> 改成#include <afxwin.h>

4.

计算机生成了可选文字: ProjectSetting,口口口口口口口口口口口口口口口口;ett.ngsror:画丽而硫了三}Gene『。.}oeou,Ic,c二1unkl正在共享口}口ReSOUr〔esM几下困邸Mrccons0le。+}即Mrcolg}+.和Mrcoll。印泣二丝勿曰jSourceFIles固MFCMsg.印p固stdAfx.cpp白JHeaderFiles回StdAfx.h卜一」ResourceFIles一国ReadMe·树+廖MFCMulti.+1即Mrcsingle.+1即MrCStatlc·郎助nMFcMicrosottFoundati0DClasseS:outputdiredoriesIntermed.ate勺es:10ebugoutput亚iles:唇bug-厂Allowpe卜configuration亘ependencies}不灭一刁“""ce'

5.删掉MFCMenu.cpp文件中的WinMain()函数

6.添加资源脚本文件

计算机生成了可选文字: 绝/,x一『l剑一.一拐为一,照尹口户华~’一”、.由口“'"'"'卜t.rt卜oJ.ct自哆日口11tG'oba'Sj电巳公,卜:ld1001,岌云nd,廿.lp吧国官叭…~ndP『ocBase日的下到阵:9.oba.memoe,:习今W1nMain习\,公日件即窗宝和冲嘎0参幽占!戴右叼Wol·ksp·孝C111dMs曰留MFCM(日口50111'固MF(固5tC日。I}ead正在共享FileSProjeds1Workspacesothe『DOCtlmentS!一阅ACtiveSe陇rPage习日ina甲rile川8itmapFIIe函CIC++HeadelFIIe函C++Sour二FIIe份CursorFIIe因HTMLPage一、IconFile口创dtoproiect:陌rCMen。FileResourceScr西pt不亏丽花厄了而下SOLScriptFIIeTeXtFi!eateLo'ation:D:、MFC、day02、codes、MFCMenu国5tJ}鲁日l+}砂困覃aReSC国Rea(]二ExteReg15W11dMS一一一一口…匡三三习一竺竺口l

7.在资源视图中,添加一个菜单资源IDR_MAINFRM

计算机生成了可选文字: 旧弓谧J止MFCMCflufCS0ufjMenU匆}IDR_MAINFRM

8.设计菜单资源

计算机生成了可选文字: 文件电);退出以)

文件

退出

ID_EXIT

9.编译当前项目。会生成一个resource.h的文件。将它添加到项目中。

 

准备工作做好之后,开始进入程序编写。

转到MFCMenu.cpp文件中,按照之前的步骤,添加theApp之类的东西。注意引用resource.h头文件。

// MFCMenu.cpp : Defines the entry point for the application.

//

 

#include "stdafx.h"

#include "resource.h"

 

class CMenuFrame : public CFrameWnd

{

        DECLARE_MESSAGE_MAP( )

public:

        afx_msg void OnExit( );

};

 

BEGIN_MESSAGE_MAP( CMenuFrame, CFrameWnd )

        ON_COMMAND( ID_EXIT, OnExit )

END_MESSAGE_MAP( )

 

void CMenuFrame::OnExit( )

{

        PostQuitMessage( 0 );

}

 

class CMenuApp : public CWinApp

{

public:

        virtual BOOL InitInstance( );

};

 

CMenuApp theApp;

 

BOOL CMenuApp::InitInstance( )

{

        CMenuFrame * pWnd = new CMenuFrame( );

        //创建一个带菜单的Frame窗口

        pWnd->Create( NULL, "MenuApp",

                WS_OVERLAPPEDWINDOW,

                CFrameWnd::rectDefault, NULL,

                MAKEINTRESOURCE(IDR_MAINFRM) );

        m_pMainWnd = pWnd;

        m_pMainWnd->ShowWindow( SW_SHOW );

        m_pMainWnd->UpdateWindow( );

 

        return TRUE;

}

 

3.其他

前面写的DECLARE_MESSAGE_MAP之类的宏都是写在CFrameWnd(继承自CWnd)中的,可不可以写在CMenuApp(继承自CWinApp)中呢?

答案是可以的。他们都继承自CCmdTarget这个类。这个类封装了消息映射的所有公共的东西,是“命令的终点”。

是继承CCmdTarget的子类,都可以添加消息映射机制.

 

这样的话,我们就可以修改一下代码,增加一个菜单项,用CMenuApp来响应

1.增加关于菜单项

计算机生成了可选文字: 文件亿〕帮助电)厂..j''''’关于伍)

帮助

关于

ID_ABOUT

2.修改代码

// MFCMenu.cpp : Defines the entry point for the application.

//

 

#include "stdafx.h"

#include "resource.h"

 

class CMenuFrame : public CFrameWnd

{

        DECLARE_MESSAGE_MAP( )

public:

        afx_msg void OnExit( );

};

 

BEGIN_MESSAGE_MAP( CMenuFrame, CFrameWnd )

        ON_COMMAND( ID_EXIT, OnExit )

END_MESSAGE_MAP( )

 

void CMenuFrame::OnExit( )

{

        PostQuitMessage( 0 );

}

 

class CMenuApp : public CWinApp

{

        DECLARE_MESSAGE_MAP( )

public:

        virtual BOOL InitInstance( );

        afx_msg void OnAbout( );

};

 

CMenuApp theApp;

 

BEGIN_MESSAGE_MAP( CMenuApp, CWinApp )

        ON_COMMAND( ID_ABOUT, OnAbout )

END_MESSAGE_MAP( )

 

BOOL CMenuApp::InitInstance( )

{

        CMenuFrame * pWnd = new CMenuFrame( );

        //创建一个带菜单的Frame窗口

        pWnd->Create( NULL, "MenuApp",

                WS_OVERLAPPEDWINDOW,

                CFrameWnd::rectDefault, NULL,

                MAKEINTRESOURCE(IDR_MAINFRM) );

        m_pMainWnd = pWnd;

        m_pMainWnd->ShowWindow( SW_SHOW );

        m_pMainWnd->UpdateWindow( );

 

        return TRUE;

}

 

void CMenuApp::OnAbout( )

{

        AfxMessageBox( "About MenuApp 1.0",

                MB_ICONINFORMATION|MB_OK );

}

 

工具栏

1 MFC工具栏相关的类

CToolBar - 父类是CControBar,提供了与框架窗口相关的支持。

CToolBarCtrl - 父类是CWnd,对Win32下的Toolbar控件进行封装。

在MFC程序当中,一般使用CToolBar创建工具栏,如果要进更多工具栏的操作,需要使用CToolBarGetToolBarCtrl函数获取该工具栏的CToolBarCtrl类。

 

又来写MFC程序吧。之所以不直接创建一个MFC应用程序,是为了远离向导,这样可以更清楚地明白向导都干嘛了。

计算机生成了可选文字: 正在共李F"esProjects}o,he『Documen,51画奸LcoM仰pwizard习惭n32stati。Li。『a甲幼AudioEffectDMOWizard面cIusterResourcefype湖zard习custom却pwizard卿DatabaseProiect粤。。vstudi。Add一inwiz。rd心DirectMusic丁001wiz。rd口0ire以9Appwizard幽〔xtendedst。redpr。。wi:。rd心IsApl助ensi。nwiZ。rd曰M。kefile璐M「cAct扮exc。n.『。l惭:。rd团MFCApp彻zard【dll】国MrcApp惭zardlexelr齐Newoatab。sewl:。rdr'UtilitVploieCt2鱼画里亘』鱼皿里}Mrc丁001日arLocation:}o人Mrc\o解03、coo〔s、Mrc丁。。I日广C里eatenewwolkspace‘创dtocurrentworkspace厂旦ependenCyof:1胆认雌n32勺叭丽3卫APplication丽而花不p-P1ication困win32DvnamioLinkLibra作《plattofms:护气Vin32》

计算机生成了可选文字: pp.p是不橄一}‘习区…What匕ndofwindowsapplicationwouldyou1iketocreate?广An'mptyproieCI·孺黔湍豁c"''""'《日aCkNext>Cance'}目泊幽肠

修改stdafx.h头文件,将#include <Windows.h> 改成#include <afxwin.h>

计算机生成了可选文字: r--{ProiectSettin〔s正在共李旦ett'ngsFor:画而而丽犷;Genera'}Debugl二++ReSOUrCeSMiCr0S0ttFOUndationClaSSeS:Inabnare口JSourceFIles凶StdAfx.cpp因winMFc.cppjHeaderFIles国StdAfx.h一ResoulceFlles固ReadMe.tXtoutputdiredoliesIntermediate6IeS:outputIIles:{De"""「Allowpe卜configuration且ependencies_卿叫」

删掉MFCToolBar.cpp文件中的WinMain()函数

添加资源脚本文件

计算机生成了可选文字: 卿回“:"'""卜t.rt卜oJ.ct卜几ldIoolt!几。d时艺.lp涪日爆电巳公-吧国官叭}丽丽而户而丽死月习之IAllclassmembers』,INomembers一CreateCIC++Memb、,__,:_..r_、__一司l含、_1._。,__,。_沛~__“也‘日件即,参幽乙生胃窗和冲嘎0//名重二酒帼Wol,ks「、多MFCT(曰。50111山MF(因St(日J!}ea〔国St〔匀ReS〔国Rea〔王口EXt(正在共享一陌F"es}ProjeCts}wo'spaces}otherDocumen,s}ACtiveServerPage巴巴P"ry仁)竺侧日{少a只.r'.c._~}目上沁于二”e”。竺.r""}目上于于b”竺严r""}憋吮竺艺夕r:',eL畏尸’M乞少ge1llC0nrllel‘鱼ddtoproieCt:画rCT00’日”『,一一日File3应巫亘犷一一囚ResourceScript娜依筋价在飞饰.国SOLS州ptFIIe面丁extFIIe孙teLocation:)D:、MFC、da,03、codes训rc、0.瓦CanCe!

在资源视图中,添加一个菜单资源IDR_MAINFRM

计算机生成了可选文字: 旧弓谧J止MFCMCflufCS0ufjMenU匆}IDR_MAINFRM

设计菜单资源

计算机生成了可选文字: 文件电);退出以)

文件

退出

ID_EXIT

编译当前项目。会生成一个resource.h的文件。将它添加到项目中。

 

准备工作完毕。

接下来转到MFCToolBar.cpp文件中,按照之前的步骤,添加theApp之类的东西。注意引用resource.h头文件。

// MFCToolBar.cpp : Defines the entry point for the application.

//

 

#include "stdafx.h"

#include "resource.h"

 

class CToolBarFrame : public CFrameWnd

{

public:

};

 

class CToolBarApp : public CWinApp

{

public:

    virtual BOOL InitInstance( );

};

 

CToolBarApp theApp;

 

BOOL CToolBarApp::InitInstance( )

{

    CToolBarFrame * pWnd = new CToolBarFrame( );

    pWnd->Create( NULL, "ToolBarApp",

        WS_OVERLAPPEDWINDOW,

        CFrameWnd::rectDefault, NULL,

        MAKEINTRESOURCE(IDR_MAINFRM) );

    m_pMainWnd = pWnd;

    m_pMainWnd->ShowWindow( SW_SHOW );

    m_pMainWnd->UpdateWindow( );

    return TRUE;

}

 

下一步,为CToolBarFrame类添加消息映射

// MFCToolBar.cpp : Defines the entry point for the application.

//

 

#include "stdafx.h"

#include "resource.h"

 

class CToolBarFrame : public CFrameWnd

{

    DECLARE_MESSAGE_MAP( )

public:

    afx_msg void OnExit( );

};

 

BEGIN_MESSAGE_MAP( CToolBarFrame, CFrameWnd )

    ON_COMMAND( ID_EXIT, OnExit )

END_MESSAGE_MAP( )

 

void CToolBarFrame::OnExit( )

{

    PostQuitMessage( 0 );

}

 

class CToolBarApp : public CWinApp

{

public:

    virtual BOOL InitInstance( );

};

 

CToolBarApp theApp;

 

BOOL CToolBarApp::InitInstance( )

{

    CToolBarFrame * pWnd = new CToolBarFrame( );

    pWnd->Create( NULL, "ToolBarApp",

        WS_OVERLAPPEDWINDOW,

        CFrameWnd::rectDefault, NULL,

        MAKEINTRESOURCE(IDR_MAINFRM) );

    m_pMainWnd = pWnd;

    m_pMainWnd->ShowWindow( SW_SHOW );

    m_pMainWnd->UpdateWindow( );

    return TRUE;

}

 

创建工具栏。在OnCreate函数中创建,因此,需要加WM_CREATE消息响应。

// MFCToolBar.cpp : Defines the entry point for the application.

//

 

#include "stdafx.h"

#include "resource.h"

 

class CToolBarFrame : public CFrameWnd

{

    DECLARE_MESSAGE_MAP( )

public:

    afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct );

    afx_msg void OnExit( );

};

 

BEGIN_MESSAGE_MAP( CToolBarFrame, CFrameWnd )

    ON_WM_CREATE( )

    ON_COMMAND( ID_EXIT, OnExit )

END_MESSAGE_MAP( )

 

int CToolBarFrame::OnCreate( LPCREATESTRUCT lpCreateStruct )

{

    CFrameWnd::OnCreate( lpCreateStruct );

 

    return 1;

}

 

void CToolBarFrame::OnExit( )

{

    PostQuitMessage( 0 );

}

 

class CToolBarApp : public CWinApp

{

public:

    virtual BOOL InitInstance( );

};

 

CToolBarApp theApp;

 

BOOL CToolBarApp::InitInstance( )

{

    CToolBarFrame * pWnd = new CToolBarFrame( );

    pWnd->Create( NULL, "ToolBarApp",

        WS_OVERLAPPEDWINDOW,

        CFrameWnd::rectDefault, NULL,

        MAKEINTRESOURCE(IDR_MAINFRM) );

    m_pMainWnd = pWnd;

    m_pMainWnd->ShowWindow( SW_SHOW );

    m_pMainWnd->UpdateWindow( );

    return TRUE;

}

 

下面在OnCreate中创建工具栏。

创建工具栏的步骤如下:

1 添加工具栏资源

在资源视图中,添加一个ToolBar资源,重命名为IDR_MAINFRM

计算机生成了可选文字: 曰JMFCT001BaffCS01三。MenU匆1DR_\ll:\1NFRM曰目ToO1bal,二}IDR_MAINFRM

然后在右边的编辑器上随便画一些什么

计算机生成了可选文字: 卜尸MFCT001Bar』MellU‘气…匠亘」.兰兰兰…………………卜.……....……鱼1l)R_MA1NF!三JTOO1bal·,…1DR_MA1NFI:吕......……......…….....……....……l尹奋‘一、

双击编辑器画面,修改按钮IDID_EXIT。和菜单项的ID一样。

2 添加CToolBar

  创建工具栏

    --Create或CreateEx创建工具栏

  加载工具栏资源

    --LoadToolBar加载工具栏资源.

// stdafx.h

#include <afxwin.h>

//CToolBar使用的头文件

#include <afxext.h>

// MFCToolBar.cpp : Defines the entry point for the application.

//

 

#include "stdafx.h"

#include "resource.h"

 

class CToolBarFrame : public CFrameWnd

{

    DECLARE_MESSAGE_MAP( )

public:

    afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct );

    afx_msg void OnExit( );

 

public:

    //工具栏成员变量

    CToolBar m_wndToolBar;

};

 

BEGIN_MESSAGE_MAP( CToolBarFrame, CFrameWnd )

    ON_WM_CREATE( )

    ON_COMMAND( ID_EXIT, OnExit )

END_MESSAGE_MAP( )

 

int CToolBarFrame::OnCreate(

       LPCREATESTRUCT lpCreateStruct )

{

    CFrameWnd::OnCreate( lpCreateStruct );

 

    //创建ToolBar

    if( FALSE == m_wndToolBar.Create( this ) )

    {

        return 1;

    }

    //加载工具栏资源

    m_wndToolBar.LoadToolBar( IDR_MAINFRM );

 

    return 1;

}

 

void CToolBarFrame::OnExit( )

{

    PostQuitMessage( 0 );

}

 

class CToolBarApp : public CWinApp

{

public:

    virtual BOOL InitInstance( );

};

 

CToolBarApp theApp;

 

BOOL CToolBarApp::InitInstance( )

{

    CToolBarFrame * pWnd = new CToolBarFrame( );

    pWnd->Create( NULL, "ToolBarApp",

        WS_OVERLAPPEDWINDOW,

        CFrameWnd::rectDefault, NULL,

        MAKEINTRESOURCE(IDR_MAINFRM) );

    m_pMainWnd = pWnd;

    m_pMainWnd->ShowWindow( SW_SHOW );

    m_pMainWnd->UpdateWindow( );

    return TRUE;

}

  CToolBar的头文件是afxext.h

 

当前运行界面如下图

计算机生成了可选文字: 一:。。IB。r、,一一思》正在共享日}回口文件健)…回I

 

工具栏的停靠

1 工具栏本身支持停靠

 CToolBar::EnableDocking

2 框架窗口支持停靠

  CFrameWnd::EnableDocking

3 停靠工具栏

  CFrameWnd::DockControlBar

4 工具栏的显示和关闭

  CFrameWnd::ShowControlBar

编写代码如下:

int CToolBarFrame::OnCreate( LPCREATESTRUCT lpCreateStruct )

{

    CFrameWnd::OnCreate( lpCreateStruct );

 

    //创建ToolBar

    if( FALSE == m_wndToolBar.Create( this )

    {

        return 1;

    }   

    //加载工具栏资源

    m_wndToolBar.LoadToolBar( IDR_MAINFRM );

    //工具栏支持停靠

    m_wndToolBar.EnableDocking( CBRS_ALIGN_ANY );

    //FrameWnd支持停靠

    EnableDocking( CBRS_ALIGN_ANY );

    //停靠工具栏

    DockControlBar( &m_wndToolBar );

 

    return 1;

}

从上面的运行界面图可以看到工具条上面有个黑边,不太好看。可以用PreCreateWindow()来修改窗口的属性,将框架窗口的客户区黑边去掉。

class CToolBarFrame : public CFrameWnd

{

public:

    virtual BOOL PreCreateWindow( CREATESTRUCT& cs );

 

    DECLARE_MESSAGE_MAP( )

public:

    afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct );

    afx_msg void OnExit( );

 

public:

    //工具栏成员变量

    CToolBar m_wndToolBar;

};

 

BEGIN_MESSAGE_MAP( CToolBarFrame, CFrameWnd )

    ON_WM_CREATE( )

    ON_COMMAND( ID_EXIT, OnExit )

    ON_COMMAND( ID_ABOUT, OnAbout )

    ON_COMMAND( ID_VIEW_STDBAR, OnViewStdBar )

END_MESSAGE_MAP( )

 

BOOL CToolBarFrame::PreCreateWindow( CREATESTRUCT& cs )

{

    CFrameWnd::PreCreateWindow( cs );

 

    cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

 

    return TRUE;

}

有的工具栏左边有一个突起的竖线,比较好看,这个可以用CToolBarCreateEx()函数创建一个这样的风格

int CToolBarFrame::OnCreate( LPCREATESTRUCT lpCreateStruct )

{

    CFrameWnd::OnCreate( lpCreateStruct );

 

    //创建ToolBar

    if( FALSE == m_wndToolBar.CreateEx( this,

        TBSTYLE_FLAT,

        WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP|CBRS_GRIPPER ) )

    {

        return 1;

    }   

    //加载工具栏资源

    m_wndToolBar.LoadToolBar( IDR_MAINFRM );

    //工具栏支持停靠

    m_wndToolBar.EnableDocking( CBRS_ALIGN_ANY );

    //FrameWnd支持停靠

    EnableDocking( CBRS_ALIGN_ANY );

    //停靠工具栏

    DockControlBar( &m_wndToolBar );

 

    return 1;

}

 

工具栏的显示和关闭

ShowControlBar()

添加一个菜单项,用来显示和关闭工具栏

计算机生成了可选文字: 文件健〕视图仪)犷一工只栏江)卜标准连)

标准

ID_VIEW_STDBAR

添加命令处理

// MFCToolBar.cpp : Defines the entry point for the application.

//

 

#include "stdafx.h"

#include "resource.h"

 

class CToolBarFrame : public CFrameWnd

{

public:

    virtual BOOL PreCreateWindow( CREATESTRUCT& cs );

 

    DECLARE_MESSAGE_MAP( )

public:

    afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct );

    afx_msg void OnExit( );

    afx_msg void OnViewStdBar( );

 

public:

    //工具栏成员变量

    CToolBar m_wndToolBar;

};

 

BEGIN_MESSAGE_MAP( CToolBarFrame, CFrameWnd )

    ON_WM_CREATE( )

    ON_COMMAND( ID_EXIT, OnExit )

    ON_COMMAND( ID_VIEW_STDBAR, OnViewStdBar )

END_MESSAGE_MAP( )

 

BOOL CToolBarFrame::PreCreateWindow( CREATESTRUCT& cs )

{

    CFrameWnd::PreCreateWindow( cs );

 

    cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

 

    return TRUE;

}

 

int CToolBarFrame::OnCreate( LPCREATESTRUCT lpCreateStruct )

{

    CFrameWnd::OnCreate( lpCreateStruct );

 

    //创建ToolBar

    if( FALSE == m_wndToolBar.CreateEx( this,

        TBSTYLE_FLAT,

        WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP|CBRS_GRIPPER ) )

    {

        return 1;

    }   

    //加载工具栏资源

    m_wndToolBar.LoadToolBar( IDR_MAINFRM );

    //工具栏支持停靠

    m_wndToolBar.EnableDocking( CBRS_ALIGN_ANY );

    //FrameWnd支持停靠

    EnableDocking( CBRS_ALIGN_ANY );

    //停靠工具栏

    DockControlBar( &m_wndToolBar );

 

    return 1;

}

 

void CToolBarFrame::OnViewStdBar( )

{   //判断工具栏窗口是否可见

    if( m_wndToolBar.IsWindowVisible( ) )

    {   //不显示ToolBar

        ShowControlBar( &m_wndToolBar, FALSE, FALSE );  

    }

    else

    {   //显示ToolBar

        ShowControlBar( &m_wndToolBar, TRUE, FALSE );

    }

}

 

void CToolBarFrame::OnExit( )

{

    PostQuitMessage( 0 );

}

 

void CToolBarFrame::OnAbout( )

{

    AfxMessageBox( "About ToolBar 1.0" );

}

 

class CToolBarApp : public CWinApp

{

public:

    virtual BOOL InitInstance( );

};

 

CToolBarApp theApp;

 

BOOL CToolBarApp::InitInstance( )

{

    CToolBarFrame * pWnd = new CToolBarFrame( );

    pWnd->Create( NULL, "ToolBarApp",

        WS_OVERLAPPEDWINDOW,

        CFrameWnd::rectDefault, NULL,

        MAKEINTRESOURCE(IDR_MAINFRM) );

    m_pMainWnd = pWnd;

    m_pMainWnd->ShowWindow( SW_SHOW );

    m_pMainWnd->UpdateWindow( );

    return TRUE;

}

 

菜单\工具栏按钮状态和提示信息

1 添加状态处理函数

  afx_msg void XXXXX( CCmdUI * pCmdUI );

2 添加消息映射宏

  ON_UPDATE_COMMAND_UI

3 在状态处理函数设置菜单或工具栏按钮状态

  使用CCmdUI提供的成员函数,可以修改状态

// MFCToolBar.cpp : Defines the entry point for the application.

//

 

#include "stdafx.h"

#include "resource.h"

 

class CToolBarFrame : public CFrameWnd

{

public:

    virtual BOOL PreCreateWindow( CREATESTRUCT& cs );

 

    DECLARE_MESSAGE_MAP( )

public:

    afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct );

    afx_msg void OnExit( );

    afx_msg void OnViewStdBar( );

    //处理ID_VIEW_STDBAR菜单项状态

    afx_msg void OnUpdateViewStdBar( CCmdUI * pCmdUI );

 

public:

    //工具栏成员变量

    CToolBar m_wndToolBar;

};

 

BEGIN_MESSAGE_MAP( CToolBarFrame, CFrameWnd )

    ON_WM_CREATE( )

    ON_COMMAND( ID_EXIT, OnExit )

    ON_COMMAND( ID_VIEW_STDBAR, OnViewStdBar )

    ON_UPDATE_COMMAND_UI( ID_VIEW_STDBAR, OnUpdateViewStdBar )

END_MESSAGE_MAP( )

 

BOOL CToolBarFrame::PreCreateWindow( CREATESTRUCT& cs )

{

    CFrameWnd::PreCreateWindow( cs );

 

    cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

 

    return TRUE;

}

 

int CToolBarFrame::OnCreate( LPCREATESTRUCT lpCreateStruct )

{

    CFrameWnd::OnCreate( lpCreateStruct );

 

    //创建ToolBar

    if( FALSE == m_wndToolBar.CreateEx( this,

        TBSTYLE_FLAT,

        WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP| CBRS_GRIPPER ) )

    {

        return 1;

    }   

    //加载工具栏资源

    m_wndToolBar.LoadToolBar( IDR_MAINFRM );

    //工具栏支持停靠

    m_wndToolBar.EnableDocking( CBRS_ALIGN_ANY );

    //m_wndToolBar2.EnableDocking

    //FrameWnd支持停靠

    EnableDocking( CBRS_ALIGN_ANY );

    //停靠工具栏

    DockControlBar( &m_wndToolBar );

    //DockControlBar( &m_wndToolBar2 );

 

    return 1;

}

 

void CToolBarFrame::OnViewStdBar( )

{   //判断工具栏窗口是否可见

    if( m_wndToolBar.IsWindowVisible( ) )

    {   //不显示ToolBar

        ShowControlBar( &m_wndToolBar,

            FALSE, FALSE );  

    }

    else

    {   //显示ToolBar

        ShowControlBar( &m_wndToolBar,

            TRUE, FALSE );

    }

}

 

void CToolBarFrame::OnUpdateViewStdBar( CCmdUI * pCmdUI )

{   //设置菜单项的状态

    pCmdUI->SetCheck( m_wndToolBar.IsWindowVisible() );

}

 

void CToolBarFrame::OnExit( )

{

    PostQuitMessage( 0 );

}

当前运行时,工具栏菜单项前面就会有一个勾了

计算机生成了可选文字: .Too1Bar么pp文件健工视图仪).惬肠召蜚迎」,标准匀以

 

接下来使工具栏图标按下去后出现按下的效果。

添加一个工具栏图标(黑色那只。中间的问号按钮我没用,它是教程里面拿来示例的,没有实际作用)

命名为ID_CHECK

计算机生成了可选文字: 二二二二二二二二二目习习.诵,:.二勺MFC一jMe易}三JTO,匡l;::):l

菜单上也加一个菜单项

同样命名为ID_CHECK

计算机生成了可选文字: 文件亿)视图仪)获二溯厂一升.拦旧。Ch.ek

添加他们的消息处理函数

// MFCToolBar.cpp : Defines the entry point for the application.

//

 

#include "stdafx.h"

#include "resource.h"

 

class CToolBarFrame : public CFrameWnd

{

public:

    CToolBarFrame( );

 

    virtual BOOL PreCreateWindow( CREATESTRUCT& cs );

 

    DECLARE_MESSAGE_MAP( )

public:

    afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct );

    afx_msg void OnExit( );

    afx_msg void OnViewStdBar( );

    //处理ID_VIEW_STDBAR菜单项状态

    afx_msg void OnUpdateViewStdBar( CCmdUI * pCmdUI );

    //菜单和工具栏同时更新

    afx_msg void OnCheck( );

    afx_msg void OnUpdateCheck( CCmdUI * pCmdUI );

 

public:

    //工具栏成员变量

    CToolBar m_wndToolBar;

    BOOL     m_bCheck;

};

 

BEGIN_MESSAGE_MAP( CToolBarFrame, CFrameWnd )

    ON_WM_CREATE( )

    ON_COMMAND( ID_EXIT, OnExit )

    ON_COMMAND( ID_VIEW_STDBAR, OnViewStdBar )

    ON_UPDATE_COMMAND_UI( ID_VIEW_STDBAR, OnUpdateViewStdBar )

    ON_COMMAND( ID_CHECK, OnCheck )

    ON_UPDATE_COMMAND_UI( ID_CHECK, OnUpdateCheck )

END_MESSAGE_MAP( )

 

CToolBarFrame::CToolBarFrame( )

{

    m_bCheck = TRUE;

}

 

BOOL CToolBarFrame::PreCreateWindow( CREATESTRUCT& cs )

{

    CFrameWnd::PreCreateWindow( cs );

 

    cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

 

    return TRUE;

}

 

int CToolBarFrame::OnCreate(

       LPCREATESTRUCT lpCreateStruct )

{

    CFrameWnd::OnCreate( lpCreateStruct );

 

    //创建ToolBar

    if( FALSE == m_wndToolBar.CreateEx( this,

        TBSTYLE_FLAT,

        WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP| CBRS_GRIPPER ) )

    {

        return 1;

    }   

    //加载工具栏资源

    m_wndToolBar.LoadToolBar( IDR_MAINFRM );

    //工具栏支持停靠

    m_wndToolBar.EnableDocking( CBRS_ALIGN_ANY );

    //m_wndToolBar2.EnableDocking

    //FrameWnd支持停靠

    EnableDocking( CBRS_ALIGN_ANY );

    //停靠工具栏

    DockControlBar( &m_wndToolBar );

    //DockControlBar( &m_wndToolBar2 );

 

    return 1;

}

 

void CToolBarFrame::OnViewStdBar( )

{   //判断工具栏窗口是否可见

    if( m_wndToolBar.IsWindowVisible( ) )

    {   //不显示ToolBar

        ShowControlBar( &m_wndToolBar,

            FALSE, FALSE );  

    }

    else

    {   //显示ToolBar

        ShowControlBar( &m_wndToolBar,

            TRUE, FALSE );

    }

}

 

void CToolBarFrame::OnUpdateViewStdBar(

          CCmdUI * pCmdUI )

{   //设置菜单项的状态

    pCmdUI->SetCheck(

        m_wndToolBar.IsWindowVisible() );

}

 

void CToolBarFrame::OnExit( )

{

    PostQuitMessage( 0 );

}

 

void CToolBarFrame::OnCheck( )

{

    m_bCheck = !m_bCheck;

}

 

void CToolBarFrame::OnUpdateCheck( CCmdUI * pCmdUI )

{

    pCmdUI->SetCheck( m_bCheck );  

}

运行效果如图

计算机生成了可选文字:

4 给工具栏显示Tooltip提示信息

1 工具栏需要有CBRS_TOOLTIPS风格

if( FALSE == m_wndToolBar.CreateEx( this,

    TBSTYLE_FLAT,

    WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS ) )

{

    return 1;

}   

2 添加提示信息字符

prompt字符串随便敲的,中间有个"\n"分隔开

这样,就多了一个字符串的资源

计算机生成了可选文字: 亘三匕不而山一一40001退出从n沮出B衡―!MFCT001Barr(jMenU匀1DR_M:\1NFRMjstl'1119Table州St:i:1;Tabl日·」TOO!h技l,,1DR_M:\1NFRM三叮厂―--

 

接着编译运行,就会看到提示信息

计算机生成了可选文字: 口口Too1Bar合pP

PS:可以看到,提示信息显示的是后面部分。前面部分是状态栏使用的。

根据命令ID添加字符串资源,字符串格式:   XXX\nYYY

   XXX - 状态栏提示信息

   YYY - 工具栏提示信息

 

状态栏

1 MFC状态栏相关

 CStatusBar - 父类是CControBar,提供了与框架窗口相关的支持.

 CStatusBarCtrl - 父类是CWnd,对Win32下的Statusbar控件进行封装。

在MFC程序中,通常使用CStatusBar.

 

2 状态栏的使用

1 创建状态栏

   CStatusBar::Create/CreateEx

2 设置指示器(每一个面版就是一个指示器)

   CStatusBar::SetIndicators

3 设置和显示信息

   CStatusBar::GetPaneText

   CStatusBar::SetPaneText

4 可以使用自定义的字符串ID作为状态栏的指示器.

   只需将字符串的资源ID添加到指示器

 

按照之前的步骤,重新创建一个Win32应用程序MFCStatusBar

环境改好之后,进入MFCStatusBar.cpp文件中,编写代码

// MFCStatusBar.cpp : Defines the entry point for the application.

//

 

#include "stdafx.h"

 

UINT g_nIndicator[] = {

    ID_SEPARATOR,

    ID_SEPARATOR,

    ID_INDICATOR_CAPS,

    ID_INDICATOR_NUM,

    ID_INDICATOR_OVR

};

   

class CStatusBarFrame : public CFrameWnd

{

    DECLARE_MESSAGE_MAP()

public:

    afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct );

 

public:

    //状态栏成员变量

    CStatusBar m_wndStatusBar;

};

 

BEGIN_MESSAGE_MAP( CStatusBarFrame, CFrameWnd )

    ON_WM_CREATE( )

END_MESSAGE_MAP( )

 

int CStatusBarFrame::OnCreate( LPCREATESTRUCT lpCreateStruct )

{

    CFrameWnd::OnCreate( lpCreateStruct );

 

    //创建状态栏

    m_wndStatusBar.Create( this );

    //设置指示器

    m_wndStatusBar.SetIndicators(

        g_nIndicator,

        sizeof(g_nIndicator)/sizeof(UINT));

    //显示字符串

    m_wndStatusBar.SetPaneText( 1, "我的状态栏", TRUE );

    return 1;

}

 

class CStatusBarApp : public CWinApp

{

public:

    virtual BOOL InitInstance( );

};

 

CStatusBarApp theApp;

 

BOOL CStatusBarApp::InitInstance( )

{

    CStatusBarFrame * pWnd = new CStatusBarFrame();

    pWnd->Create( NULL, "StatusBar" );

    m_pMainWnd = pWnd;

    m_pMainWnd->ShowWindow( SW_SHOW );

    m_pMainWnd->UpdateWindow( );

 

    return TRUE;

}

 

运行结果

计算机生成了可选文字: .,tat.ares一兀》「甲口口口口口云垂=枢通亘书赵〕状态栏改写

 

PS:前面长长的空白就是第0个指示器。这个是被框架窗口占用了,用来显示工具栏的提示信息。

 

下面加个菜单项,再加一个显示时间的状态栏

添加资源脚本

添加一个菜单资源

编译一下,并将resource.h头文件包含进项目

MFCStatusBar.cpp中写代码:

// MFCStatusBar.cpp : Defines the entry point for the application.

 

#include "stdafx.h"

#include "resource.h"

 

UINT g_nIndicator[] = {

    ID_SEPARATOR,

    ID_SEPARATOR,

    IDS_TIME,

    ID_INDICATOR_CAPS,

    ID_INDICATOR_NUM,

    ID_INDICATOR_OVR

};

   

class CStatusBarFrame : public CFrameWnd

{

    DECLARE_MESSAGE_MAP()

public:

    afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct );

    afx_msg void OnTimer( int nIDEvent );

 

public:

    //状态栏成员变量

    CStatusBar m_wndStatusBar;

};

 

BEGIN_MESSAGE_MAP( CStatusBarFrame, CFrameWnd )

    ON_WM_CREATE( )

    ON_WM_TIMER( )

END_MESSAGE_MAP( )

 

int CStatusBarFrame::OnCreate( LPCREATESTRUCT lpCreateStruct )

{

    CFrameWnd::OnCreate( lpCreateStruct );

 

    //添加菜单的另一种方式

    CMenu menu;

    menu.LoadMenu( IDR_MAINFRM );

    SetMenu( &menu );

    menu.Detach( );//Attach

 

    //创建状态栏

    m_wndStatusBar.Create( this );

    //设置指示器

    m_wndStatusBar.SetIndicators(

        g_nIndicator,

        sizeof(g_nIndicator)/sizeof(UINT));

    //显示字符串

    m_wndStatusBar.SetPaneText( 1,

        "我的状态栏", TRUE );

 

    //创建定时器

    SetTimer( 1, 1000, NULL );

    return 1;

}

 

void CStatusBarFrame::OnTimer(int nIDEvent )

{

    //获取时间

    CTime tmCurrent = CTime::GetCurrentTime();

    CString strTime = tmCurrent.Format( "%Y-%m-%d %H:%M:%S" );

    //显示到状态栏

    m_wndStatusBar.SetPaneText( 2, strTime, TRUE );

}

 

class CStatusBarApp : public CWinApp

{

public:

    virtual BOOL InitInstance( );

};

 

CStatusBarApp theApp;

 

BOOL CStatusBarApp::InitInstance( )

{

    CStatusBarFrame * pWnd = new CStatusBarFrame();

    pWnd->Create( NULL, "StatusBar" );

    m_pMainWnd = pWnd;

    m_pMainWnd->ShowWindow( SW_SHOW );

    m_pMainWnd->UpdateWindow( );

 

    return TRUE;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值