MFC简易画图

开发一个MFC绘图程序,基于“文档-视图”结构,在客户区能够完成: ①画直线 ②画矩形 ③画圆(椭圆) ④画任意折线(右键结束) ⑤画任意多边形(右键结束,并形成闭环) 注:图形中的每个“节点”均利用圆点●标记画出,且双缓存去闪机制 程序中集成“对话框”交互界面(模态与非模态均可),用于实现改变: ①画笔宽度 ②画笔颜色(可以直接使用MFC的CColorDialog类) ③画笔线型
专业程序代写 c++程序代写

转载于:https://www.cnblogs.com/java20131201/p/3466382.html

以下是一个基于VC++ MFC简易画图板代码示例: 首先,创建一个MFC应用程序,选择“单文档”类型,然后在资源编辑器添加一个菜单项“画图板”。 在CMainFrame类添加以下代码: ```cpp #include "MyView.h" class CMainFrame : public CFrameWnd { public: CMainFrame(); protected: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnPaint(); afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg void OnDrawLine(); afx_msg void OnDrawRectangle(); afx_msg void OnDrawEllipse(); DECLARE_MESSAGE_MAP() private: MyView m_wndView; }; CMainFrame::CMainFrame() { Create(NULL, _T("Drawing Board"), WS_OVERLAPPEDWINDOW, CRect(0, 0, 800, 600)); } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL)) { TRACE0("Failed to create view window\n"); return -1; } return 0; } void CMainFrame::OnPaint() { CPaintDC dc(this); // device context for painting CRect rect; GetClientRect(&rect); dc.FillSolidRect(&rect, RGB(255, 255, 255)); } void CMainFrame::OnSize(UINT nType, int cx, int cy) { CFrameWnd::OnSize(nType, cx, cy); if (m_wndView.GetSafeHwnd()) m_wndView.MoveWindow(0, 0, cx, cy); } void CMainFrame::OnDrawLine() { m_wndView.SetDrawType(DRAW_LINE); } void CMainFrame::OnDrawRectangle() { m_wndView.SetDrawType(DRAW_RECTANGLE); } void CMainFrame::OnDrawEllipse() { m_wndView.SetDrawType(DRAW_ELLIPSE); } BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_CREATE() ON_WM_PAINT() ON_WM_SIZE() ON_COMMAND(ID_DRAW_LINE, &CMainFrame::OnDrawLine) ON_COMMAND(ID_DRAW_RECTANGLE, &CMainFrame::OnDrawRectangle) ON_COMMAND(ID_DRAW_ELLIPSE, &CMainFrame::OnDrawEllipse) END_MESSAGE_MAP() ``` 在MyView类添加以下代码: ```cpp enum DRAW_TYPE { DRAW_NONE = 0, DRAW_LINE, DRAW_RECTANGLE, DRAW_ELLIPSE }; class MyView : public CView { protected: MyView(); DECLARE_DYNCREATE(MyView) public: virtual void OnDraw(CDC* pDC); virtual BOOL PreCreateWindow(CREATESTRUCT& cs); virtual ~MyView(); void SetDrawType(DRAW_TYPE type) { m_nDrawType = type; } 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); DECLARE_MESSAGE_MAP() private: DRAW_TYPE m_nDrawType; CPoint m_ptStart; CPoint m_ptEnd; }; MyView::MyView() { m_nDrawType = DRAW_NONE; } MyView::~MyView() { } BOOL MyView::PreCreateWindow(CREATESTRUCT& cs) { return CView::PreCreateWindow(cs); } void MyView::OnDraw(CDC* pDC) { CDocument* pDoc = GetDocument(); // TODO: add draw code here } void MyView::OnLButtonDown(UINT nFlags, CPoint point) { m_ptStart = point; CView::OnLButtonDown(nFlags, point); } void MyView::OnMouseMove(UINT nFlags, CPoint point) { if (nFlags & MK_LBUTTON) { CDC* pDC = GetDC(); CPen pen; pen.CreatePen(PS_SOLID, 2, RGB(0, 0, 0)); pDC->SelectObject(&pen); pDC->SetROP2(R2_NOTXORPEN); switch (m_nDrawType) { case DRAW_LINE: pDC->MoveTo(m_ptStart); pDC->LineTo(m_ptEnd); m_ptEnd = point; pDC->MoveTo(m_ptStart); pDC->LineTo(m_ptEnd); break; case DRAW_RECTANGLE: pDC->Rectangle(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y); m_ptEnd = point; pDC->Rectangle(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y); break; case DRAW_ELLIPSE: pDC->Ellipse(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y); m_ptEnd = point; pDC->Ellipse(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y); break; default: break; } ReleaseDC(pDC); } CView::OnMouseMove(nFlags, point); } void MyView::OnLButtonUp(UINT nFlags, CPoint point) { m_ptEnd = point; CView::OnLButtonUp(nFlags, point); } BEGIN_MESSAGE_MAP(MyView, CView) ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() END_MESSAGE_MAP() ``` 在资源编辑器为菜单项添加ID_DRAW_LINE、ID_DRAW_RECTANGLE和ID_DRAW_ELLIPSE命令ID。 最后,在CWinApp类的InitInstance()函数添加以下代码: ```cpp BOOL CMyApp::InitInstance() { CWinApp::InitInstance(); CMainFrame* pFrame = new CMainFrame; m_pMainWnd = pFrame; pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL); m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); return TRUE; } ``` 现在,你就可以编译并运行这个简易画图板了,它可以画线、矩形和椭圆。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值