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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 第七节:Activiti6.0——Task的变量使用
- 第八节:Activiti6.0——启动流程相关
- 第九节:Activiti6.0——ReceiveTask接收信号、中间信号捕获事件和中间消息捕获事件的流程推进
- SpringBoot——全局异常捕获和自定义异常
- RTSP协议视频平台EasyNVR接入到EasyNVS管理平台后无法显示RTMP及RTSP视频流地址问题
- SpringBoot——配置logback日志
- Istio 运维实战系列(2):让人头大的『无头服务』-上
- 第十节:Activiti6.0——四种Job工作的产生与管理
- 使用vue3.0,不需要build也可以
- 听说vue项目不用build也能用?
- 使用 Vue 3.0,你可能不再需要Vuex了
- MySQL InnoDB索引:存储结构
- Element 根据描述展示表单
- VUE 插件注册
- 表格中的输入框验证