我要打开一张图片,然后图片的各个像素用网格格点显示:
我自定义了一个类去描述网格格点(格点的左上角坐标,宽度以及颜色),这个类中的Draw函数去画这个格点,然后我用一个列表容器去储存指向这个类的对象的指针,然后按钮消息(打开)中,用这个类实现这些消息的功能,每画一个格点我就用一个函数AddGrid把这个类的对象储存到列表容器中,然后在视图的OnDraw中取出这些对象,然后用这些对象的Draw函数实现图片网格格点的显示。
遇到的问题:
假如我的视图的高是300,当我的格点区域的高是400,那么一打开图片,视图区域显示的就是图片上部分的(300),当我滚动条滚动到下面去看剩下的100的时候,视图区域显示了下面的100以及200的背景,当我把滚动条滚到原始位置时,视图区域显示的是最上面的100以及200的背景,就好像滚动条在下面的时候显示的图片是下面的300,滚到上面的时候就显示了最上面的100,原本显示的被擦掉了,和从上面滚到下面情况一样。
疑问:
要怎么解决这个问题?是哪里出了问题,是因为没重写滚动条事件,还是其他?

解决方案 »

  1.   

    网格数据中的左上角点的坐标我都是以视图左上角为参照的,比如我提取像素的图片的width是50,height是60,我直接是
    for(int i=0;i<50;i++)
    for(int j=0;j<60;j++)

    xxx.color=rgb();
    xxx.point.x=i*网格宽度;
    xxx.point.y=j*网格宽度;
    xxx.Draw(pDC);

    这样有什么问题吗?
      

  2.   

    如果是scrollview的话,添加一下:
    CPoint pt1 = GetScrollPosition( );
    for(int i=0;i<50;i++)
    for(int j=0;j<60;j++)

    xxx.color=rgb();
    xxx.point.x=i*网格宽度;
    xxx.point.y=j*网格宽度;
    xxx.point += pt1;
    xxx.Draw(pDC);
      

  3.   

    我在OnDraw里把取出来的对象的坐标按上面的做法做了以后,问题依然存在,而且如果我滚下又滚上再滚下,到后来整个图都不见了!是不是我存储得不对啊?
      

  4.   

    xxx.Draw(pDC);
    建议用内存DC,最后,只要贴图即可!包括网格,都是在内存中画即可!
    你滚动的时候,刚开始还能正常显示,后面就不行了,是不是这样?
      

  5.   

    我用内存DC的话,在OnDraw里创建个兼容的DC,再创建个兼容的位图,然后把位图选入,然后把储存的对象
    xxx.Draw(&memDC);再pDC->Bitblt()在这里,这个要选入的位图的长宽不好确定啊,因为在OnDraw里你还不知道你要展示的区域是哪一块!
      

  6.   

    内存里面的bitmap,不要每次ondraw的时候都重新画,你只要在数据改变的时候画,每次画内存数据,必须全部画;
    ondraw所做的事,就是贴出来!根据具体的情况,从内存DC里面贴对应的位置即可!
      

  7.   

    你的意思再搞个容器储存这个位图,然后在OnDraw里直接用这个位图去画,是这样吗?
      

  8.   

    那把位图选入memDC后用pDC->BitBlt(0,0,nWidth,nHeight,&memDC,0,0,SRCCOPY);去画,
    这个nWidth,nHeight要怎么去得到,比如我容器中存的是CBitmap的对象的指针pBitmap,
    我用pBitmap->Attach去关联了BITMAP BMP,再用BMP.bmWidth,BMP.bmHeight去得到这2个值确是失败了