(三)根据向导创建MFC工程,事件的添加和删除

 

一,文档视图结构

文档:它是一个类,这个类专门用来存储数据

视图:它是一个类,这个类专门用来显示和修改数据

 

框架类:一个容器,这个容器装了视图

 

 

健完工程之后,类视图:

 

运行一下:

 

几个比较重要的函数

1,视图类 CView

OnDraw(),绘图。

WM_PAINT,消息处理函数OnPaint()内部调用 OnDraw(),若两个函数同时存在只有 OnPaint 有效

// CMFCApplication1View 绘图

void CMFCApplication1View::OnDraw(CDC* pDC)
{
    CMFCApplication1Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    // TODO: 在此处为本机数据添加绘制代码
    pDC->TextOutW(100, 100, TEXT("hello"));
}

 2,应用程序类 CWinApp

InitInstance(),程序的入口地址

3,框架类 CFrameWnd

PreCreateWindow,创建窗口之前调用

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    if( !CFrameWnd::PreCreateWindow(cs) )
        return FALSE;
    // TODO: 在此处通过修改
    //  CREATESTRUCT cs 来修改窗口类或样式

    cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
         | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU;

    return TRUE;
}

OnCreate,创建窗口之后,触发 WM_CREATE,它是WM_CREATE的消息处理函数

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
        TRACE0("未能创建工具栏\n");
        return -1;      // 未能创建
    }

    if (!m_wndStatusBar.Create(this))
    {
        TRACE0("未能创建状态栏\n");
        return -1;      // 未能创建
    }
    m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));

    // TODO: 如果不需要可停靠工具栏,则删除这三行
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar);


    return 0;
}

 

事件的添加和删除

1,验证框架和视图的区别

  框架就相当于容器,容器放视图

  视图相当于壁纸

如下在框架中添加鼠标左键消息处理,没有反应。

.c文件自动生成:

void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值

    CFrameWnd::OnLButtonDown(nFlags, point);
}

.h文件自动生成函数的声明

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_WM_CREATE()
    ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

 

// CMainFrame 消息处理程序



void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    MessageBox(_T("frame"));

    CFrameWnd::OnLButtonDown(nFlags, point);
}

程序运行起来之后,左键没有反应。

同样在视图类中添加消息

// CMFCApplication1View 消息处理程序


void CMFCApplication1View::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值

    MessageBox(_T("View"));
    CView::OnLButtonDown(nFlags, point);
}

 

添加WM_PAINT 消息处理,会屏蔽掉OnDraw()

BEGIN_MESSAGE_MAP(CMFCApplication1View, CView)
    // 标准打印命令
    ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
    ON_WM_LBUTTONDOWN()
    ON_WM_PAINT()
END_MESSAGE_MAP()

 

void CMFCApplication1View::OnPaint()
{
    CPaintDC dc(this); // device context for painting
                       // TODO: 在此处添加消息处理程序代码
                       // 不为绘图消息调用 CView::OnPaint()
    dc.TextOutW(100,100,_T("WM_PAINT"));
}

 

void CMFCApplication1View::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    //TCHAR buf[128] = { 0 };
    //wsprintf(buf, TEXT("x = %d,y = %d"), point.x, point.y);
    CString buf;
    buf.Format(TEXT("x = %d,y = %d"), point.x, point.y);
    MessageBox(buf); 
    CView::OnLButtonDown(nFlags, point);
}

 

 

键盘事件

void CMFCApplication1View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    TCHAR ch = (TCHAR)nChar;
    CString str;
    str.Format(TEXT("%c"),ch);
    MessageBox(str);

    CView::OnChar(nChar, nRepCnt, nFlags);
}

 

posted @ 2019-05-01 23:57  狂奔~  阅读(1176)  评论(0编辑  收藏  举报