我在formview上用picture控件竖排显示多个图片,每个图片的高度在600像素左右,当显示少量图片的时候没有问题。但是当图片数量大于50个的时候,前40几个图片显示正常,但是后面的图片全显示在一个位置,
while (i<m_CountPage) {
  pic[i]->GetClientRect(&pRc);
  pic[i]->MoveWindow(left,top,pRc.Width(),pRc.Height());
  i++;
  top+=pRc.Height()+30;
}试过用movewindow来调整formview的大小,但是没有用。请高手帮帮忙。
或有别的办法来实现请告知,不胜感激。分不够可再追加。

解决方案 »

  1.   

    你是在每个控件上显示一个图片?
    这些代码看不出什么问题。
    1.检查一下所有的控件都显示了不,且要显示的控件窗口RECT不能为0
    2.检查一下每个picture控件都SetBitmap了不?
      

  2.   

    btw,为什么要在formview上使用这么多控件?如果仅仅是显示图片的话,效率太低了些。
      

  3.   

    是每个控件一个图片。
    1.都显示出来了,只是后边的控件全堆到一起了,最后一个把前边的都覆盖了。
    2.已set。
      

  4.   

    你的formview都创建了多少Static控件了?
    将没有Set图片的Static都隐藏了。
    pic[i]->ShowWindow(SW_HIDE);
      

  5.   


    Static控件是根据图片数量动态创建的。这问题已经折磨我几天了,,,闹心。
      

  6.   

    使用自绘啊,将所有的图片都在一个View显示。
    另外可以使用双缓冲技术,创建一个内存DC,计算好每一个Bitmap的显示位置。将所有的Bitmap都绘制在内存DC上。
    然后将在OnPaint中,使用BitBlt绘制内存DC的图片。计算好你要显示的区域,然后将内存DC该区域的图片绘制在你的View中。
    这样还可以实现缩放,滚动等更多高级功能。
      

  7.   

    使用双缓冲技术,BitBlt绘制内存DC的图片
      

  8.   


    能给一段示例代码吗,我对BitBlt不太明白
      

  9.   

    自己google一下吧,网上大把的是
      

  10.   

    我在网上找了下,都是一个图片的啊,我的是N个图片,怎么才能将多个图片写到一个内存DC里啊。
      

  11.   

    1.在你的内存DC中设置一个较大的画布
    2.可以使用GDI+的Image::DrawImage函数,在你的画布上绘制你的各个图片
    3.将制定的画布区域绘制在你的窗口上。和你在网上找的代码的区别是在于第一、第二点。
    估计你找的代码内存DC画布的大小和你要绘制的图片大小一样大。
      

  12.   

    //初始化一个内存DC和一个画布
    CDC * pDC = this->GetDC();
    m_memDC.CreateCompatibleDC(NULL);
    VERIFY(m_memBitmap.CreateCompatibleBitmap(pDC,1200,1000));//可以将画布设置的大一些
    ReleaseDC(pDC);LRESULT CXXView::DrawInMemDC()
    {
    //将画布选入内存DC中
    CBitmap* pOldBitmap = m_memDC.SelectObject(&m_memBitmap);
    m_memDC.FillSolidRect(0,0,1200,1000,RGB(0,0,0)); //设置画布背景颜色 Graphics graph(m_memDC.GetSafeHdc());
         
            for(int i=0; i<numPic;i++)
    {
    //在这里绘制你的图片
    graph.DrawImage
    }
      
    m_memDC.SelectObject(pOldBitmap); return 0;
    }void CXXView::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting

    CRect rc;
    GetClientRect(&rc);
            //通过设置
    dc.StretchBlt(rc.TopLeft().x,rc.TopLeft().y,rc.Width(),rc.Height(),&m_memDC,
    0/*画布的x-coordinate,*/,0/*画布的y-coordinate,*/,1000/*要绘制的宽度*/,1000//*要绘制的高度*/,SRCCOPY);
    }
      

  13.   

    代码也就和上面差不多,你慢慢研究吧
    1.DrawInMemDC函数是将所有的图片绘制的内存DC的画布上。
    2.OnPaint函数将画布的指的区域绘制的窗口上。
      

  14.   


    非常感谢您的帮助。弄出来了。PS:如何才能放大或缩小图片呢。
    PS:图片我是居中显示的,当图片缩小后,如果客户区的宽度能放下多张图片时,就让图片先并排后竖排显示,用picture控件的话我知道用movewindow就可以,用内存DC该怎么弄呢?
    多谢。PS:6点结贴给分。
      

  15.   

     PS:如何才能放大或缩小图片呢。
         定义两个变量一个窗口RECT,一个要显示的内存DC的CRect。
        窗口RECT是不会变的,只需改变要显示的内存DC的CRect。还是使用StretchBlt函数。前2至5参数是RECT,后第7至10参数是CRect。PS:图片我是居中显示的,当图片缩小后,如果客户区的宽度能放下多张图片时,就让图片先并排后竖排显示,用picture控件的话我知道用movewindow就可以,用内存DC该怎么弄呢?
    需要重新按需求绘制内存DC了。计算横排图像的个数,并在内存中重新排放你的图片。然后还是使用StretchBlt更新窗口的显示。
      

  16.   

    非常感谢tttyd(雪影)同学的帮助,让我问题解决了。
    结贴!!!