MFC第五天
来源:互联网 发布:linux永久挂载先电 编辑:程序博客网 时间:2024/05/05 16:53
马志国,mazhiguo@163.com
一 MFC工具栏
1 MFC工具栏相关
CToolBarCtrl
继承于CWnd,封装了工具栏的相关信息和API等。
CToolBar
父类是CControlBar,封装了工具栏与窗口之间的关系
2 工具栏的使用
2.1 创建工具栏
CToolBar::Create/CreateEx
2.2 加载工具栏资源
CToolBar::LoadToolBar
2.3停靠工具栏
设置工具栏允许停靠
CToolBar::EnableDocking
设置框架窗口允许被停靠
CFrameWnd::EnableDocking
停靠工具栏
CFrameWnd::DockControlBar
如果菜单项没有消息处理函数的话也不可用,给它加上消息处理函数。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
可以设置每个工具栏的ID,可以为它添加对应的处理函数。和菜单的效果是一样的。工具栏上的按钮一般为菜单的快捷键,所以只要把ID改成菜单的就行啦。
添加头文件#include<afxext.h>
public:
CToolBar m_wndToolBar;//工具栏
};
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_WM_CREATE()
END_MESSAGE_MAP()
int CMyFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct){
if(-1==CFrameWnd::OnCreate(lpCreateStruct))
return -1;
//工具栏的创建
m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP|CBRS_GRIPPER);
//加载工具栏资源
m_wndToolBar.LoadToolBar(IDR_MAINFRAME);
//工具栏的停靠
m_wndToolBar.EnableDocking(CBRS_ALIGN_TOP);
EnableDocking(CBRS_BORDER_ANY);
DockControlBar(&m_wndToolBar,CBRS_BORDER_TOP);
//设置工具栏标题
m_wndToolBar.SetWindowText(_T("标题"));
return 0;
}
//设置菜单项来控制工具栏的显示与隐藏
ON_COMMAND(ID_TOOLBAR,OnToolBar)
afx_msg void OnToolbar();
void CMainFrame::OnToolbar(){
if(m_wndToolBar.IsWindowVisible())
{
ShowControlBar(&m_wndToolBar,FALSE,FALSE);
}
else
{
ShowControlBar(&m_wndToolBar,TRUE,FALSE);
}
}
/////////////////////////////////
控制菜单项的状态,执行时机为
ON_UPDATE_COMMAND_UI(ID_TOOLBAR,OnToolBarUpdateUI)
afx_msg void OnToolBarUpdateUI(CCmdUI*pCmdUI);//可以设置菜单项的状态
void CMainFrame::OnToolBarUpdateUI(CCmdUI*pCmdUI){
if(m_wndToolBar.IsWindowVisible())
{
pCmdUI->SetCheck(1);
}
else
{
pCmdUI->SetCheck(0);
}
}
工具栏的显示和隐藏
CFrameWnd::ShowControlBar
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
如何给工具栏添加提示信息,需要两步。
1.在创建式具栏的时候,使其具有提示的功能,添加样式CBRS_TOOLTIPS
2.双击工具资源,prompt在最下面上添加要显示的信息。新建文件\nnew files提示信息会出现在两个地方,一个是按钮上面,一个是状态栏上面。
状态栏
1.MFC状态相关类
CStatusBarCtrl--父类是CWnd,对状态栏控件的封装
CStatusBar---父类是CControlBar,封装了与框架窗口之间的关系。《主要使用 》
2.MFC状态栏的使用
创建状态栏
CStatusBar::Create/CreateEx
设置状态栏指示器(划分成不同部分,显示不同信息)
定义状态指示器数组(UINT数组)
设置到状态栏
CStatusBar::SetIndicators
设置/获取状态栏信息
CStatusBar::SetPaneText/GetPaneText
/////////////////////////////////////////////////////////////////////////
// MFCBase.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "MFCBase.h"
#include "resource.h"
//定义状态指示器数组
UINT g_Indicators[]={IDS_STRING104,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,0};//大写键是否被按下,数字键是否被按下,添加字符串ID
class CMyFrameWnd:public CFrameWnd{
DECLARE_MESSAGE_MAP()
public:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT nIdEvent); //定时器消息
public:
CStatusBar m_wndStatusBar;//状态栏
};
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_WM_CREATE()
ON_WM_TIMER()
END_MESSAGE_MAP()
void CMyFrameWnd::OnTimer(UINT nIDEvent){
//获取当前时间
CTime t=CTime::GetCurrentTime();
//转换成字符串类型
CString strTimer=t.Format("%Y-%m-%d %H:%M:%S");
//设置到状态栏上
m_wndStatusBar.SetPaneText(0,strTimer);
}
int CMyFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct){
if(-1==CFrameWnd::OnCreate(lpCreateStruct))
return -1;
//创建状态栏
m_wndStatusBar.CreateEx(this);
//状态指示器数组<全局类型>
//设置到状态栏上
m_wndStatusBar.SetIndicators(g_Indicators,sizeof(g_Indicators)/sizeof(UINT));
//设置每一部分的宽度<可能环境有问题>
m_wndStatusBar.SetPaneInfo(1,ID_INDICATOR_CAPS,SBPS_NORMAL,50);
//添加自定义的信息,自定义在数组中添加字符串资源。设置动态时间。
//每1s调用最新的时间设置到面板上。添加定时器消息
SetTimer(1,1000,NULL);
return CFrameWnd::OnCreate(lpCreateStruct);
}
class CMyWinApp: public CWinApp{
public:
virtual BOOL InitInstance();
};
CMyWinApp theApp;
BOOL CMyWinApp::InitInstance(){
CMyFrameWnd *pFrame=new CMyFrameWnd;
CString str=_T("this is a window");
LPCTSTR lpszWindowName=str;
pFrame->Create(NULL,lpszWindowName,WS_OVERLAPPEDWINDOW,CFrameWnd::rectDefault,NULL,MAKEINTRESOURCE(IDC_MFCBASE));
pFrame->ShowWindow(SW_NORMAL);
pFrame->UpdateWindow();
m_pMainWnd=pFrame;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
三。视图
1.MFC视图相关类
CView类以及CView类的子类。
2.MFC视图的使用
2.1视图的创建和使用
1.定义CView的子类,实现OnDraw函数
2.使用Create函数创建
AFX_IdW_PANE_FIRST
3.视图的销毁
CView::PostNcDestroy会销毁视图
OnDraw与OnPaint的关系
两者实现的功能是一样的但是OnDraw更简单,推荐使用。如果添加了onPaint消息,则OnDraw函数则不起作用。
由于虚函数机制,CMyView::OnDraw会被CView::OnPaint调用
2.3工程类中有哪些类可以处理菜单消息?它们处理的顺序是什么?
只要继承于CCmdTarget都可以处理菜单消息,因此应用程序类,视图类,框架类都可以处理消息。顺充为视图类,框架窗口类,应用程序类。
2.3.1 框架窗口首先获得菜单的命令消息,调用CFrameWnd::OnCmdMsg函数
2.3.1 在函数中,首先获取框架窗口的活动视图,如果存在,视图处理菜单消息。
2.3.3 如果活动视图不存在,或者活动视图没有处理菜单消息,框架窗口处理菜单消息。
2.3.4 如果框架窗口没有处理此消息,交由应用程序来处理此消息。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// MFCBase.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "MFCBase.h"
#include "resource.h"
class CMyView:public CView{
public:
virtual void OnDraw(CDC* pDC);
DECLARE_MESSAGE_MAP()
protected://所有的消息处理函数都写在protected里面
afx_msg void OnPaint();
};
BEGIN_MESSAGE_MAP(CMyView,CView)
ON_WM_PAINT()
END_MESSAGE_MAP()
void CMyView::OnDraw(CDC*pDC){
//该函数用来显示数据
pDC->TextOut(10,10,_T("this is on draw"));
}
class CMainFrame:public CFrameWnd{
DECLARE_MESSAGE_MAP()
public:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
public:
//构造函数
CMainFrame();
//CMyView m_wndView;//视图对象,被销毁两次会出错。两种解决方案。
CMyView *m_wndView;//定义为指针,以防止销毁两次
};
CMainFrame::CMainFrame(){
m_wndView=NULL;//避免野指针的出来
}
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
ON_WM_CREATE()
END_MESSAGE_MAP()
void CMyView::OnPaint(){
//这个函数一旦调用,则ondraw函数不被调用,这两个函数实现的功能是一样的,OnDraw更简单一点。
PAINTSTRUCT ps;
CDC*pDC=BeginPaint(&ps);
pDC->TextOut(10,100,_T("hello onpaint"));
OnDraw(pDC);
EndPaint(&ps);
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){
if(-1==CFrameWnd::OnCreate(lpCreateStruct))
return -1;
//创建视图
m_wndView=new CMyView;
m_wndView->Create(NULL,_T("MyView"),WS_CHILD|WS_VISIBLE|WS_BORDER,CRect(0,0,300,300),this,AFX_IDW_PANE_FIRST);//这个参数无论什么时候都会充满整个客户区
return 0;
}
class CMyWinApp:public CWinApp{
public:
virtual BOOL InitInstance();
};
CMyWinApp theApp;
BOOL CMyWinApp::InitInstance(){
CMainFrame *pFrame=new CMainFrame;
pFrame->Create(NULL,_T("this is a window"),WS_OVERLAPPEDWINDOW,CFrameWnd::rectDefault,NULL,MAKEINTRESOURCE(IDR_MENU1));
m_pMainWnd=pFrame;
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return true;
}
一 MFC工具栏
1 MFC工具栏相关
CToolBarCtrl
继承于CWnd,封装了工具栏的相关信息和API等。
CToolBar
父类是CControlBar,封装了工具栏与窗口之间的关系
2 工具栏的使用
2.1 创建工具栏
CToolBar::Create/CreateEx
2.2 加载工具栏资源
CToolBar::LoadToolBar
2.3停靠工具栏
设置工具栏允许停靠
CToolBar::EnableDocking
设置框架窗口允许被停靠
CFrameWnd::EnableDocking
停靠工具栏
CFrameWnd::DockControlBar
如果菜单项没有消息处理函数的话也不可用,给它加上消息处理函数。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
可以设置每个工具栏的ID,可以为它添加对应的处理函数。和菜单的效果是一样的。工具栏上的按钮一般为菜单的快捷键,所以只要把ID改成菜单的就行啦。
添加头文件#include<afxext.h>
public:
CToolBar m_wndToolBar;//工具栏
};
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_WM_CREATE()
END_MESSAGE_MAP()
int CMyFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct){
if(-1==CFrameWnd::OnCreate(lpCreateStruct))
return -1;
//工具栏的创建
m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP|CBRS_GRIPPER);
//加载工具栏资源
m_wndToolBar.LoadToolBar(IDR_MAINFRAME);
//工具栏的停靠
m_wndToolBar.EnableDocking(CBRS_ALIGN_TOP);
EnableDocking(CBRS_BORDER_ANY);
DockControlBar(&m_wndToolBar,CBRS_BORDER_TOP);
//设置工具栏标题
m_wndToolBar.SetWindowText(_T("标题"));
return 0;
}
//设置菜单项来控制工具栏的显示与隐藏
ON_COMMAND(ID_TOOLBAR,OnToolBar)
afx_msg void OnToolbar();
void CMainFrame::OnToolbar(){
if(m_wndToolBar.IsWindowVisible())
{
ShowControlBar(&m_wndToolBar,FALSE,FALSE);
}
else
{
ShowControlBar(&m_wndToolBar,TRUE,FALSE);
}
}
/////////////////////////////////
控制菜单项的状态,执行时机为
ON_UPDATE_COMMAND_UI(ID_TOOLBAR,OnToolBarUpdateUI)
afx_msg void OnToolBarUpdateUI(CCmdUI*pCmdUI);//可以设置菜单项的状态
void CMainFrame::OnToolBarUpdateUI(CCmdUI*pCmdUI){
if(m_wndToolBar.IsWindowVisible())
{
pCmdUI->SetCheck(1);
}
else
{
pCmdUI->SetCheck(0);
}
}
工具栏的显示和隐藏
CFrameWnd::ShowControlBar
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
如何给工具栏添加提示信息,需要两步。
1.在创建式具栏的时候,使其具有提示的功能,添加样式CBRS_TOOLTIPS
2.双击工具资源,prompt在最下面上添加要显示的信息。新建文件\nnew files提示信息会出现在两个地方,一个是按钮上面,一个是状态栏上面。
状态栏
1.MFC状态相关类
CStatusBarCtrl--父类是CWnd,对状态栏控件的封装
CStatusBar---父类是CControlBar,封装了与框架窗口之间的关系。《主要使用 》
2.MFC状态栏的使用
创建状态栏
CStatusBar::Create/CreateEx
设置状态栏指示器(划分成不同部分,显示不同信息)
定义状态指示器数组(UINT数组)
设置到状态栏
CStatusBar::SetIndicators
设置/获取状态栏信息
CStatusBar::SetPaneText/GetPaneText
/////////////////////////////////////////////////////////////////////////
// MFCBase.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "MFCBase.h"
#include "resource.h"
//定义状态指示器数组
UINT g_Indicators[]={IDS_STRING104,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,0};//大写键是否被按下,数字键是否被按下,添加字符串ID
class CMyFrameWnd:public CFrameWnd{
DECLARE_MESSAGE_MAP()
public:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT nIdEvent); //定时器消息
public:
CStatusBar m_wndStatusBar;//状态栏
};
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_WM_CREATE()
ON_WM_TIMER()
END_MESSAGE_MAP()
void CMyFrameWnd::OnTimer(UINT nIDEvent){
//获取当前时间
CTime t=CTime::GetCurrentTime();
//转换成字符串类型
CString strTimer=t.Format("%Y-%m-%d %H:%M:%S");
//设置到状态栏上
m_wndStatusBar.SetPaneText(0,strTimer);
}
int CMyFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct){
if(-1==CFrameWnd::OnCreate(lpCreateStruct))
return -1;
//创建状态栏
m_wndStatusBar.CreateEx(this);
//状态指示器数组<全局类型>
//设置到状态栏上
m_wndStatusBar.SetIndicators(g_Indicators,sizeof(g_Indicators)/sizeof(UINT));
//设置每一部分的宽度<可能环境有问题>
m_wndStatusBar.SetPaneInfo(1,ID_INDICATOR_CAPS,SBPS_NORMAL,50);
//添加自定义的信息,自定义在数组中添加字符串资源。设置动态时间。
//每1s调用最新的时间设置到面板上。添加定时器消息
SetTimer(1,1000,NULL);
return CFrameWnd::OnCreate(lpCreateStruct);
}
class CMyWinApp: public CWinApp{
public:
virtual BOOL InitInstance();
};
CMyWinApp theApp;
BOOL CMyWinApp::InitInstance(){
CMyFrameWnd *pFrame=new CMyFrameWnd;
CString str=_T("this is a window");
LPCTSTR lpszWindowName=str;
pFrame->Create(NULL,lpszWindowName,WS_OVERLAPPEDWINDOW,CFrameWnd::rectDefault,NULL,MAKEINTRESOURCE(IDC_MFCBASE));
pFrame->ShowWindow(SW_NORMAL);
pFrame->UpdateWindow();
m_pMainWnd=pFrame;
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
三。视图
1.MFC视图相关类
CView类以及CView类的子类。
2.MFC视图的使用
2.1视图的创建和使用
1.定义CView的子类,实现OnDraw函数
2.使用Create函数创建
AFX_IdW_PANE_FIRST
3.视图的销毁
CView::PostNcDestroy会销毁视图
OnDraw与OnPaint的关系
两者实现的功能是一样的但是OnDraw更简单,推荐使用。如果添加了onPaint消息,则OnDraw函数则不起作用。
由于虚函数机制,CMyView::OnDraw会被CView::OnPaint调用
2.3工程类中有哪些类可以处理菜单消息?它们处理的顺序是什么?
只要继承于CCmdTarget都可以处理菜单消息,因此应用程序类,视图类,框架类都可以处理消息。顺充为视图类,框架窗口类,应用程序类。
2.3.1 框架窗口首先获得菜单的命令消息,调用CFrameWnd::OnCmdMsg函数
2.3.1 在函数中,首先获取框架窗口的活动视图,如果存在,视图处理菜单消息。
2.3.3 如果活动视图不存在,或者活动视图没有处理菜单消息,框架窗口处理菜单消息。
2.3.4 如果框架窗口没有处理此消息,交由应用程序来处理此消息。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// MFCBase.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "MFCBase.h"
#include "resource.h"
class CMyView:public CView{
public:
virtual void OnDraw(CDC* pDC);
DECLARE_MESSAGE_MAP()
protected://所有的消息处理函数都写在protected里面
afx_msg void OnPaint();
};
BEGIN_MESSAGE_MAP(CMyView,CView)
ON_WM_PAINT()
END_MESSAGE_MAP()
void CMyView::OnDraw(CDC*pDC){
//该函数用来显示数据
pDC->TextOut(10,10,_T("this is on draw"));
}
class CMainFrame:public CFrameWnd{
DECLARE_MESSAGE_MAP()
public:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
public:
//构造函数
CMainFrame();
//CMyView m_wndView;//视图对象,被销毁两次会出错。两种解决方案。
CMyView *m_wndView;//定义为指针,以防止销毁两次
};
CMainFrame::CMainFrame(){
m_wndView=NULL;//避免野指针的出来
}
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
ON_WM_CREATE()
END_MESSAGE_MAP()
void CMyView::OnPaint(){
//这个函数一旦调用,则ondraw函数不被调用,这两个函数实现的功能是一样的,OnDraw更简单一点。
PAINTSTRUCT ps;
CDC*pDC=BeginPaint(&ps);
pDC->TextOut(10,100,_T("hello onpaint"));
OnDraw(pDC);
EndPaint(&ps);
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){
if(-1==CFrameWnd::OnCreate(lpCreateStruct))
return -1;
//创建视图
m_wndView=new CMyView;
m_wndView->Create(NULL,_T("MyView"),WS_CHILD|WS_VISIBLE|WS_BORDER,CRect(0,0,300,300),this,AFX_IDW_PANE_FIRST);//这个参数无论什么时候都会充满整个客户区
return 0;
}
class CMyWinApp:public CWinApp{
public:
virtual BOOL InitInstance();
};
CMyWinApp theApp;
BOOL CMyWinApp::InitInstance(){
CMainFrame *pFrame=new CMainFrame;
pFrame->Create(NULL,_T("this is a window"),WS_OVERLAPPEDWINDOW,CFrameWnd::rectDefault,NULL,MAKEINTRESOURCE(IDR_MENU1));
m_pMainWnd=pFrame;
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return true;
}
0 0