MFC学习笔记3 绘画

时间:2019-09-20
本文章向大家介绍MFC学习笔记3 绘画,主要包括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 }

原文地址:https://www.cnblogs.com/sclu/p/11558013.html