zoukankan      html  css  js  c++  java
  • MFC学习笔记3 绘画

    一。直线

    1.定义类变量CPoint m_point保存直线起始点。

    2.添加鼠标按下和弹起消息处理函数

      1.在按下时,记录起始坐标点

      2.在弹起时,定义画家类,画线

    •  MoveTo
    •  LineTo
     1 void CMFClineView::OnLButtonDown(UINT nFlags, CPoint point)
     2 {
     3     // TODO: 在此添加消息处理程序代码和/或调用默认值
     4     m_point = point;
     5     CView::OnLButtonDown(nFlags, point);
     6 }
     7 
     8 
     9 void CMFClineView::OnLButtonUp(UINT nFlags, CPoint point)
    10 {
    11     // TODO: 在此添加消息处理程序代码和/或调用默认值
    12     CClientDC cdc(this);
    13     cdc.MoveTo(m_point);
    14     cdc.LineTo(point);
    15     CView::OnLButtonUp(nFlags, point);
    16 }

    二。曲线

    1.鼠标按下时鼠标移动函数生效,鼠标弹起时鼠标移动函数不生效

        定义类成员变量m_isPress,鼠标按下时m_isPress=true,定义CPoint m_point记录起始点。

        鼠标弹起时m_isPress=true。

        鼠标移动时,若鼠标按下,则从m_point开始画线,并将当前移动位置的点作为m_point

     1 //鼠标按下
     2 void CMFCApplication1View::OnLButtonDown(UINT nFlags, CPoint point)
     3 {
     4     // TODO: 在此添加消息处理程序代码和/或调用默认值
     5     m_point = point;//保存点击的坐标
     6     m_isPress = true;
     7     CView::OnLButtonDown(nFlags, point);
     8 }
     9 
    10 //鼠标抬起
    11 void CMFCApplication1View::OnLButtonUp(UINT nFlags, CPoint point)
    12 {
    13     // TODO: 在此添加消息处理程序代码和/或调用默认值
    14     m_isPress = false;
    15     CView::OnLButtonUp(nFlags, point);
    16 }
    17 
    18 //鼠标移动
    19 void CMFCApplication1View::OnMouseMove(UINT nFlags, CPoint point)
    20 {
    21     // TODO: 在此添加消息处理程序代码和/或调用默认值
    22     if (m_isPress == true)
    23     {
    24         //创建画家
    25         CClientDC cdc(this);
    26         cdc.MoveTo(m_point);
    27         cdc.LineTo(point);
    28         //移动后位置的作为起点
    29         m_point = point;
    30     }
    31     CView::OnMouseMove(nFlags, point);
    32 }

        

    三。画笔、画刷

     1 void CMFCApplication1View::OnDraw(CDC* pDC)
     2 {
     3     CMFCApplication1Doc* pDoc = GetDocument();
     4     ASSERT_VALID(pDoc);
     5     if (!pDoc)
     6         return;
     7 
     8 
     9     /*
    10         定义画家
    11         定义画笔画刷 CPen,CBrush
    12         把画笔交给画家 CDC::SelectObject
    13     */
    14     //PS_DASH:虚线,1:线宽,
    15     CPen pen(PS_DASH, 1, RGB(255, 0, 0));
    16     CPen *oldpen=pDC->SelectObject(&pen);
    17     pDC->MoveTo(10, 10);
    18     pDC->LineTo(120, 10);
    19 
    20     //画圆形
    21     pDC->SelectObject(oldpen);
    22     pDC->Ellipse(20, 20, 120, 120);
    23 
    24 
    25     CBrush brush(RGB(255,255,0));
    26     pDC->SelectObject(&brush);
    27     pDC->Ellipse(120, 120, 240, 240);
    28 
    29     //定义一个位图对象
    30     CBitmap bitmap;
    31     bitmap.LoadBitmapW(IDB_BITMAP1);
    32     CBrush brush2(&bitmap);
    33     pDC->SelectObject(&brush2);
    34     pDC->Ellipse(120, 20, 240, 140);
    35     // TODO: 在此处为本机数据添加绘制代码
    36 }

     四。字体

    1     CFont font;
    2     font.CreatePointFont(200, TEXT("楷体"));
    3     pDC->SelectObject(&font);
    4     pDC->TextOutW(0, 200, TEXT("自定义的字体"));

     五。文本编辑器

    WM_CREATE消息对应的处理函数在窗口建立后自动被调用。

     1 int CMFCApplication2View::OnCreate(LPCREATESTRUCT lpCreateStruct)
     2 {
     3     if (CView::OnCreate(lpCreateStruct) == -1)
     4         return -1;
     5 
     6     // TODO:  在此添加您专用的创建代码
     7     //获取字体信息
     8     CClientDC cdc(this);
     9     TEXTMETRIC tm; //字体信息结构体
    10     cdc.GetTextMetrics(&tm);
    11     CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight); //创建插入符,定义矩形区域
    12     ShowCaret();
    13     return 0;
    14 }

    左键按下切换插入符位置

    1 void CMFCApplication2View::OnLButtonDown(UINT nFlags, CPoint point)
    2 {
    3     // TODO: 在此添加消息处理程序代码和/或调用默认值
    4     //
    5     SetCaretPos(point);//移动插入符
    6     m_point = point; //保存坐标
    7     m_str.Empty();
    8     CView::OnLButtonDown(nFlags, point);
    9 }

    按下键盘时可以移动插入符位置和写文本

     1 void CMFCApplication2View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
     2 {
     3     // TODO: 在此添加消息处理程序代码和/或调用默认值
     4     CClientDC dc(this);
     5     
     6     if(nChar==VK_RETURN) //换行
     7     {    
     8         CSize size = dc.GetTextExtent(m_str);
     9         m_str.Empty();
    10 
    11         m_point.y = m_point.y + size.cy;
    12 
    13     }
    14     else if (nChar == VK_BACK) //退格
    15     {
    16         //获取背景色
    17         COLORREF color = dc.GetBkColor();
    18         //设置写字颜色
    19         COLORREF oldcolor = dc.SetTextColor(color);
    20         //白色重写一次
    21         dc.TextOutW(m_point.x, m_point.y, m_str);
    22 
    23         //去掉最后一个字符
    24         m_str = m_str.Left(m_str.GetLength() - 1);
    25         dc.SetTextColor(oldcolor);
    26     }
    27     else
    28     {
    29         m_str += (TCHAR)nChar;        
    30     }
    31     CSize size = dc.GetTextExtent(m_str);
    32     SetCaretPos(CPoint(m_point.x + size.cx, m_point.y));
    33     dc.TextOutW(m_point.x, m_point.y, m_str);
    34 
    35     CView::OnChar(nChar, nRepCnt, nFlags);
    36 }
  • 相关阅读:
    【费用流】【CODEVS】1227 方格取数2
    【CODEVS】1034 家园
    【BZOJ】1066: [SCOI2007]蜥蜴
    【最大流】【CODEVS】1993 草地排水
    【HDU】2191 多重背包问题
    【TYVJ】1520 树的直径
    【BZOJ】1984 月下“毛景树”
    【BZOJ】1588: [HNOI2002]营业额统计
    【NOI】2004 郁闷的出纳员
    【POJ】2892 Tunnel Warfare
  • 原文地址:https://www.cnblogs.com/sclu/p/11558013.html
Copyright © 2011-2022 走看看