对话框类调用视图类并绘图(基于MFC)

本文介绍如何在基于MFC的对话框应用中加入视图类,并通过示例代码展示如何在视图中绘制一条曲线。具体步骤包括创建视图类、在对话框中嵌入视图及实现绘图功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:这是参考网上相关的论坛内容综合加工而成,目的是在基于MFC的对话框中加入视图类并绘图。

实现方法:

 1.建立一个基于对话框的MFC应用程序MyDlg.

2.在对话框中加入一个静态文本档IDC_DRAW,作为视图类的容器

3.在MyDlg中新建一个视图类CMyView派生自CView,在CMyDlgDlg.cpp中加入代码(在类定义的前面部分写就可以了)

#include "MyView.h"
CMyView *m_pview;
4.在对话框的初始化函数中加入以下代码

    UINT ID = IDC_DRAW;  
    CWnd *pWnd = this->GetDlgItem(ID);  
    CRect Rect;  
    pWnd->GetWindowRect(Rect);  
    this->ScreenToClient(Rect);  
    m_pview = (CMyView*)RUNTIME_CLASS(CMyView)->CreateObject();
    if (NULL==m_pview)  
    {  
        return FALSE;  
    }  
     m_pview->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, Rect, this, ID); 
 
至此,创建完成,下面来进行测试,给视图里面画条曲线

1 在视图类的OnDraw函数添加如下代码

void CMyView::OnDraw(CDC* pDC) 
{
	// TODO: Add your specialized code here and/or call the base class

	CDocument* pDoc = GetDocument();
	
	// TODO: ÔÚ´Ë´¦Îª±¾»úÊý¾ÝÌí¼Ó»æÖÆ´úÂë
	int data[20]={18,21,32,40,41,39,42,35,33,23,17,20,24,11,9,19,22,32,40,36};
	CRect rc;
	GetClientRect(rc);
	rc.DeflateRect(50,50);
	int gridXnums=10,gridYnums=8;
	int dx=rc.Width()/gridXnums;
	int dy=rc.Height()/gridYnums;
	CRect gridRect(rc.left,rc.top,rc.left+dx*gridXnums,rc.top+dy*gridYnums);
	CPen gridPen(0,0,RGB(0,100,200));
	CPen *oldPen=pDC->SelectObject(&gridPen);
	for(int i=0;i<=gridXnums;i++)
	{
		pDC->MoveTo(gridRect.left+i*dx,gridRect.bottom);
		pDC->LineTo(gridRect.left+i*dx,gridRect.top);
	}
	for(i=0;i<=gridYnums;i++)
	{
		pDC->MoveTo(gridRect.left,gridRect.top+i*dy);
		pDC->LineTo(gridRect.right,gridRect.top+i*dy);
	}
	pDC->SelectObject(oldPen);
	gridPen.Detach();
	
	gridPen.CreatePen(0,0,RGB(0,0,200));
	pDC->SelectObject(&gridPen);
	CBrush gridBrush(RGB(255,0,0));
	CBrush* oldBrush=pDC->SelectObject(&gridBrush);
	POINT ptRect[4]={{-3,-3},{-3,3},{3,3},{3,-3}},ptDraw[4];
	int deta;
    POINT pt[256];
	int nCount=20;
	deta=gridRect.Width()/nCount;
	for(i=0;i<nCount;i++)
	{
		pt[i].x=gridRect.left+i*deta;
		pt[i].y=gridRect.bottom-(int)(data[i]/60.0*gridRect.Height());
		for(int j=0;j<4;j++)
		{
			ptDraw[j].x=ptRect[j].x+pt[i].x;
			ptDraw[j].y=ptRect[j].y+pt[i].y;
		}
		pDC->Polygon(ptDraw,4);
	}
	pDC->Polyline(pt,nCount);
	
	pDC->SelectObject(oldPen);
 pDC->SelectObject(oldBrush);
	
}

2 结果如下图



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值