如何拉伸位图
使用CBitmap装载位图,然后创建内存DC,使用CDC的SelectObject把位图选入内存DC。在内存DC上绘图,绘图完成后,使用那个StretchBlt函数把内存DC上的位图复制到对话框的DC上。
这样在内存DC上绘的图会由于拉伸而变形,我的想法是,在位图被选入内存DC后,先拉伸位图到目标DC的大小,然后再绘图,这样复制到目标DC后,新绘的图形就不会变形。
不知道,CDC是否有直接拉伸自己内部位图尺寸的功能?
[解决办法]
还是StretchBlt!
你刚开始读入的时候,就StretchBlt!然后,再绘图,最后,bitblt就行了!
[解决办法]
#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);}