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;
}
            
  
 
0 0
原创粉丝点击