使用MFC完成手动绘制直线、折线、矩形、圆的代码
时间: 2023-09-30 22:09:02 浏览: 71
以下是使用 MFC 完成手动绘制直线、折线、矩形、圆的代码示例:
1. 在 MFC 应用程序中添加一个继承自 CView 的类 MyView。
2. 在 MyView.h 中添加以下代码:
```cpp
#pragma once
class MyView : public CView
{
protected:
CPoint m_ptStart; // 起始点
CPoint m_ptEnd; // 终止点
int m_nShapeType; // 形状类型:0-直线,1-折线,2-矩形,3-圆形
public:
MyView();
virtual ~MyView();
protected:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};
```
3. 在 MyView.cpp 中添加以下代码:
```cpp
#include "stdafx.h"
#include "MyView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
IMPLEMENT_DYNCREATE(MyView, CView)
BEGIN_MESSAGE_MAP(MyView, CView)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_PAINT()
END_MESSAGE_MAP()
MyView::MyView()
{
m_nShapeType = 0;
}
MyView::~MyView()
{
}
void MyView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_ptStart = m_ptEnd = point;
SetCapture();
}
void MyView::OnMouseMove(UINT nFlags, CPoint point)
{
if (nFlags & MK_LBUTTON)
{
CClientDC dc(this);
dc.SetROP2(R2_NOTXORPEN);
dc.SelectStockObject(NULL_BRUSH);
switch (m_nShapeType)
{
case 0:
dc.MoveTo(m_ptStart);
dc.LineTo(m_ptEnd);
m_ptEnd = point;
dc.MoveTo(m_ptStart);
dc.LineTo(m_ptEnd);
break;
case 1:
dc.Rectangle(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y);
m_ptEnd = point;
dc.Rectangle(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y);
break;
case 2:
dc.Ellipse(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y);
m_ptEnd = point;
dc.Ellipse(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y);
break;
case 3:
dc.MoveTo(m_ptStart);
dc.LineTo(m_ptEnd);
m_ptEnd = point;
dc.MoveTo(m_ptStart);
dc.LineTo(m_ptEnd);
break;
}
}
}
void MyView::OnLButtonUp(UINT nFlags, CPoint point)
{
CClientDC dc(this);
dc.SetROP2(R2_COPYPEN);
dc.SelectStockObject(NULL_BRUSH);
switch (m_nShapeType)
{
case 0:
dc.MoveTo(m_ptStart);
dc.LineTo(m_ptEnd);
break;
case 1:
dc.Rectangle(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y);
break;
case 2:
dc.Ellipse(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y);
break;
case 3:
dc.Arc(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y,
(m_ptStart.x + m_ptEnd.x) / 2, (m_ptStart.y + m_ptEnd.y) / 2,
(m_ptStart.x + m_ptEnd.x) / 2, (m_ptStart.y + m_ptEnd.y) / 2);
break;
}
ReleaseCapture();
}
void MyView::OnPaint()
{
CPaintDC dc(this);
}
```
4. 在主窗口类中添加以下代码:
```cpp
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
CCreateContext* pContext)
{
m_wndSplitter.CreateStatic(this, 1, 2);
m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(MyView),
CSize(0, 0), pContext);
m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CScrollView),
CSize(0, 0), pContext);
return TRUE;
}
```
5. 在菜单资源中添加以下菜单项:
```
ID_SHAPE_LINE 直线
ID_SHAPE_POLY 折线
ID_SHAPE_RECT 矩形
ID_SHAPE_ELLIP 圆形
```
6. 在主窗口类中添加以下代码:
```cpp
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
ON_COMMAND(ID_SHAPE_LINE, OnShapeLine)
ON_COMMAND(ID_SHAPE_POLY, OnShapePoly)
ON_COMMAND(ID_SHAPE_RECT, OnShapeRect)
ON_COMMAND(ID_SHAPE_ELLIP, OnShapeEllip)
END_MESSAGE_MAP()
void CMainFrame::OnShapeLine()
{
MyView* pView = (MyView*)m_wndSplitter.GetPane(0, 0);
pView->m_nShapeType = 0;
}
void CMainFrame::OnShapePoly()
{
MyView* pView = (MyView*)m_wndSplitter.GetPane(0, 0);
pView->m_nShapeType = 1;
}
void CMainFrame::OnShapeRect()
{
MyView* pView = (MyView*)m_wndSplitter.GetPane(0, 0);
pView->m_nShapeType = 2;
}
void CMainFrame::OnShapeEllip()
{
MyView* pView = (MyView*)m_wndSplitter.GetPane(0, 0);
pView->m_nShapeType = 3;
}
```
7. 运行程序,选择菜单中的不同形状,手动绘制图形。
注意:以上代码示例只是演示如何手动绘制不同形状,还需要根据实际需要完善代码。