MFC的OnDraw函数问题

情歌王子 2012-11-19 05:46:35
我写了一个MFC绘图程序,然后我重新定义了OnDraw函数(其实也就是在里面加了很多代码),让我在改变窗口时图形不会消失,而是原样重绘显示在窗口上,当然这是我想要的。
但是我现在又新建了一个菜单栏,并命名为“重新绘制”,我想在单击该菜单栏的时候,所有图形可以消失,也就是达到重新绘制(刷白,没有图形显示)的效果。但是OnDraw函数已经被我重定义了。
我是这样干的,将“重新绘制”菜单栏关联一个函数:OnRePaint(),函数定义如下:
OnRePaint()
{
CView::OnPaint();
}
但是这样并不能达到刷白的效果。
...全文
781 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
宿舍大老鼠 2013-03-11
  • 打赏
  • 举报
回复
void CMyView::OnDraw(CDC* pDC) { CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); extern BOOL Whether_repaint; CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); pDC->SelectObject(pBrush); if(Whether_repaint==TRUE) { for(int i=0;i<m_ptrArray1.GetSize();i++)//几何图形的重绘 { CPen pen(((CGraph*)m_ptrArray1.GetAt(i))->CG_nLineStyle,((CGraph*)m_ptrArray1.GetAt(i))->CG_number4, RGB(((CGraph*)m_ptrArray1.GetAt(i))->CG_number1,((CGraph*)m_ptrArray1.GetAt(i))->CG_number2, ((CGraph*)m_ptrArray1.GetAt(i))->CG_number3)); CPen *pOldPen=pDC->SelectObject(&pen); switch(((CGraph*)m_ptrArray1.GetAt(i))->CG_nDrawType) { case 1: pDC->MoveTo(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin); pDC->LineTo(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin); break; case 2: pDC->MoveTo(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin); pDC->LineTo(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptEnd); break; case 3: pDC->Rectangle(CRect(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin,((CGraph*)m_ptrArray1.GetAt(i))->CG_ptEnd)); break; case 4: pDC->Ellipse(CRect(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin,((CGraph*)m_ptrArray1.GetAt(i))->CG_ptEnd)); break; } } for(int j=0;j<m_ptrArray2.GetSize()-1;j++)//连续线条的重绘 { CPen pen(((CGraph*)m_ptrArray2.GetAt(j))->CG_nLineStyle,((CGraph*)m_ptrArray2.GetAt(j))->CG_number4, RGB(((CGraph*)m_ptrArray2.GetAt(j))->CG_number1,((CGraph*)m_ptrArray2.GetAt(j))->CG_number2, ((CGraph*)m_ptrArray2.GetAt(j))->CG_number3)); CPen *pOldPen=pDC->SelectObject(&pen); pDC->MoveTo(((CGraph*)m_ptrArray2.GetAt(j))->CG_ptOrigin); pDC->LineTo(((CGraph*)m_ptrArray2.GetAt(j+1))->CG_ptOrigin); } } Whether_repaint=TRUE; // TODO: add draw code for native data here }
引用
宿舍大老鼠 2013-03-11
  • 打赏
  • 举报
回复
void CMyView::OnDraw(CDC* pDC) { CMyDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); extern BOOL Whether_repaint; CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); pDC->SelectObject(pBrush); if(Whether_repaint==TRUE) { for(int i=0;i<m_ptrArray1.GetSize();i++)//几何图形的重绘 { CPen pen(((CGraph*)m_ptrArray1.GetAt(i))->CG_nLineStyle,((CGraph*)m_ptrArray1.GetAt(i))->CG_number4, RGB(((CGraph*)m_ptrArray1.GetAt(i))->CG_number1,((CGraph*)m_ptrArray1.GetAt(i))->CG_number2, ((CGraph*)m_ptrArray1.GetAt(i))->CG_number3)); CPen *pOldPen=pDC->SelectObject(&pen); switch(((CGraph*)m_ptrArray1.GetAt(i))->CG_nDrawType) { case 1: pDC->MoveTo(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin); pDC->LineTo(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin); break; case 2: pDC->MoveTo(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin); pDC->LineTo(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptEnd); break; case 3: pDC->Rectangle(CRect(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin,((CGraph*)m_ptrArray1.GetAt(i))->CG_ptEnd)); break; case 4: pDC->Ellipse(CRect(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin,((CGraph*)m_ptrArray1.GetAt(i))->CG_ptEnd)); break; } } for(int j=0;j<m_ptrArray2.GetSize()-1;j++)//连续线条的重绘 { CPen pen(((CGraph*)m_ptrArray2.GetAt(j))->CG_nLineStyle,((CGraph*)m_ptrArray2.GetAt(j))->CG_number4, RGB(((CGraph*)m_ptrArray2.GetAt(j))->CG_number1,((CGraph*)m_ptrArray2.GetAt(j))->CG_number2, ((CGraph*)m_ptrArray2.GetAt(j))->CG_number3)); CPen *pOldPen=pDC->SelectObject(&pen); pDC->MoveTo(((CGraph*)m_ptrArray2.GetAt(j))->CG_ptOrigin); pDC->LineTo(((CGraph*)m_ptrArray2.GetAt(j+1))->CG_ptOrigin); } } Whether_repaint=TRUE; // TODO: add draw code for native data here }
情歌王子 2012-11-21
  • 打赏
  • 举报
回复
不好意思我已经在百度找到原因了…………
buyong 2012-11-21
  • 打赏
  • 举报
回复
Whether_repaint定义成CView的变量,初始化成false
情歌王子 2012-11-20
  • 打赏
  • 举报
回复
void CMyView::OnDraw(CDC* pDC)
{
	CMyDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	extern BOOL Whether_repaint;

	CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
	pDC->SelectObject(pBrush);

	if(Whether_repaint==TRUE)
	{
	for(int i=0;i<m_ptrArray1.GetSize();i++)//几何图形的重绘
	{
		CPen pen(((CGraph*)m_ptrArray1.GetAt(i))->CG_nLineStyle,((CGraph*)m_ptrArray1.GetAt(i))->CG_number4,
		     RGB(((CGraph*)m_ptrArray1.GetAt(i))->CG_number1,((CGraph*)m_ptrArray1.GetAt(i))->CG_number2,
		      ((CGraph*)m_ptrArray1.GetAt(i))->CG_number3));
	    CPen *pOldPen=pDC->SelectObject(&pen);
		switch(((CGraph*)m_ptrArray1.GetAt(i))->CG_nDrawType)
		{
		case 1:
		    pDC->MoveTo(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin);
			pDC->LineTo(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin);
			break;
		case 2:
		    pDC->MoveTo(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin);
			pDC->LineTo(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptEnd);
			break;
		case 3:
		    pDC->Rectangle(CRect(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin,((CGraph*)m_ptrArray1.GetAt(i))->CG_ptEnd));
			break;
		case 4:
			pDC->Ellipse(CRect(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin,((CGraph*)m_ptrArray1.GetAt(i))->CG_ptEnd));
			break;
		}
	}

	for(int j=0;j<m_ptrArray2.GetSize()-1;j++)//连续线条的重绘
	{
		CPen pen(((CGraph*)m_ptrArray2.GetAt(j))->CG_nLineStyle,((CGraph*)m_ptrArray2.GetAt(j))->CG_number4,
		     RGB(((CGraph*)m_ptrArray2.GetAt(j))->CG_number1,((CGraph*)m_ptrArray2.GetAt(j))->CG_number2,
		         ((CGraph*)m_ptrArray2.GetAt(j))->CG_number3));
	    CPen *pOldPen=pDC->SelectObject(&pen);

		pDC->MoveTo(((CGraph*)m_ptrArray2.GetAt(j))->CG_ptOrigin);
		pDC->LineTo(((CGraph*)m_ptrArray2.GetAt(j+1))->CG_ptOrigin);
	}
	}

	Whether_repaint=TRUE;
	// TODO: add draw code for native data here
}
这个是刷白的响应函数:
void CMyView::OnRepaint() 
{
	extern BOOL Whether_repaint;
	Whether_repaint=FALSE;
	CMyView::OnPaint();
}
引用 6 楼 buyong 的回复:
引用 4 楼 Programe_Lover 的回复: 引用 1 楼 buyong 的回复:菜单关联一个bool变量 在OnDraw中根据变量状态,决定执行哪些函数 试了,没用,还是不行!!!! 那你把你的实验代码贴上
buyong 2012-11-20
  • 打赏
  • 举报
回复
引用 4 楼 Programe_Lover 的回复:
引用 1 楼 buyong 的回复:菜单关联一个bool变量 在OnDraw中根据变量状态,决定执行哪些函数 试了,没用,还是不行!!!!
那你把你的实验代码贴上
情歌王子 2012-11-20
  • 打赏
  • 举报
回复
引用 8 楼 buyong 的回复:
C/C++ code? 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 void CMyView::OnDraw(CDC* pDC) { CMyDoc* pDoc = GetDocument(); ASSERT_VALID(……
冒得用啊!!还是一样!
buyong 2012-11-20
  • 打赏
  • 举报
回复
void CMyView::OnDraw(CDC* pDC)
{
    CMyDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    extern BOOL Whether_repaint;
 
    CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
    pDC->SelectObject(pBrush);
 
    if(Whether_repaint==TRUE)
    {
    for(int i=0;i<m_ptrArray1.GetSize();i++)//几何图形的重绘
    {
        CPen pen(((CGraph*)m_ptrArray1.GetAt(i))->CG_nLineStyle,((CGraph*)m_ptrArray1.GetAt(i))->CG_number4,
             RGB(((CGraph*)m_ptrArray1.GetAt(i))->CG_number1,((CGraph*)m_ptrArray1.GetAt(i))->CG_number2,
              ((CGraph*)m_ptrArray1.GetAt(i))->CG_number3));
        CPen *pOldPen=pDC->SelectObject(&pen);
        switch(((CGraph*)m_ptrArray1.GetAt(i))->CG_nDrawType)
        {
        case 1:
            pDC->MoveTo(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin);
            pDC->LineTo(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin);
            break;
        case 2:
            pDC->MoveTo(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin);
            pDC->LineTo(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptEnd);
            break;
        case 3:
            pDC->Rectangle(CRect(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin,((CGraph*)m_ptrArray1.GetAt(i))->CG_ptEnd));
            break;
        case 4:
            pDC->Ellipse(CRect(((CGraph*)m_ptrArray1.GetAt(i))->CG_ptOrigin,((CGraph*)m_ptrArray1.GetAt(i))->CG_ptEnd));
            break;
        }
    }
 
    for(int j=0;j<m_ptrArray2.GetSize()-1;j++)//连续线条的重绘
    {
        CPen pen(((CGraph*)m_ptrArray2.GetAt(j))->CG_nLineStyle,((CGraph*)m_ptrArray2.GetAt(j))->CG_number4,
             RGB(((CGraph*)m_ptrArray2.GetAt(j))->CG_number1,((CGraph*)m_ptrArray2.GetAt(j))->CG_number2,
                 ((CGraph*)m_ptrArray2.GetAt(j))->CG_number3));
        CPen *pOldPen=pDC->SelectObject(&pen);
 
        pDC->MoveTo(((CGraph*)m_ptrArray2.GetAt(j))->CG_ptOrigin);
        pDC->LineTo(((CGraph*)m_ptrArray2.GetAt(j+1))->CG_ptOrigin);
    }
    }
 
    //Whether_repaint=TRUE;把这句删掉
    // TODO: add draw code for native data here
}
void CMyView::OnRepaint() 
{
    
    Whether_repaint=!Whether_repaint;
    
}
漫步者、 2012-11-19
  • 打赏
  • 举报
回复
引用 4 楼 Programe_Lover 的回复:
引用 1 楼 buyong 的回复:菜单关联一个bool变量 在OnDraw中根据变量状态,决定执行哪些函数 试了,没用,还是不行!!!!
你在CView中的Ondraw中画了么?
情歌王子 2012-11-19
  • 打赏
  • 举报
回复
引用 1 楼 buyong 的回复:
菜单关联一个bool变量 在OnDraw中根据变量状态,决定执行哪些函数
试了,没用,还是不行!!!!
漫步者、 2012-11-19
  • 打赏
  • 举报
回复
直接到CView窗口中去画图就可以了
wudaijun 2012-11-19
  • 打赏
  • 举报
回复
OnPaint()实际上会调用OnDraw() 可以用楼上的方法 比较灵活一点而且很容易实现 如果刷白就啥都不做
buyong 2012-11-19
  • 打赏
  • 举报
回复
菜单关联一个bool变量 在OnDraw中根据变量状态,决定执行哪些函数

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧