• (三)根据向导创建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("未能创建工具栏
    ");
            return -1;      // 未能创建
        }
    
        if (!m_wndStatusBar.Create(this))
        {
            TRACE0("未能创建状态栏
    ");
            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);
    }
  • 相关阅读:
    伪类和伪元素的区别, 总结的很好, 直接看结论.
    进制闲谈
    遇到的问题&思考
    PHP中include引用导致不能再次相对引用文件的一个小问题
    ECharts饼图试玩
    不该迷茫的时候迷茫
    [5]火车票接口整理
    [4]xlongwei工具类
    [3]天行新闻
    [2]新闻
  • 原文地址:https://www.cnblogs.com/xiangtingshen/p/10801310.html
Copyright © 2020-2023  润新知