分类:
2009-06-03 15:35:16
VC精华教程:MFC入门系列(四)
注意:在工具主菜单--子菜单--来源游览器,或按alt+F12可以查看Class and Members
上几章完成了一个程序的窗体,响应消息和菜单资源,现在为程序添具条(CToolBar)和状态栏(CStatusBar)。
使用说明定义步骤:
1.CToolBar类和CStatusBar类包含在afxext.h
2.实例化CToolBool toolbar;和CStatusBar statusbar;,仅仅是可以使用两个类。
3.工具栏:是条形窗口状,里面包含很多图片,每个按钮包含一个图片。
即创建一个工具条时所需的按钮图片要准备好,在vc中一条工具 条只有一条形的图片。会切割成15*16个一个小图片,给对于按钮 1.创建一个工具条窗口(用Create方法)。
2.然后再加载一个位图(用LoadBitmap方法)
3.还要创建几个按钮(使用SetButtons方法)
状态条:一个条形的窗体,里面有很多的窗格,就是格子,我们要创建一个窗体(Create方法),在窗体上创建很多窗格(SetIndicators方法).
4.MFC的流程:
在主窗体建成后,再创建工具条和状态条。在OnCreateClient这个方法里面写,不过要注意这个函数是框架的一部分,不要试图去调用它,她是在创建窗体时框架自动调用的。
/*********************************************************/
// Project:DemoApp
//
//注意:该项目通过Win32 Application创建,必须设置参数:use MFC in static Library.
//
/*********************************************************/
#include
#include //afx扩展库
#include "mfcdemo3_res.h" //包含资源文件
/*********************************************************/
//该类继承自CFrameWnd类
/*********************************************************/
class MainWnd:public CFrameWnd
{
public:
/*****************************************/
CToolBar toolbar; //定义工具栏
CStatusBar statusbar; //定义状态栏
/***********************构造函数******************/
MainWnd()
{
/*从资源文件中读入标题*/
char MainWndTitle[280];
LoadString(NULL,IDS_SYSTEM_TITLE,MainWndTitle,sizeof(MainWndTitle));
/*调用CFrameWnd类中的Create方法来创建窗口*/
Create(NULL, //Class Name
MainWndTitle, //Window Name
WS_OVERLAPPEDWINDOW|WS_VSCROLL, //Style
rectDefault, //指定窗口的大小和位置
NULL, //Praent handle
MAKEINTRESOURCE(IDR_MAINMENU) //Menu
);
}
/*****************************************/
//响应鼠标左键按下事件
afx_msg void OnLButtonDown()
{
::MessageBox(NULL,"响应鼠标左键按下事件","Tt",MB_OK|MB_ICONQUESTION);
}
/*****************************************/
BOOL OnCreateClient( LPCREATESTRUCT lpcs, CCreateContext* pContext )
{
//sets each toolbar button's command ID
UINT tools[]={ID_DISPLAY_UP,
ID_DISPLAY_DOWN,
ID_DISPLAY_LEFT,
ID_DISPLAY_RIGHT};
UINT stats[]={0,
80,//ID_INDICATOR_NUM,
80,//ID_INDICATOR_CAPS
};
//创建工具栏
toolbar.Create(this,WS_VISIBLE|WS_CHILD|CBRS_TOP|CBRS_FLYBY);
//为工具栏加载图片
toolbar.LoadBitmap(IDB_IMAGE_TOOLBAR);
//设置按钮
toolbar.SetButtons(tools,4);
//创建工具栏
statusbar.Create(this);
//状态条设置窗格
statusbar.SetIndicators(stats,3);
return TRUE;
}
/*****************************************/
//
afx_msg void OnAbout()
{
::MessageBox(NULL,"About","Tt",MB_OK|MB_ICONQUESTION);
}
/*****************************************/
DECLARE_MESSAGE_MAP();
};
/***********************开始宏***/
BEGIN_MESSAGE_MAP(MainWnd,CFrameWnd) //参数:子类,父类
//{{AFX_MSG_MAP( CMyWindow )
ON_WM_LBUTTONDOWN()//响应鼠标左键按下事件
//ON_WM_PAINT()
ON_COMMAND( IDD_ABOUT, OnAbout )
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/***********************结束宏**/
/*********************************************************/
//该类控制所有窗口
/*********************************************************/
class DemoApp:public CWinApp
{
public:
//该函数在应用程序时初始化(相当于WinMain)
BOOL InitInstance();
//该函数在退出应用程序时
BOOL ExitInstance();
};
/***********************************/
//(该函数相当于WinMain函数)
BOOL DemoApp::InitInstance()
{
//定义并创建MainWnd类
MainWnd *mainWnd = new MainWnd;
//指定m_pMainWnd指向mainWnd( 其中:m_pMainWnd成员变量在CWinTread类中定义);
m_pMainWnd=mainWnd;
//显示窗口
m_pMainWnd->ShowWindow(SW_SHOW);
return TRUE;
}
/***********************************/
BOOL DemoApp::ExitInstance()
{
return TRUE;
}
/*********************************************************/
//
/*********************************************************/
/*定义全局变量*/
DemoApp app;
这里面的代码有两句没有讲
UINT tool[]={
ID_DISPLAY_UP,
ID_DISPLAY_DOWN,
ID_DISPLAY_LEFT,
ID_DISPLAY_RIGHT};
UINT stat[]={0,ID_INDICATOR_NUM,ID_INDICATOR_CAPS};
这是因为我们要使用工具条必须要知道,用户到底点的是哪个按钮,所以,我们用一个数组标识她们,这两个数组里面的宏,必须要有对应的资源。我看到我们的 工具条都是灰色的,因为,我们没有写消息映射给他们,工具条也不可使用,必须要添加String Table才可以用。我们下次再讲。