MFC上机练习:使用ondraw函数绘制圆形教程

版权申诉
0 下载量 175 浏览量 更新于2024-10-08 1 收藏 2.33MB ZIP 举报
在MFC(Microsoft Foundation Classes)编程环境中,绘制图形是一个常见的任务。MFC为开发者提供了一套丰富的类,用于简化Windows编程。其中,单文档界面(SDI)应用是MFC中的一种典型应用架构,用户界面主要由一个主窗口组成,可以在其中创建、打开、编辑和显示文档。 标题 "VC上机测试.zip_MFC上机_mfc ondraw画圆_mfc 画圆 on_pendvc_画圆" 指出本资源是关于使用MFC在单文档应用程序中实现画圆功能的上机测试。描述 "mfc单文档画圆,用ondraw函数实现" 提供了具体的知识点,即在MFC单文档中,可以通过覆盖(override)OnDraw函数来绘制图形,比如圆。标签 "mfc上机 mfc_ondraw画圆 mfc_画圆_on pendvc 画圆" 进一步确认了知识点的范围和使用的特定函数。 首先,MFC中的OnDraw函数是一个非常关键的部分,它定义在CView类中。当视图需要被重绘(比如窗口被移动或尺寸改变时),MFC会调用此函数。为了画圆,我们需要在这个函数中使用GDI(图形设备接口)对象,比如CPen和CBrush来创建画笔和画刷,然后调用CDC类的方法进行绘制。CDC类是MFC中用于处理设备上下文的类,它提供了一系列绘图方法。 以下是在MFC单文档中实现画圆的基本步骤: 1. 创建一个MFC单文档应用。 2. 打开对应的视图类(通常继承自CView或CFormView)。 3. 覆盖视图类中的OnDraw函数。 4. 在OnDraw函数中,首先获取设备上下文对象(CDC),通常通过函数参数传递。 5. 创建一个画笔对象CPen,并设置画笔属性(例如颜色、宽度等)。 6. 创建一个画刷对象CBrush,并设置画刷属性(例如颜色)。 7. 选择画笔和画刷到设备上下文中。 8. 使用CDC的DrawCircle方法或者Arc方法(需要计算合适的椭圆边界)来绘制圆形。 9. 完成绘图后,释放画笔和画刷资源。 例如,一个简单的OnDraw覆盖可能如下所示: ```cpp void CYourView::OnDraw(CDC* pDC) { CDocument* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // 创建画笔对象 CPen pen(PS_SOLID, 1, RGB(255, 0, 0)); // 红色实线,1像素宽 CPen* pOldPen = pDC->SelectObject(&pen); // 创建画刷对象 CBrush brush(RGB(255, 255, 0)); // 黄色填充 CBrush* pOldBrush = pDC->SelectObject(&brush); // 获取视图的矩形区域,这里可以根据需要设置为圆形的外接矩形 CRect rect; GetClientRect(&rect); // 绘制圆 pDC->Ellipse(rect.left, ***, rect.right, rect.bottom); // 恢复旧对象 pDC->SelectObject(pOldPen); pDC->SelectObject(pOldBrush); } ``` 在这个例子中,我们使用了Ellipse函数来绘制一个圆。这个函数的参数定义了圆的外接矩形。为了实现更复杂的图形绘制,开发者可能还需要了解和使用其他的GDI函数,如MoveToEx、LineTo等。 标签中的"pendvc"可能是指CDC(设备上下文)对象,是MFC中进行所有绘图操作的基础设施。"mfc_ondraw画圆"则强调了OnDraw函数在绘图中的作用。"mfc_画圆_on"则说明了绘制圆是OnDraw函数中的主要任务。 在进行上机测试时,需要注意的是资源文件的具体路径,即"VC上机测试.zip",开发者需要正确地解压缩这个文件并按照文件中的指导进行操作。 总结来说,此资源文件提供了学习如何在MFC单文档应用程序中使用OnDraw函数绘制圆形的机会。它不仅包含了实现绘图功能的基础知识,还包括了创建画笔、画刷等GDI对象的过程,以及如何在设备上下文中进行图形绘制的具体示例。掌握这些知识对于学习MFC图形编程非常重要。

class JoystickControl(context: Context, attrs: AttributeSet?) : View(context, attrs) { private val paint = Paint(Paint.ANTI_ALIAS_FLAG) private var centerX = 0f private var centerY = 0f private var radius = 0f private var thumbX = 0f private var thumbY = 0f private var onJoystickChangeListener: OnJoystickChangeListener? = null interface OnJoystickChangeListener { fun onJoystickChanged(thumbX: Float, thumbY: Float) } fun setOnJoystickChangeListener(listener: OnJoystickChangeListener) { onJoystickChangeListener = listener } override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { centerX = w / 2f centerY = h / 2f radius = min(w, h) / 2f * 0.8f } override fun onDraw(canvas: Canvas) { paint.color = Color.GRAY canvas.drawCircle(centerX, centerY, radius, paint) paint.color = Color.RED val thumbRadius = radius / 5f canvas.drawCircle(thumbX + centerX, thumbY + centerY, thumbRadius, paint) } override fun onTouchEvent(event: MotionEvent): Boolean { when (event.action) { MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE -> { val distance = sqrt((event.x - centerX) * (event.x - centerX) +(event.y - centerY) * (event.y - centerY)) if (distance < radius) { thumbX = event.x - centerX thumbY = event.y - centerY invalidate() onJoystickChangeListener?.onJoystickChanged(thumbX, thumbY) } else { val angle = atan2(event.y - centerY, event.x - centerX) thumbX = cos(angle) * radius thumbY = sin(angle) * radius invalidate() onJoystickChangeListener?.onJoystickChanged(thumbX, thumbY) } } MotionEvent.ACTION_UP -> { thumbX = 0f thumbY = 0f invalidate() onJoystickChangeListener?.onJoystickChanged(thumbX, thumbY) } } return true } }我想加入传递游戏手柄参数的代码

2023-05-26 上传