mfc完成简单画板程序的设计,要求有:利用 MFC/QT 的向导,创建基于单文档的应用程序; 2 编程实现,绘制线、圆、矩形、椭圆、菱形的功能; 3 能够设定当前要画的图形样式(只包括以上 5 种)和图形颜色(最少能够设 为 4 种颜色)。 4 当窗口重绘(如窗口最小化-重新打开)后,还能保持原来的图形(不得使 用截屏方式)。 5 图像互相重叠时,能正确显示图像
时间: 2024-04-21 16:25:54 浏览: 12
以下是MFC完成简单画板程序的设计:
1. 创建基于单文档的应用程序,可以使用MFC向导进行创建。
2. 实现绘制线、圆、矩形、椭圆、菱形的功能。可以在View类中重载OnDraw函数,在其中使用MFC提供的绘图函数进行绘制。例如,使用CPen和CBrush设置画笔和填充样式,使用MoveTo和LineTo绘制线段,使用Ellipse和Rectangle绘制圆和矩形等图形。同时,需要在View类中添加处理鼠标事件的函数,以便用户能够通过鼠标绘制图形。
3. 设定当前要画的图形样式和颜色。可以在View类中添加公共成员变量和函数,用于存储和修改当前的画笔和填充样式。同时,在绘制图形时,需要根据当前的画笔和填充样式进行设置。
4. 保持原来的图形。可以在View类中添加成员变量,用于存储绘制的图形对象。在重绘窗口时,可以在OnDraw函数中遍历存储的对象,并进行重新绘制。
5. 正确显示图像重叠。可以在View类中添加一个成员变量,用于存储所有绘制的图形对象。在绘制新的图形时,需要遍历所有存储的图形对象,检查是否与新的图形重叠。如果重叠,则需要调整绘制顺序,确保图形正确显示。
需要注意的是,MFC提供了丰富的绘图函数和类,可以根据需要进行选择和使用。同时,需要熟悉MFC的事件处理机制和消息传递机制,以便实现用户交互和图形绘制。
相关问题
mfc完成简单画板程序的设计,要求有:利用 MFC/QT 的向导,创建基于单文档的应用程序;图像互相重叠时,能正确显示图像。给出详细代码
以下是一个基于 MFC 的简单画板程序设计的代码,实现了绘制直线、矩形和椭圆三种基本图形的功能。在图形重叠时,采用了透明度的方式来显示图形。
首先,使用 MFC/QT 的向导创建一个基于单文档的应用程序,然后在 CMyPaintDoc 类中添加以下成员变量和函数:
```c++
class CMyPaintDoc : public CDocument
{
protected:
CObArray m_arrShapes; // 保存图形的数组
int m_nPenWidth; // 画笔宽度
COLORREF m_clrPenColor; // 画笔颜色
public:
// 添加图形的函数
void AddShape(CShape* pShape);
// 获取图形数组的大小
int GetShapeCount() const;
// 获取指定索引处的图形
CShape* GetShape(int nIndex) const;
// 清空图形数组
void ClearShapes();
// 设置画笔宽度
void SetPenWidth(int nWidth);
// 获取画笔宽度
int GetPenWidth() const;
// 设置画笔颜色
void SetPenColor(COLORREF clr);
// 获取画笔颜色
COLORREF GetPenColor() const;
};
```
在 CMyPaintDoc 类的实现文件中,添加以下代码:
```c++
void CMyPaintDoc::AddShape(CShape* pShape)
{
m_arrShapes.Add(pShape);
SetModifiedFlag(); // 文档已被修改,需要保存
}
int CMyPaintDoc::GetShapeCount() const
{
return m_arrShapes.GetSize();
}
CShape* CMyPaintDoc::GetShape(int nIndex) const
{
return (CShape*)m_arrShapes.GetAt(nIndex);
}
void CMyPaintDoc::ClearShapes()
{
for (int i = 0; i < GetShapeCount(); i++)
delete GetShape(i);
m_arrShapes.RemoveAll();
SetModifiedFlag(); // 文档已被修改,需要保存
}
void CMyPaintDoc::SetPenWidth(int nWidth)
{
m_nPenWidth = nWidth;
}
int CMyPaintDoc::GetPenWidth() const
{
return m_nPenWidth;
}
void CMyPaintDoc::SetPenColor(COLORREF clr)
{
m_clrPenColor = clr;
}
COLORREF CMyPaintDoc::GetPenColor() const
{
return m_clrPenColor;
}
```
接下来,在 CMyPaintView 类中添加以下成员变量和函数:
```c++
class CMyPaintView : public CView
{
protected:
CPoint m_ptPrev; // 前一个点
int m_nDrawMode; // 绘制模式
CShape* m_pCurShape; // 当前绘制的图形
public:
CMyPaintDoc* GetDocument() const;
// 绘制直线
void DrawLine(const CPoint& ptFrom, const CPoint& ptTo);
// 绘制矩形
void DrawRect(const CPoint& ptFrom, const CPoint& ptTo);
// 绘制椭圆
void DrawEllipse(const CPoint& ptFrom, const CPoint& ptTo);
// 设置绘制模式
void SetDrawMode(int nMode);
// 获取绘制模式
int GetDrawMode() const;
};
```
在 CMyPaintView 类的实现文件中,添加以下代码:
```c++
CMyPaintDoc* CMyPaintView::GetDocument() const
{
return reinterpret_cast<CMyPaintDoc*>(m_pDocument);
}
void CMyPaintView::DrawLine(const CPoint& ptFrom, const CPoint& ptTo)
{
CDC* pDC = GetDC();
CPen pen(PS_SOLID, GetDocument()->GetPenWidth(), GetDocument()->GetPenColor());
CPen* pOldPen = pDC->SelectObject(&pen);
pDC->MoveTo(ptFrom);
pDC->LineTo(ptTo);
pDC->SelectObject(pOldPen);
ReleaseDC(pDC);
}
void CMyPaintView::DrawRect(const CPoint& ptFrom, const CPoint& ptTo)
{
CDC* pDC = GetDC();
CPen pen(PS_SOLID, GetDocument()->GetPenWidth(), GetDocument()->GetPenColor());
CBrush brush(GetDocument()->GetPenColor());
CBrush* pOldBrush = pDC->SelectObject(&brush);
CPen* pOldPen = pDC->SelectObject(&pen);
pDC->Rectangle(CRect(ptFrom, ptTo));
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
ReleaseDC(pDC);
}
void CMyPaintView::DrawEllipse(const CPoint& ptFrom, const CPoint& ptTo)
{
CDC* pDC = GetDC();
CPen pen(PS_SOLID, GetDocument()->GetPenWidth(), GetDocument()->GetPenColor());
CBrush brush(GetDocument()->GetPenColor());
CBrush* pOldBrush = pDC->SelectObject(&brush);
CPen* pOldPen = pDC->SelectObject(&pen);
pDC->Ellipse(CRect(ptFrom, ptTo));
pDC->SelectObject(pOldBrush);
pDC->SelectObject(pOldPen);
ReleaseDC(pDC);
}
void CMyPaintView::SetDrawMode(int nMode)
{
m_nDrawMode = nMode;
}
int CMyPaintView::GetDrawMode() const
{
return m_nDrawMode;
}
```
最后,在 CShape 类中添加以下成员变量和函数:
```c++
class CShape
{
protected:
CPoint m_ptFrom; // 起点
CPoint m_ptTo; // 终点
int m_nPenWidth; // 画笔宽度
COLORREF m_clrPenColor; // 画笔颜色
public:
CShape(const CPoint& ptFrom, const CPoint& ptTo, int nPenWidth, COLORREF clrPenColor);
virtual ~CShape();
CPoint GetFromPoint() const;
CPoint GetToPoint() const;
int GetPenWidth() const;
COLORREF GetPenColor() const;
virtual void Draw(CDC* pDC) = 0; // 纯虚函数,绘制图形
};
```
在 CShape 类的实现文件中,添加以下代码:
```c++
CShape::CShape(const CPoint& ptFrom, const CPoint& ptTo, int nPenWidth, COLORREF clrPenColor)
{
m_ptFrom = ptFrom;
m_ptTo = ptTo;
m_nPenWidth = nPenWidth;
m_clrPenColor = clrPenColor;
}
CShape::~CShape()
{
}
CPoint CShape::GetFromPoint() const
{
return m_ptFrom;
}
CPoint CShape::GetToPoint() const
{
return m_ptTo;
}
int CShape::GetPenWidth() const
{
return m_nPenWidth;
}
COLORREF CShape::GetPenColor() const
{
return m_clrPenColor;
}
```
然后,分别创建 CLineShape、CRectShape 和 CEllipseShape 类,继承自 CShape 类,实现 Draw 函数,绘制直线、矩形和椭圆图形。
最后,在 CMyPaintView 类中添加以下代码,实现绘制图形和鼠标事件的处理:
```c++
void CMyPaintView::OnDraw(CDC* pDC)
{
CMyPaintDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
for (int i = 0; i < pDoc->GetShapeCount(); i++)
{
CShape* pShape = pDoc->GetShape(i);
ASSERT_VALID(pShape);
if (pShape)
pShape->Draw(pDC);
}
}
void CMyPaintView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_ptPrev = point;
switch (GetDrawMode())
{
case DRAW_LINE:
m_pCurShape = new CLineShape(point, point, GetDocument()->GetPenWidth(), GetDocument()->GetPenColor());
break;
case DRAW_RECT:
m_pCurShape = new CRectShape(point, point, GetDocument()->GetPenWidth(), GetDocument()->GetPenColor());
break;
case DRAW_ELLIPSE:
m_pCurShape = new CEllipseShape(point, point, GetDocument()->GetPenWidth(), GetDocument()->GetPenColor());
break;
}
CView::OnLButtonDown(nFlags, point);
}
void CMyPaintView::OnMouseMove(UINT nFlags, CPoint point)
{
if (nFlags & MK_LBUTTON && m_pCurShape)
{
CClientDC dc(this);
dc.SetROP2(R2_NOTXORPEN);
m_pCurShape->Draw(&dc);
switch (GetDrawMode())
{
case DRAW_LINE:
m_pCurShape->GetToPoint() = point;
break;
case DRAW_RECT:
case DRAW_ELLIPSE:
m_pCurShape->GetToPoint().x = point.x;
m_pCurShape->GetToPoint().y = point.y;
break;
}
m_pCurShape->Draw(&dc);
}
CView::OnMouseMove(nFlags, point);
}
void CMyPaintView::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_pCurShape)
{
CClientDC dc(this);
m_pCurShape->Draw(&dc);
GetDocument()->AddShape(m_pCurShape);
m_pCurShape = NULL;
}
CView::OnLButtonUp(nFlags, point);
}
void CMyPaintView::OnInitialUpdate()
{
CView::OnInitialUpdate();
SetDrawMode(DRAW_LINE); // 默认绘制直线
SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize());
}
void CMyPaintView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
CMyPaintDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
if (lHint == NULL) // 全部更新
{
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
Invalidate();
}
else // 部分更新
{
CRect* pRect = (CRect*)lHint;
InvalidateRect(pRect);
}
}
```
最后,在 CShape 类中添加以下代码,实现透明度的方式显示图形:
```c++
void CShape::Draw(CDC* pDC)
{
CRect rc(m_ptFrom, m_ptTo);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMem.SelectObject(&bmp);
dcMem.FillSolidRect(0, 0, rc.Width(), rc.Height(), RGB(255, 255, 255)); // 白色背景
dcMem.SetBkMode(TRANSPARENT);
CPen pen(PS_SOLID, m_nPenWidth, m_clrPenColor);
CPen* pOldPen = dcMem.SelectObject(&pen);
CBrush brush(m_clrPenColor);
CBrush* pOldBrush = dcMem.SelectObject(&brush);
DrawShape(&dcMem); // 绘制图形
dcMem.SelectObject(pOldBrush);
dcMem.SelectObject(pOldPen);
dcMem.SelectObject(pOldBitmap);
pDC->BitBlt(m_ptFrom.x, m_ptFrom.y, rc.Width(), rc.Height(), &dcMem, 0, 0, SRCCOPY);
}
void CLineShape::DrawShape(CDC* pDC)
{
pDC->MoveTo(m_ptFrom);
pDC->LineTo(m_ptTo);
}
void CRectShape::DrawShape(CDC* pDC)
{
pDC->Rectangle(CRect(m_ptFrom, m_ptTo));
}
void CEllipseShape::DrawShape(CDC* pDC)
{
pDC->Ellipse(CRect(m_ptFrom, m_ptTo));
}
```
至此,一个基于 MFC 的简单画板程序就完成了。完整的代码如下:
利用 MFC/QT 的向导,创建基于单文档的应用程序;编程实现,绘制菱形的功能;
好的,我可以为您解答这个问题。
首先,您需要使用 MFC/QT 的向导工具创建一个单文档应用程序。在创建应用程序时,请确保选择“单文档”模板。
接下来,您需要打开应用程序的主视图,这是您可以在其中添加绘图代码的地方。在主视图的头文件中添加以下代码:
```cpp
class CMyView : public CView
{
public:
CMyView();
virtual ~CMyView();
protected:
virtual void OnDraw(CDC* pDC); // 重写绘图函数
DECLARE_MESSAGE_MAP()
};
```
在源文件中添加以下代码:
```cpp
CMyView::CMyView()
{
}
CMyView::~CMyView()
{
}
void CMyView::OnDraw(CDC* pDC)
{
CRect rect;
GetClientRect(&rect); // 获取客户区矩形
int width = rect.Width(); // 获取矩形宽度
int height = rect.Height(); // 获取矩形高度
int x = width / 2; // 计算中心点横坐标
int y = height / 2; // 计算中心点纵坐标
int size = 100; // 菱形大小
// 计算菱形四个点的坐标
POINT points[4] = {
{x, y - size},
{x + size, y},
{x, y + size},
{x - size, y}
};
pDC->Polygon(points, 4); // 绘制菱形
}
BEGIN_MESSAGE_MAP(CMyView, CView)
END_MESSAGE_MAP()
```
最后,在应用程序的 InitInstance 函数中添加以下代码:
```cpp
BOOL CMyApp::InitInstance()
{
// ...
m_pMainWnd = new CFrameWnd;
m_pMainWnd->Create(NULL, _T("My App"), WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_MAINFRAME));
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
CMyView* pView = new CMyView;
((CFrameWnd*)m_pMainWnd)->AddView(pView);
// ...
return TRUE;
}
```
这样,当应用程序启动时,将创建一个菱形视图,并在其中绘制一个菱形。
请注意,这只是一个基本的实现方法,您可以根据需要进行修改和调整。