首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

怎么拉伸位图

2012-04-16 
如何拉伸位图使用CBitmap装载位图,然后创建内存DC,使用CDC的SelectObject把位图选入内存DC。在内存DC上绘图

如何拉伸位图
使用CBitmap装载位图,然后创建内存DC,使用CDC的SelectObject把位图选入内存DC。在内存DC上绘图,绘图完成后,使用那个StretchBlt函数把内存DC上的位图复制到对话框的DC上。

这样在内存DC上绘的图会由于拉伸而变形,我的想法是,在位图被选入内存DC后,先拉伸位图到目标DC的大小,然后再绘图,这样复制到目标DC后,新绘的图形就不会变形。

不知道,CDC是否有直接拉伸自己内部位图尺寸的功能?

[解决办法]
还是StretchBlt!
你刚开始读入的时候,就StretchBlt!然后,再绘图,最后,bitblt就行了!
[解决办法]

C/C++ code
#include"ENobject2D.h"#include "ENd3d.h"void ENobject2D::LHxxCREATE_2DTEXTURE(int tx,int ty,int tw,int th,        int numframe,int transverse,int curframe,char *rname,        char *dname,int x,int y        ){    int i=0,k=0;    //检测是否有这个名.    bool btexture=ENobject2DListOb.CheckNode(dname);    if(btexture==true)    {        MessageBox(this->ENobject::hWnd, "2D图对象名相同,加载失败", "error texture name", MB_OK);        return;    }    ENobject2DListOb.PushBegin(dname,0);//pass    TList=ENobject2DListOb.GetNode(dname);    TList->ObjectData=new LHxx2DIMAGE;    LHxx2DIMAGE *ob=TList->ObjectData;    TList->ObjectData->LHxx2DTexAT=(LHxxTEXAT*)malloc(sizeof(LHxxTEXAT)*numframe);    memset(TList->ObjectData->LHxx2DTexAT,0x00,sizeof(TList->ObjectData->LHxx2DTexAT));        //大图    ENListData<TextureBuffer,void,void> *Tlist_source=        ENresource::ENresourceListOb.GetNode(rname);    //源图大小    int width_source=Tlist_source->ObjectData->BMPdata.biWidth;    int height_source=Tlist_source->ObjectData->BMPdata.biHeight;    //将源大图RGB值,分配给临时指针    UCHAR *bmpdata_source=Tlist_source->ObjectData->bmpdata;            //dest    int width_dest=tw;//每一帖的大小    int height_dest=th;        //transverse:有几列    //有几行    int lenghtways=numframe/transverse;    for(k=0;k<numframe;k++)    {        int offx=tx+k%transverse*tw;        int offy=ty+k/transverse*th;//计出y偏移        //alpha分配空间        TList->ObjectData->LHxx2DTexAT[k].LHxxAlphaData=            (UCHAR*)malloc(sizeof(UCHAR)*width_dest*height_dest);        //创建页面        unsigned char *pch=CreateTextueBuffer(bmpdata_source,width_source,        height_source,TList->ObjectData->LHxx2DTexAT[k].LHxxATTexture,        TList->ObjectData->LHxx2DTexAT[k].LHxxAlphaData,width_dest,height_dest,        offx,offy);        //包含分配空间        //将bmpdata copy to TList->ObjectData->LHxx2DTexAT[k].bmpdata,所以不能free bmpdata        memcpy(&TList->ObjectData->LHxx2DTexAT[k].bmpdata,&pch,sizeof(pch));//内存COPY    }    LHxx2DSCREENVERTEX g_Vertices[] =    {        { 0.0f,   0.0f,   0.5f, 1.0f,    0.0f, 0.0f},  //红色         { 300.0f,  0.0f,   0.5f, 1.0f,  1.0f, 0.0f},//蓝色            { 0.0f ,  400.0f,  0.5f, 1.0f,    0.0f, 1.0f},//绿色            { 300.0f,  400.0f,  0.5f, 1.0f,  1.0f,1.0f }//白色    };//0xffff0000//红色0xff00ff00//蓝色    0xff00ffff//绿色0xffffffff//白色          //给存放矩阵点分配空间    ob->LHxx2DVertex=(LHxx2DSCREENVERTEX*)malloc(4*sizeof(LHxx2DSCREENVERTEX ));    memset(ob->LHxx2DVertex,0,4*sizeof(LHxx2DSCREENVERTEX ));    // Create the vertex buffer.     if( FAILED(this->ENobject::m_pd3dDevice->CreateVertexBuffer( 4*sizeof(LHxx2DSCREENVERTEX),                                         0, LHxx2DSCREENVERTEXFVF,                                         D3DPOOL_DEFAULT, &ob->LHxx2DMVertexBuffer,NULL ) ) )    {         MessageBox(this->ENobject::hWnd, "CREATE_2DIMAGE vbuf", "error tex", MB_OK);        return;    }    // Now we fill the vertex buffer. To do this, we need to Lock() the VB to    // gain access to the vertices. This mechanism is required becuase vertex    // buffers may be in device memory.    LHxx2DSCREENVERTEX* pVertices;    if( FAILED( ob->LHxx2DMVertexBuffer->Lock( 0, sizeof(g_Vertices),         (void**)&pVertices, 0 ) ) )    {        return;    }    memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );    for( i=0; i<4; i++ )    {        ob->LHxx2DVertex[i]=((LHxx2DSCREENVERTEX *)pVertices)[i];    }    ob->LHxx2DMVertexBuffer->Unlock();    strcpy(ob->LHxxName,dname);    ob->LHxxPicW=width_dest*transverse;    ob->LHxxPicH=numframe/transverse*height_dest;                // 图资源的宽高    ob->LHxxIw=width_dest;    ob->LHxxIh=height_dest;                    // 显示的宽与高度    ob->LHxxIx=x;    ob->LHxxIy=y;                    // 显示的位置    ob->LHxxVisible=1;                      // 是否显示    ob->LHxx2DATMaxFrame=numframe;                 // 纹理动画总贴数    ob->LHxx2DATCurFrame=curframe;                  // 当前纹理动画贴数    ob->LHxx2DATMode=0;                      // 动画的播放模式 0loop 1end visible=0 2end visible=1 f=max 3end visible=1 f=0    ob->LHxx2DATEnd=0;                      //最后一帖    ob->LHxx2DATDelta=1;                    // 时间计数    ob->LHxx2DATFrameSpeed=0.3;               // 纹理动画播放的速度    ob->LHxxScaleX=1;    ob->LHxxScaleY=1;    ob->LHxxAngle=0;    ob->LHxxRw=width_dest;    ob->LHxxRh=height_dest;                    // 显示的宽与高度(初始)    ob->LHxxRx=x;    ob->LHxxRy=y;                    // 显示的位置(初始)    ob->LHxxMirrorXOff=1;//是否镜像    ob->LHxxMirrorYOff=1;//是否镜像    ob->Texture2DAddress=0;//纹理寻址    ob->Texture2DAddressColor=D3DXCOLOR(255,0,0,255);//边框纹理寻址颜色    ob->Texture2DSample=2;//2D纹理采样    ob->Texture2DTransverse=transverse;//纹理横向帖数    ob->SourceOffX=tx;//在大图缓冲区的偏移位置    ob->SourceOffY=ty;//在大图缓冲区的偏移位置    ob->LHxx2DMatrixOb=new ENmatrix(hWnd,m_pd3dDevice); //每一个对象的视区及自身的矩阵    LHxxMOVE_2DIMAGE(dname,ob->LHxxIx,ob->LHxxIy,ob->LHxxMirrorXOff,ob->LHxxMirrorYOff); }void ENobject2D::LHxxFRAME_2DIMAGE(float delta,char *Tname){    TList=ENobject2DListOb.GetNode(Tname);    LHxx2DIMAGE *ob=TList->ObjectData;    if(ob->LHxxVisible<=0){return;}            float time=TENd3dOb->ENtimeOb->getSecond();    //每帖更新    LHxxFrameUp_2DIMAGE(Tname,time);} 

热点排行