VS019MFC图形的保存和重绘

时间: 2024-02-17 12:04:30 浏览: 21
在 MFC 中,可以使用 CDC 类来进行图形的保存和重绘。 要保存图形,可以使用 CDC::SaveDC 函数保存当前的设备上下文,并使用 CDC::RestoreDC 函数在需要时恢复设备上下文。例如,可以在 OnPaint 函数中进行绘图,并在需要保存图形时调用 SaveDC 函数保存当前的设备上下文,然后在需要重绘时调用 RestoreDC 函数恢复设备上下文,并使用 CDC::BitBlt 函数将保存的图形复制到屏幕上。 以下是保存和重绘图形的示例代码: ``` void CMyView::OnPaint() { CPaintDC dc(this); // 绘制图形 // ... // 保存当前设备上下文 int nSavedDC = dc.SaveDC(); // 在需要保存图形的地方调用 SaveDC 函数 // ... // 恢复设备上下文并重绘图形 dc.RestoreDC(nSavedDC); dc.BitBlt(x, y, width, height, &dcSaved, x, y, SRCCOPY); } ``` 其中,dcSaved 是保存图形时使用的 CDC 对象。使用 BitBlt 函数将保存的图形复制到屏幕上时,可以指定复制的位置和大小。
相关问题

mfc edit重绘 图片

### 回答1: MFC (Microsoft Foundation Class)是微软公司开发的一套用于开发Windows应用程序的类库。MFC Edit控件是MFC库中的一个编辑框控件,用于接收和显示用户的输入文本。 要实现MFC Edit控件的重绘功能并显示图片,我们可以按照以下步骤进行操作: 首先,需要在MFC Edit控件的类中添加一个成员变量,用于存储图片的句柄或者路径。例如,可以添加一个成员变量CString m_imagePath; 然后,在控件的OnPaint()方法中进行重绘操作。在这个方法中,首先通过GetClientRect()函数获取Edit控件的客户区域大小,并保存到一个CRect对象中。 接下来,可以使用GDI+来绘制图片。通过Gdiplus::Graphics类的实例化对象,可以获取到绘图设备的句柄。然后,通过Gdiplus::Image类的实例化对象,将图片加载到内存中。 通过使用Gdiplus::Graphics类中的DrawImage()函数,可以将加载的图片绘制到Edit控件的客户区域中。可以指定绘制的区域,例如可以使用前面获取的CRect对象作为目标绘制区域。 最后,需要注意在Edit控件获取焦点或者失去焦点时,以及大小发生变化时,都要重新进行重绘。可以在控件的OnSetFocus()、OnKillFocus()和OnSize()等方法中进行相应的处理。 综上所述,我们可以通过以上步骤实现在MFC Edit控件中绘制图片的重绘功能。这样,用户输入文本的同时,还能够显示图片,提供更好的用户体验。 ### 回答2: MFC是一种用于 Windows 平台的图形用户界面(GUI)开发框架,它提供了各种控件和功能供开发人员使用。在MFC中,Edit控件是一种用于显示和编辑文本的控件。要重绘Edit控件中的图片,可以使用以下步骤: 1. 创建一个继承自CEdit的自定义类,在该类中重载OnPaint函数。 2. 在OnPaint函数中,使用CDC类的函数获取当前绘图设备的句柄,即HDC。 3. 使用GDI+或其他图形库加载并绘制图片。例如,使用GDI+库可以使用Gdiplus::Image类的FromXXX函数加载图片,并使用Gdiplus::Graphics类的DrawImage函数绘制图片到HDC中。 4. 调用CEdit的父类函数OnPaint,将绘制好的图片显示在Edit控件上。 以下是一个简单的示例代码: ``` // 自定义的Edit控件类 class CMyEdit : public CEdit { protected: afx_msg void OnPaint() { CPaintDC dc(this); // 获取绘图设备的句柄 CDC MemDC; // 内存DC用于绘制图片 CBitmap MemBitmap; MemDC.CreateCompatibleDC(&dc); MemBitmap.CreateCompatibleBitmap(&dc, GetClientRect().Width(), GetClientRect().Height()); MemDC.SelectObject(&MemBitmap); // 在内存DC中绘制图片 // ... dc.BitBlt(0, 0, GetClientRect().Width(), GetClientRect().Height(), &MemDC, 0, 0, SRCCOPY); CEdit::OnPaint(); // 调用父类函数以便编辑文本 } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CMyEdit, CEdit) ON_WM_PAINT() END_MESSAGE_MAP() // 在对话框类中使用自定义的Edit控件类 CMyEdit m_myEdit; m_myEdit.Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_READONLY, CRect(10, 10, 200, 200), this, IDC_MY_EDIT); // 在需要的时候重绘图片 m_myEdit.Invalidate(); m_myEdit.UpdateWindow(); ``` 通过以上方法,可以在MFC中的Edit控件中实现重绘图片的效果。

vs2019用mfc单个文档绘制简单图形

可以通过在 MFC 的文档/视图结构中添加绘图功能来实现在单个文档中绘制简单图形。下面是一个示例,该示例展示了如何在 MFC 应用程序中创建一个简单的绘图工具,该工具允许用户在文档视图中绘制直线和矩形。 1. 创建一个 MFC 单文档应用程序。 2. 在资源视图中添加两个按钮和一个编辑框,分别用于选择绘制直线或矩形,设置线条颜色和宽度。 3. 在文档类中添加以下成员变量: ``` // 用于保存当前绘制的图形类型 enum ShapeType { LINE, RECTANGLE }; ShapeType m_shapeType; // 用于保存当前线条颜色和宽度 COLORREF m_lineColor; int m_lineWidth; ``` 4. 在文档类中添加以下成员函数: ``` void SetShapeType(ShapeType type); void SetLineColor(COLORREF color); void SetLineWidth(int width); ``` 5. 在文档类实现文件中实现这些函数。例如,SetShapeType 函数可以实现如下: ``` void CMyDoc::SetShapeType(ShapeType type) { m_shapeType = type; } ``` 6. 在视图类的头文件中添加以下成员函数: ``` afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); ``` 7. 在视图类的实现文件中添加以下代码: ``` void CMyView::OnLButtonDown(UINT nFlags, CPoint point) { // 记录鼠标按下的位置 m_startPoint = point; // 根据文档类中保存的图形类型,创建一个新的图形对象 switch (GetDocument()->m_shapeType) { case CMyDoc::LINE: m_currentShape = new CLineShape(m_startPoint, m_startPoint); break; case CMyDoc::RECTANGLE: m_currentShape = new CRectShape(m_startPoint, m_startPoint); break; } CScrollView::OnLButtonDown(nFlags, point); } void CMyView::OnMouseMove(UINT nFlags, CPoint point) { if (m_currentShape != NULL) { // 更新当前图形对象的结束位置 m_currentShape->SetEndPoint(point); // 强制重绘视图 Invalidate(); } CScrollView::OnMouseMove(nFlags, point); } void CMyView::OnLButtonUp(UINT nFlags, CPoint point) { if (m_currentShape != NULL) { // 更新当前图形对象的结束位置 m_currentShape->SetEndPoint(point); // 将当前图形对象添加到文档中 GetDocument()->AddShape(m_currentShape); // 释放当前图形对象 m_currentShape = NULL; // 强制重绘视图 Invalidate(); } CScrollView::OnLButtonUp(nFlags, point); } ``` 8. 在文档类中添加以下成员变量和成员函数: ``` // 用于保存所有图形对象的列表 CList<CShape*, CShape*> m_shapeList; void AddShape(CShape* shape); void RemoveAllShapes(); ``` 9. 在文档类实现文件中实现这些函数。例如,AddShape 函数可以实现如下: ``` void CMyDoc::AddShape(CShape* shape) { m_shapeList.AddTail(shape); } ``` 10. 在视图类的头文件中添加以下成员函数: ``` afx_msg void OnDraw(CDC* pDC); ``` 11. 在视图类的实现文件中添加以下代码: ``` void CMyView::OnDraw(CDC* pDC) { // 遍历文档中保存的所有图形对象,绘制它们 POSITION pos = GetDocument()->m_shapeList.GetHeadPosition(); while (pos != NULL) { CShape* shape = GetDocument()->m_shapeList.GetNext(pos); shape->Draw(pDC); } // 如果当前有正在绘制的图形对象,也绘制它 if (m_currentShape != NULL) { m_currentShape->Draw(pDC); } } ``` 12. 在文档类中添加以下成员函数: ``` void Serialize(CArchive& ar); ``` 13. 在文档类实现文件中实现 Serialize 函数,以便保存和加载文档中的图形数据。例如,可以将函数实现为: ``` void CMyDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // 存储图形数据 ar << (DWORD)m_shapeList.GetCount(); POSITION pos = m_shapeList.GetHeadPosition(); while (pos != NULL) { CShape* shape = m_shapeList.GetNext(pos); shape->Serialize(ar); } } else { // 加载图形数据 RemoveAllShapes(); DWORD count; ar >> count; for (DWORD i = 0; i < count; i++) { CShape* shape = NULL; UINT type; ar >> type; switch (type) { case CShape::LINE: shape = new CLineShape(); break; case CShape::RECTANGLE: shape = new CRectShape(); break; } if (shape != NULL) { shape->Serialize(ar); m_shapeList.AddTail(shape); } } } } ``` 14. 创建一个基类为 CShape 的图形类,包括以下成员变量和成员函数: ``` // 用于保存起点和终点 CPoint m_startPoint; CPoint m_endPoint; // 用于序列化 enum { LINE, RECTANGLE }; virtual void Serialize(CArchive& ar); // 用于绘制 virtual void Draw(CDC* pDC) = 0; // 用于设置起点和终点 void SetStartPoint(const CPoint& point); void SetEndPoint(const CPoint& point); ``` 15. 在 CShape 类实现文件中实现这些函数。例如,SetStartPoint 函数可以实现如下: ``` void CShape::SetStartPoint(const CPoint& point) { m_startPoint = point; } ``` 16. 创建一个基类为 CLineShape 的直线类,继承自 CShape 类,包括以下成员变量和成员函数: ``` // 用于设置起点和终点 CLineShape(const CPoint& startPoint = CPoint(0, 0), const CPoint& endPoint = CPoint(0, 0)); virtual void SetEndPoint(const CPoint& point); virtual void Draw(CDC* pDC); ``` 17. 在 CLineShape 类实现文件中实现这些函数。例如,Draw 函数可以实现如下: ``` void CLineShape::Draw(CDC* pDC) { CPen pen(PS_SOLID, GetLineWidth(), GetLineColor()); CPen* pOldPen = pDC->SelectObject(&pen); pDC->MoveTo(m_startPoint); pDC->LineTo(m_endPoint); pDC->SelectObject(pOldPen); } ``` 18. 创建一个基类为 CRectShape 的矩形类,继承自 CShape 类,包括以下成员变量和成员函数: ``` // 用于设置起点和终点 CRectShape(const CPoint& startPoint = CPoint(0, 0), const CPoint& endPoint = CPoint(0, 0)); virtual void SetEndPoint(const CPoint& point); virtual void Draw(CDC* pDC); ``` 19. 在 CRectShape 类实现文件中实现这些函数。例如,Draw 函数可以实现如下: ``` void CRectShape::Draw(CDC* pDC) { CPen pen(PS_SOLID, GetLineWidth(), GetLineColor()); CPen* pOldPen = pDC->SelectObject(&pen); CBrush brush(GetLineColor()); CBrush* pOldBrush = pDC->SelectObject(&brush); pDC->Rectangle(CRect(m_startPoint, m_endPoint)); pDC->SelectObject(pOldBrush); pDC->SelectObject(pOldPen); } ``` 这样,就可以在 MFC 单文档应用程序中创建一个简单的绘图工具,允许用户在文档视图中绘制直线和矩形。

相关推荐

最新推荐

recommend-type

VS2017 MFC 实测打包流程

VS2017 MFC 实测打包流程,可以实现MFC程序打包,并在其它机台上没有安装VS也可以正常运行。
recommend-type

VS2010 MFC编程入门教程

C++ 编程入门系列给大家讲了 C++ 的编程入门知识,大家对 C++ 语言在语法和设计思想上应该有了一定的了解。在这套 VS2010/MFC编程入门教中,将会给大家讲解怎样使用 VS201进行可视化编程。
recommend-type

VS2017 MFC调用DLL创建的共享内存(图文教程).docx

通过图文描述介绍MFC与dll之间通过共享内存建立通信,文件内附有可直接复制的代码,文档和文档里的代码是基于VS2017编写的。前两天通过VS2019实现,文件里的代码在通过VS2019仍然可以实现。初学MFC与dll之间通信的...
recommend-type

C++MFC 使用VS2010导出Excel的方法及步骤.doc

C++MFC 使用VS2010导出Excel的方法及步骤 ,基本方法与步骤,带有少量的代码实例,具有参考意义
recommend-type

vs2008下的MFC编程

vs2008的简单入门,非常简单,适合VC6.0转到VS2008的预热。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

机器学习怎么将excel转为csv文件

机器学习是一种利用计算机算法和统计数据的方法来训练计算机来进行自动学习的科学,无法直接将excel文件转为csv文件。但是可以使用Python编程语言来读取Excel文件内容并将其保存为CSV文件。您可以使用Pandas库来读取Excel文件,并使用to_csv()函数将其保存为CSV格式。以下是代码示例: ```python import pandas as pd # 读取 Excel 文件 excel_data = pd.read_excel('example.xlsx') # 将数据保存为 CSV 文件 excel_data.to_csv('example.csv', index=
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。