已创建好一个固定大小的显示平面,现在有一大小不定(可能比平面指定的大小大,也可能小)的图像数据,需要将此图像数据进行缩放,然后复制到平面中,以实现显示。请问该如何进行上述操作?如果我的描述不清,请指出,我将在线进行解答。

解决方案 »

  1.   

    利用CDC的这个函数是可以,不过建立两个平面,取得DC,再缩放。我试了一下,它的效率太低下了,慢得人受不了。我想,DDRAW应该有它的缩放函数吧,如果硬件支持的话,又何必要软件缩放呢?高手们说呢?
      

  2.   

    在后台缓冲区中载入一个位图文件
      一旦DirectDrawPalette对象被嵌入到DirectDrawSurface对象之中,DDEX2就将Back.bmp位图载入到后台缓冲区中。使用下例的程序代码可实现该过程:  // Load a bitmap into the back buffer.
      ddrval = DDReLoadBitmap(LpDDSBack, szBackground);
      if( ddrval != DD_Ok )
        // Load failed  DDReLoadBitmap是出现在Ddutil.cpp中的另一个函数。它从一个文件或资源中将一个位图文件载入到一个已经存在的DirectDraw表面之中。(就像在DDEX5中那样,你可以使用DDLoadBitmap创造一个表面并且将位图载入那个表面。对于DDEX2来说,DDReLoadBitmap把szBackground指向的Back.bmp载入到ipDDSBack指向的后台缓冲区,DDReLoadBitmap调用DDCopyBitmap函数,将文件复制到后台缓冲区中,并且将缓冲区扩展到适当的。DDCopyBitmap函数将位图复制到内存之中,然而利用GetObject函数得到位图的大小。DDCopyBitmap然后使用下列的代码得到后台缓冲区的大小(它可以放置位图):  //
      // get size of surface
      //
      ddsd.dwSize = sizeof(ddsd);
      ddsd.dwFlags = DDSD_HEIGHT DDSD_WIDTH;
      lpdds->GetSurfaceDesc(&ddsd);  ddsd是指向DDSRFACEDESC结构的一个指针。该结构存储了DirectDraw表面的当前描述。在这种情况下,我们需要注意的是:DDSURFACEDESC的成员描述这个表面的高度和宽度,分别表示为:DDSD_HEIGHT和DDSD_WIDTH。调用IDirectDrawSurface::GetSurfaceDesc方法,把适当的值来载入到这个结构。对于DDEX2来说,这些值将是:高480和宽640。DDCopyBitmap函数锁定表面并将位图文件复制到后台缓冲区,使用StretchBit函数延伸或压缩后台缓冲区到可适用的大小。表示如下:  if((hr = lpdds->GetDC(&hdc)) == DD_OK)
      {
        StretchBlt(hdc, 0,0,ddsd.dwWidth, ddsd.dwHeight, hdcImage,x, y, dx, dy, SRCCOPY);//StretchBlt就可以缩放
        lpdds->ReleaseDC(hdc);
      }
      

  3.   

    其实,最简单的就是:直接BLT函数就可以实现了,我真是笨到家了。不过,还是谢谢诸位。给分算了,反正分多了也没有什么用。