MFC绘图的几种方法

本文详细介绍了在MFC中进行绘图的四种主要方法:直接使用OnDraw()函数绘图,通过菜单触发绘图,自定义绘图函数以及利用工具栏设计实现图标和子菜单的关联绘图。并通过实例展示了如何在视图类中实现这些绘图功能。

MFC绘图的几种方法

/*

1.可以使用OnDraw()函数直接绘图;

 

2.使用菜单绘图(添加菜单——添加菜单函数(消息映射函数))

3.自定义函数绘图(添加成员函数——可以在OnDraw()函数调用,也可以在菜单函数里调用)

4.工具条设计(实现图标和子菜单关联)

 

*/

 

1.可以使用OnDraw()函数直接绘图;

/////////////////////////////////////////////////////////////////////////////
// CTestView drawing
 
void CTestView::OnDraw(CDC* pDC)
{
    CTestDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
 
    CRect rect;
    GetClientRect(&rect);
    pDC->SetMapMode(MM_ANISOTROPIC);
    pDC->SetWindowExt(rect.Width(),rect.Height());
    pDC->SetViewportExt(rect.Width(),-rect.Height());
    pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);
    rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);
    CPoint ld,rt;//
 
    //绘制外部黑色椭圆
    ld=CPoint(-200,-150),rt=CPoint(200,150);
    CBrush NewBrush, *pOldBrush;
    NewBrush.CreateSolidBrush(RGB(0,0,0));
    pOldBrush=pDC->SelectObject(&NewBrush);
    pDC->Ellipse(CRect(ld,rt));
    pDC->SelectObject(pOldBrush);
    NewBrush.DeleteObject();
 
    //绘制白色外部圆
    ld=CPoint(-147,-147),rt=CPoint(147,147);
    pDC->Ellipse(CRect(ld,rt));
 
    //绘制内部黑色椭圆
    ld=CPoint(-140,-90),rt=CPoint(140,90);
    NewBrush.CreateSolidBrush(RGB(0,0,0));
    pOldBrush=pDC->SelectObject(&NewBrush);
    pDC->Ellipse(CRect(ld,rt));
    pDC->SelectObject(pOldBrush);
    NewBrush.DeleteObject();
 
    //绘制白色内部圆
    ld=CPoint(-88,-88),rt=CPoint(88,88);
    pDC->Ellipse(CRect(ld,rt));
    
 
}

2.使用菜单绘图(添加菜单——添加菜单函数(消息映射函数))

 

void CTestView::OnMdraw() 
{
    // TODO: Add your command handler code here
    CDC * pDC=GetDC();//初始化指针pDC
    
    /*添加上一种方法的代码*/
 
    ReleaseDC(pDC);//释放指针
    
}
3.自定义函数绘图

 

void CTestView::DrawObject(CDC *pDC)
{
    CRect rect;
    GetClientRect(&rect);
    pDC->SetMapMode(MM_ANISOTROPIC);
    pDC->SetWindowExt(rect.Width(),rect.Height());
    pDC->SetViewportExt(rect.Width(),-rect.Height());
    pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);
    rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);
    CPoint ld,rt;//
 
    //绘制外部黑色椭圆
    ld=CPoint(-200,-150),rt=CPoint(200,150);
    CBrush NewBrush, *pOldBrush;
    NewBrush.CreateSolidBrush(RGB(0,0,0));
    pOldBrush=pDC->SelectObject(&NewBrush);
    pDC->Ellipse(CRect(ld,rt));
    pDC->SelectObject(pOldBrush);
    NewBrush.DeleteObject();
 
    //绘制白色外部圆
    ld=CPoint(-147,-147),rt=CPoint(147,147);
    pDC->Ellipse(CRect(ld,rt));
 
    //绘制内部黑色椭圆
    ld=CPoint(-140,-90),rt=CPoint(140,90);
    NewBrush.CreateSolidBrush(RGB(0,0,0));
    pOldBrush=pDC->SelectObject(&NewBrush);
    pDC->Ellipse(CRect(ld,rt));
    pDC->SelectObject(pOldBrush);
    NewBrush.DeleteObject();
 
    //绘制白色内部圆
    ld=CPoint(-88,-88),rt=CPoint(88,88);
    pDC->Ellipse(CRect(ld,rt));
 
}
两种方式调用

(1)在OnDraw()函数里面调用

// CTestView drawing
 
void CTestView::OnDraw(CDC* pDC)
{
    CTestDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
 
        DrawObject(pDC);
 
}
(2)在菜单函数里面调用

// CTestView message handlers
 
void CTestView::OnMdraw() 
{
    // TODO: Add your command handler code here
    CDC * pDC=GetDC();//初始化指针pDC
    
    DrawObject(pDC);
 
    ReleaseDC(pDC);//释放指针
    
}
 

4.工具条设计(实现图标和子菜单关联)

 

5、运行结果

 

原文:https://blog.csdn.net/lanyandong/article/details/80290691 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值