一。直线
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 }