小菜鸟在开发中遇到了好多困难~
希望各位高手能指导一下,谢谢!打开一张图片,将它显示出来,其中有放大和缩小操作。
原来每次OnDraw时,都用CDC::StretchBlt函数操作,但是滚动的时候屏幕闪的很厉害。
所以就想把各种尺寸的图片放到几个memDC中存储,每次显示的时候直接pDC->BilBlt就可以了。
但是这里却遇到了困难。怎么都显示不出来希望各位高手帮忙啊!!!
还有就是关于屏幕绘图,到底什么时候显示,怎么刷新才最合理啊!!
下面是一些代码,我觉得主要问题是不是在storeDCOne那个地方啊?
void CMapView::SetStretchMap(CDC *pDC, CGPSDoc *pDoc)
{
    if(!pDoc->IsHaveMap())
    return;
    CBitmap* pBitmap=pDoc->GetBitmap();
    if(pBitmap!=NULL)
    {
     int nWidth, nHeight;
     CPalette* pOldPalette;
CPalette* pPalette=pDoc->GetPalette();
if(pPalette!=NULL)
{
pOldPalette=pDC->SelectPalette(pPalette,FALSE);
pDC->RealizePalette();
}
BITMAP bm;
pBitmap->GetBitmap(&bm);
if(storeDC.CreateCompatibleDC(pDC))
storeDC.SelectObject(pBitmap);

nWidth = bm.bmWidth/2;
nHeight = bm.bmHeight/2;
if(storeDCOne.CreateCompatibleDC(pDC)) //storeDCOne存储另一个尺寸的图片 
{
if(storeBitmapOne.CreateCompatibleBitmap(pDC, nWidth, nHeight))
{
storeDCOne.SelectObject(&storeBitmapOne);
storeDCOne.SetStretchBltMode(COLORONCOLOR);
storeDCOne.StretchBlt(0, 0,  nWidth, nHeight,  &storeDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
}
}
int left = 0;
int top = 0;
SetMapPosition(bm.bmWidth, bm.bmHeight, left, top); 
pDC->BitBlt(left,top,bm.bmWidth,bm.bmHeight,&storeDC,0,0,SRCCOPY);
SetScrollSizes(MM_TEXT, CSize(bm.bmWidth,bm.bmHeight));
if(pPalette!=NULL)
pDC->SelectPalette(pOldPalette,FALSE);
     }
}

解决方案 »

  1.   

    谢谢哦,小弟在等哦~~还有一个现象哦~
    storeBitmapOne.CreateCompatibleBitmap(pDC, nWidth, nHeight))
    我把nWidth 和nHeight设置成数字
    但是就是不能大过1400 和2001,哎怎么弄的啊?
      

  2.   

    你的storeDc里面有东西吗?我看没有
      

  3.   

    我在文档类中打开了图片,pDoc->GetBitmap();返回CBitmap指针,
    storeDC里面有东西,我可以显示出来~
    关键是这个sotreDCOne控制不了
      

  4.   

    6颗星星你在帮我看看吧~好吗?
    我在onDraw中是这样显示的
    switch(m_nScaleLevel)
    {
        case 0://这个是原形,可以正常显示
    width = pDoc->GetWidth();
    height = pDoc->GetHeight();
    SetMapPosition(width, height, left, top);
    pDC->BitBlt(left, top, width, height, &storeDC, 0, 0, SRCCOPY);
    break;
        case 1://这个缩小后的就不可以了?
    if(storeBitmapOne.GetSafeHandle())
    {
        storeBitmapOne.GetBitmap(&bm);
        storeDCOne.SelectObject(&storeBitmapOne);
        SetMapPosition(bm.bmWidth,bm.bmHeight, left, top);
        pDC->BitBlt(left, top, bm.bmWidth, bm.bmHeight, &storeDCOne, 0, 0, SRCCOPY);
    }
    break;
     }
      

  5.   

    这是我的程序里面的一部分,在CMyView:OnDrow里面,绝对好使,DmLogicalWin是一个全局变量(RECT),存放逻辑窗口,dmWcToSc是自定义的函数,从自定义的坐标系转化到逻辑坐标系
    CDC MemDC;
    CBitmap MemBitmap;

    MemDC.CreateCompatibleDC(NULL);

    POINT pt1, pt2;
    pt1 = dmWcToSc(DmLogicalWin.xmin, DmLogicalWin.ymax, 0.0);
    pt2 = dmWcToSc(DmLogicalWin.xmax, DmLogicalWin.ymin, 0.0); //在MemDC里面绘图 pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);

    MemBitmap.DeleteObject();
    MemDC.DeleteDC();
      

  6.   

    BITMAP bm;
    把这个变量改成类的成员试试
      

  7.   

    大橘子,写的什么意思啊?
    memDC中有东西吗?
      

  8.   

    memDC就是自己创建的一个内存DC嘛,这个是解决闪烁问题的,也就是每次画的时候先把所有的内容全画到memDC上面,再从memDC一次性用bitblt搞的真正的DC上,解决闪烁都是这个套路,其他的问题俺就不懂喽。
      

  9.   

    哈哈谢谢六颗星哦~~
    我把BITMAP 改为类成员就好了~
    可能就是这个变量的问题哦!
    谢谢了啊!呵呵真好~
    大橘子,我明白的哦~
    谢谢指教!