我在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的大小,但是没有用。请高手帮帮忙。
或有别的办法来实现请告知,不胜感激。分不够可再追加。
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.检查一下所有的控件都显示了不,且要显示的控件窗口RECT不能为0
2.检查一下每个picture控件都SetBitmap了不?
1.都显示出来了,只是后边的控件全堆到一起了,最后一个把前边的都覆盖了。
2.已set。
将没有Set图片的Static都隐藏了。
pic[i]->ShowWindow(SW_HIDE);
Static控件是根据图片数量动态创建的。这问题已经折磨我几天了,,,闹心。
另外可以使用双缓冲技术,创建一个内存DC,计算好每一个Bitmap的显示位置。将所有的Bitmap都绘制在内存DC上。
然后将在OnPaint中,使用BitBlt绘制内存DC的图片。计算好你要显示的区域,然后将内存DC该区域的图片绘制在你的View中。
这样还可以实现缩放,滚动等更多高级功能。
能给一段示例代码吗,我对BitBlt不太明白
2.可以使用GDI+的Image::DrawImage函数,在你的画布上绘制你的各个图片
3.将制定的画布区域绘制在你的窗口上。和你在网上找的代码的区别是在于第一、第二点。
估计你找的代码内存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);
}
1.DrawInMemDC函数是将所有的图片绘制的内存DC的画布上。
2.OnPaint函数将画布的指的区域绘制的窗口上。
非常感谢您的帮助。弄出来了。PS:如何才能放大或缩小图片呢。
PS:图片我是居中显示的,当图片缩小后,如果客户区的宽度能放下多张图片时,就让图片先并排后竖排显示,用picture控件的话我知道用movewindow就可以,用内存DC该怎么弄呢?
多谢。PS:6点结贴给分。
定义两个变量一个窗口RECT,一个要显示的内存DC的CRect。
窗口RECT是不会变的,只需改变要显示的内存DC的CRect。还是使用StretchBlt函数。前2至5参数是RECT,后第7至10参数是CRect。PS:图片我是居中显示的,当图片缩小后,如果客户区的宽度能放下多张图片时,就让图片先并排后竖排显示,用picture控件的话我知道用movewindow就可以,用内存DC该怎么弄呢?
需要重新按需求绘制内存DC了。计算横排图像的个数,并在内存中重新排放你的图片。然后还是使用StretchBlt更新窗口的显示。
结贴!!!