“实际上,在OnDraw(CDC *pDC)中绘制的图并不是所有都显示了的,例如:你
在OnDraw中画了两个矩形,在一次重绘中虽然两个矩形的绘制函数都有执行,但是很有可能只有一个显示了,这是因为MFC本身为了提高重绘的效率设置了裁剪区。”
 我在网上看到这样一段话,我现在也正遇到这个问题,就是画两个以上的矩形再改变窗口大小后只会显示最后一个矩形。请问该如何解决这种问题?

解决方案 »

  1.   

    重载OnSize函数
    在函数内调用Invalidate函数
      

  2.   

    这里有一个MSChart控件使用的例子
    http://www.vckbase.com/document/viewdoc/?id=9591 在 CDemoView::OnCreate 中创建CMSChart// CDemoView::OnCreate()
    CRect rc;
    GetClientRect(&rc);
    if(!m_Chart.Create("mschart", WS_CHILD| WS_VISIBLE, rc, this, 10))
    return -1;2 在 CDemoView::OnSize 中调整 m_Chart 的大小,使之能随窗口大小变化而变化// CDemoView::OnSize
    if( m_Chart.GetSafeHwnd() )
    m_Chart.MoveWindow( 0, 0, cx, cy ); 3 设置 m_Chartvoid CDemoView::InitChart() //在这里初始化MSChart
    {}     4 设置数据void CDemoView::DrawChart()  //在这个函数内画图,加载你的数据,画图
    {}5 改变显示类型// 折线图
    void CDemoView::OnChartLine() 
    {
    m_Chart.SetChartType(3); 
    DrawChart();
    }// 柱状图 
    void CDemoView::OnChartCombi() 
    {
    m_Chart.SetChartType(1); 
    DrawChart();
    }
    // 饼状图
    void CDemoView::OnChartPie() 
    {
    m_Chart.SetChartType(14); 
    DrawChart();
    }
      

  3.   

    代码整理如下://GraphRecord.h
    //矩形
    #define RECTANGLE 4
    struct RECTANGLENODE
    {
    BYTE bType;  ////绘图单元的类型
    //该记录的状态:bDo>0 显示;bDo<=0 不显示
    //0-不显示,1-显示,2-被选择,3-粘贴,5-移动,6-剪切,7-移动被恢复
    int bDo;
    int Index;  //图元索引
    PENTYPE pen;   //绘制矩形所用的画笔类型
    POINT Start,End;  //矩形左上角和右下角坐标
    RECTANGLENODE()   //矩形图元的初始化函数
    {
    bType=RECTANGLE;
    bDo=1;
    }
    };CPainterView.cpp中相关函数
    //初始化函数
    CPainterView::CPainterView()
    {
    // TODO: add construction code here
      DrawStep=0;               //绘图步骤的记录
      DrawType=new BYTE;        //绘图类型,初始化为选择
      *DrawType=SELECT;
      OppIndex=0;
      bShiftDown=FALSE;
      lineType=0;             //线条类型(值由组合框选择)
      lineWidth=1;             //线条宽度(值由组合框选择)
      lineColor=RGB(0,0,0);    //线条颜色(值由组合框选择)
      
    }
    //响应画矩形的工具栏按钮的函数
    void CPainterView::OnDrawRectangle()
    {
        DrawType=new BYTE;
    *DrawType=RECTANGLE;
    }void CPainterView::OnLButtonDown(UINT nFlags, CPoint point) 
    {
     switch (*DrawType)
    {
                    case RECTANGLE:
     if(!DrawStep)
     {
    rectanglenode=new RECTANGLENODE;  //rectanglenode为头文件中申明的变量
            rectanglenode->Start=point;
            DrawStep=1;
     }
     break;
    }void CPainterView::OnMouseMove(UINT nFlags, CPoint point) 
    {
    CDC *dc=GetDC();
    OldPen=dc->SelectObject(&pen);
    int iR;
    if(DrawStep==0)
     return;
    switch(*DrawType)
    {
    case RECTANGLE:
    iR=dc->SetROP2(R2_NOTXORPEN);     //设置绘图模式
    dc->Rectangle(rectanglenode->Start.x,rectanglenode->Start.y,PrePoint.x,PrePoint.y);
    dc->Rectangle(rectanglenode->Start.x,rectanglenode->Start.y,point.x,point.y);
    PrePoint=point;
    dc->SetROP2(iR);
    break;
    }void CPainterView::OnLButtonUp(UINT nFlags, CPoint point) 
    {
    CPainterDoc *pDoc=GetDocument();
    switch(*DrawType)
    {
    case RECTANGLE:
    DrawStep=0;
    rectanglenode->End=rectanglenode->End2=point;
    rectanglenode->bDo=1;
    OppIndex+=1;
    rectanglenode->Index=OppIndex;
    rectanglenode->pen.Color=lineColor;
    rectanglenode->pen.iStyle=lineType;
    rectanglenode->pen.iWidth=lineWidth;
    pDoc->RecordList.AddTail(DrawType);       //RecordList为保存数据的链表
    pDoc->RecordList.AddTail(rectanglenode);
    break;
    }void CPainterView::OnDraw(CDC* pDC)
    {
    CPainterDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
     CRect rect;
    GetClientRect(rect);
     HPEN hOldPen,hPen;
    POSITION pos=pDoc->RecordList.GetHeadPosition();
    while(pos)
    {
    BYTE * drawtype;
    drawtype=(BYTE *)pDoc->RecordList.GetNext(pos);
    switch(*drawtype)
    {
    case RECTANGLE:
        RECTANGLENODE * rectangle;
    rectangle=(RECTANGLENODE*)pDoc->RecordList.GetNext(pos);
    if(rectangle->bDo>0)
    {
                  if(rectangle->bDo!=2)
    hPen=CreatePen(rectangle->pen.iStyle,rectangle->pen.iWidth,rectangle->pen.Color);
                 else   
         hPen=CreatePen(PS_DASHDOT,1,RGB(255,0,0));  //矩形被选中时所用画笔      
                hOldPen=(HPEN)SelectObject(pDC->m_hDC,hPen);
    pDC->Rectangle(rectanglenode->Start.x,rectanglenode->Start.y,rectanglenode->End.x,rectanglenode->End.y);  
     DeleteObject(SelectObject(pDC->m_hDC,hOldPen));
    }
    break;
    }不知道哪错了所以把有关代码全贴出来了。
    请大家帮我找找原因
      

  4.   

         自己折腾了几天,终于找到错处了。是我粗心,把应该用rectangle变量的几处地方用成了rectanglenode,导致取出的矩形坐标不是链表里的,而是最后一个矩形的坐标。唉,这个错误太隐蔽了,从8月1号到今天8月6号,这五天我一有时间就调试程序找原因。功夫不负苦心人,终于在今天被我无意中发现了。发现问题时我头脑一热,真如五雷轰顶啊,错误太低级了,真是我编程生涯的一大耻辱。我要好好反思,记住这个教训。
         小生不才,让楼上的大家费心了,真是不好意思。