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 }
  • 相关阅读:
    poj 2528 Mayor's posters (线段树+离散化)
    poj 1201 Intervals (差分约束)
    hdu 4109 Instrction Arrangement (差分约束)
    poj 1195 Mobile phones (二维 树状数组)
    poj 2983 Is the Information Reliable? (差分约束)
    树状数组 讲解
    poj 2828 Buy Tickets (线段树)
    hdu 1166 敌兵布阵 (树状数组)
    Ubuntu网络配置
    Button控制窗体变量(开关控制灯的状态)
  • 原文地址:https://www.cnblogs.com/sclu/p/11558013.html
Copyright © 2011-2022 走看看