如何拉伸位图

glacierful 2009-12-14 03:55:28
使用CBitmap装载位图,然后创建内存DC,使用CDC的SelectObject把位图选入内存DC。在内存DC上绘图,绘图完成后,使用那个StretchBlt函数把内存DC上的位图复制到对话框的DC上。

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

不知道,CDC是否有直接拉伸自己内部位图尺寸的功能?
...全文
453 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnnbwhq 2012-04-11
  • 打赏
  • 举报
回复
见 http://bbs.2ccc.com/topic.asp?topicid=401225
cnnbwhq 2012-04-11
  • 打赏
  • 举报
回复
fandh 2009-12-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 glacierful 的回复:]
引用 1 楼 fandh 的回复:
还是StretchBlt!
你刚开始读入的时候,就StretchBlt!然后,再绘图,最后,bitblt就行了!


CDC 装载位图的时候是用selectObject,还有别的装载的时候就拉伸的方式吗?
[/Quote]
没有了吧!我不记得有其它的方式!
你创建一个内存DC做这件事!在拉伸后,再画出来,最后再做你要做的事!
glacierful 2009-12-15
  • 打赏
  • 举报
回复
还是使用了一个临时的内存DC,拉伸完后,再在上面绘图。
原来主要是不想使用太多内存DC,担心影响性能。先就这么解决了。
LPR_Pro 2009-12-14
  • 打赏
  • 举报
回复
学习
  • 打赏
  • 举报
回复
怎么做都要拉伸啊
MoXiaoRab 2009-12-14
  • 打赏
  • 举报
回复
LS这代码贴的。。。
leechrockgames 2009-12-14
  • 打赏
  • 举报
回复

#include"ENobject2D.h"



//2D图rotate/move/scale
//旋转以及对缩放有修正作用
void ENobject2D::LHxxROTATE_2DIMAGE(char *Tname,float angle,int mirrorX,int mirrorY)
{
int i=0;

TList=ENobject2DListOb.GetNode(Tname);
LHxx2DIMAGE *sc=TList->ObjectData;


if(angle>=PI*2)
{
angle=0;
}
sc->LHxxAngle=angle;

float dx,dy,dw,dh;//临时变量
float sw = sc->LHxxIw;//image width
float sh = sc->LHxxIh;//image height

float sclx,scly,sclw,sclh;//复位并放缩的坐标(局部坐标系--image的坐标系)

float hotx =sw/2;//旋转中心
float hoty =sh/2;
//复位 放缩 , 旋转 ,平移

float xscale=sc->LHxxScaleX;
float yscale=sc->LHxxScaleY;

//放缩后的区域
sclx = -hotx;
scly = -hoty;

//原始旋转中心
sclw = (sw - hotx);
sclh = (sh - hoty);

float sint, cost;
sint = sinf(sc->LHxxAngle);
cost = cosf(sc->LHxxAngle);


float TestAngleXDa[4];
float TestAngleYDa[4];

memcpy(TestAngleXDa,sc->LHxxAngleXDa,sizeof(sc->LHxxAngleXDa));
memcpy(TestAngleYDa,sc->LHxxAngleYDa,sizeof(sc->LHxxAngleYDa));

if(mirrorX==1)
{
LHxx2DSCREENVERTEX* ss;
sc->LHxx2DMVertexBuffer->Lock( 0, 0, (void**)&ss, 0 );
//求得4点旋转量 (减去放大值)
TestAngleXDa[0] = sclx*cost - scly*sint -sclx;
TestAngleYDa[0] = sclx*sint + scly*cost -scly;

TestAngleXDa[1] = sclw*cost - scly*sint -sclw;
TestAngleYDa[1] = sclw*sint + scly*cost -scly;

TestAngleXDa[2] = sclx*cost - sclh*sint -sclx;
TestAngleYDa[2] = sclx*sint + sclh*cost -sclh;

TestAngleXDa[3] = sclw*cost - sclh*sint -sclw;
TestAngleYDa[3] = sclw*sint + sclh*cost -sclh;

sc->LHxx2DMVertexBuffer->Unlock();
}
else if(mirrorX==2 )
{
LHxx2DSCREENVERTEX* ss;
sc->LHxx2DMVertexBuffer->Lock( 0, 0, (void**)&ss, 0 );
//求得4点旋转量 (减去放大值)
TestAngleXDa[1] = sclx*cost - scly*sint -sclx;
TestAngleYDa[1] = sclx*sint + scly*cost -scly;

TestAngleXDa[0] = sclw*cost - scly*sint -sclw;
TestAngleYDa[0] = sclw*sint + scly*cost -scly;

TestAngleXDa[3] = sclx*cost - sclh*sint -sclx;
TestAngleYDa[3] = sclx*sint + sclh*cost -sclh;

TestAngleXDa[2] = sclw*cost - sclh*sint -sclw;
TestAngleYDa[2] = sclw*sint + sclh*cost -sclh;

sc->LHxx2DMVertexBuffer->Unlock();
}

if(mirrorX==1 && mirrorY==2)
{
LHxx2DSCREENVERTEX* ss;
sc->LHxx2DMVertexBuffer->Lock( 0, 0, (void**)&ss, 0 );
//求得4点旋转量 (减去放大值)
TestAngleXDa[2] = sclx*cost - scly*sint -sclx;
TestAngleYDa[2] = sclx*sint + scly*cost -scly;

TestAngleXDa[3] = sclw*cost - scly*sint -sclw;
TestAngleYDa[3] = sclw*sint + scly*cost -scly;

TestAngleXDa[0] = sclx*cost - sclh*sint -sclx;
TestAngleYDa[0] = sclx*sint + sclh*cost -sclh;

TestAngleXDa[1] = sclw*cost - sclh*sint -sclw;
TestAngleYDa[1] = sclw*sint + sclh*cost -sclh;


sc->LHxx2DMVertexBuffer->Unlock();
}
else if(mirrorX==2 && mirrorY==2)
{
LHxx2DSCREENVERTEX* ss;
sc->LHxx2DMVertexBuffer->Lock( 0, 0, (void**)&ss, 0 );
//求得4点旋转量 (减去放大值)
TestAngleXDa[3] = sclx*cost - scly*sint -sclx;
TestAngleYDa[3] = sclx*sint + scly*cost -scly;

TestAngleXDa[2] = sclw*cost - scly*sint -sclw;
TestAngleYDa[2] = sclw*sint + scly*cost -scly;

TestAngleXDa[1] = sclx*cost - sclh*sint -sclx;
TestAngleYDa[1] = sclx*sint + sclh*cost -sclh;

TestAngleXDa[0] = sclw*cost - sclh*sint -sclw;
TestAngleYDa[0] = sclw*sint + sclh*cost -sclh;

sc->LHxx2DMVertexBuffer->Unlock();
}

memcpy(sc->LHxxAngleXDa,TestAngleXDa,sizeof(TestAngleXDa));
memcpy(sc->LHxxAngleYDa,TestAngleYDa,sizeof(TestAngleYDa));
}

void ENobject2D::LHxxMOVE_2DIMAGE(char *Tname,float movex,float movey,
int mirrorX,int mirrorY)
{
TList=ENobject2DListOb.GetNode(Tname);
LHxx2DIMAGE *sc=TList->ObjectData;

sc->LHxxIx=movex;
sc->LHxxIy=movey;
float h=sc->LHxxIh;//缩放后的大小
float w=sc->LHxxIw;

//以中心为图片的位置
float x=sc->LHxxIx-sc->LHxxIw/2;
float y=sc->LHxxIy-sc->LHxxIh/2;

if(mirrorX==1)
{
LHxx2DSCREENVERTEX* ss;
sc->LHxx2DMVertexBuffer->Lock( 0, 0, (void**)&ss, 0 );
ss[0].LHxxSx=x +sc->LHxxAngleXDa[0];
// ss[0].LHxxSy=y +LHxxAngleYDa[0];

ss[1].LHxxSx=x+w +sc->LHxxAngleXDa[1];
// ss[1].LHxxSy=y +LHxxAngleYDa[1];

ss[2].LHxxSx=x +sc->LHxxAngleXDa[2];
// ss[2].LHxxSy=y+h +LHxxAngleYDa[2];

ss[3].LHxxSx=x+w+sc->LHxxAngleXDa[3];
// ss[3].LHxxSy=y+h +LHxxAngleYDa[3];
sc->LHxx2DMVertexBuffer->Unlock();
}
else if(mirrorX==2)
{
LHxx2DSCREENVERTEX* ss;
sc->LHxx2DMVertexBuffer->Lock( 0, 0, (void**)&ss, 0 );
ss[0].LHxxSx=x +w +sc->LHxxAngleXDa[0];
// ss[0].LHxxSy=y +LHxxAngleYDa[0];

ss[1].LHxxSx=x +sc->LHxxAngleXDa[1];
// ss[1].LHxxSy=y +LHxxAngleYDa[1];

ss[2].LHxxSx=x +w +sc->LHxxAngleXDa[2];
// ss[2].LHxxSy=y+h +LHxxAngleYDa[2];

ss[3].LHxxSx=x +sc->LHxxAngleXDa[3];
// ss[3].LHxxSy=y+h +LHxxAngleYDa[3];
sc->LHxx2DMVertexBuffer->Unlock();
}

if(mirrorY==1)
{
LHxx2DSCREENVERTEX* ss;
sc->LHxx2DMVertexBuffer->Lock( 0, 0, (void**)&ss, 0 );
// ss[0].LHxxSx=x +LHxxAngleXDa[0];
ss[0].LHxxSy=y +sc->LHxxAngleYDa[0];

// ss[1].LHxxSx=x+w +LHxxAngleXDa[1];
ss[1].LHxxSy=y +sc->LHxxAngleYDa[1];

// ss[2].LHxxSx=x +LHxxAngleXDa[2];
ss[2].LHxxSy=y+h +sc->LHxxAngleYDa[2];

// ss[3].LHxxSx=x+w+LHxxAngleXDa[3];
ss[3].LHxxSy=y+h +sc->LHxxAngleYDa[3];
sc->LHxx2DMVertexBuffer->Unlock();
}
else if(mirrorY==2)
{
LHxx2DSCREENVERTEX* ss;
sc->LHxx2DMVertexBuffer->Lock( 0, 0, (void**)&ss, 0 );
// ss[0].LHxxSx=x +w +LHxxAngleXDa[0];
ss[0].LHxxSy=y +h +sc->LHxxAngleYDa[0];

// ss[1].LHxxSx=x +LHxxAngleXDa[1];
ss[1].LHxxSy=y +h +sc->LHxxAngleYDa[1];

// ss[2].LHxxSx=x +w +LHxxAngleXDa[2];
ss[2].LHxxSy=y +sc->LHxxAngleYDa[2];

// ss[3].LHxxSx=x +LHxxAngleXDa[3];
ss[3].LHxxSy=y +sc->LHxxAngleYDa[3];
sc->LHxx2DMVertexBuffer->Unlock();
}


}


void ENobject2D::LHxxSCALE_2DIMAGE(char *Tname,float scalex,float scaley,
int mirrorX,int mirrorY)
{
TList=ENobject2DListOb.GetNode(Tname);
LHxx2DIMAGE *sc=TList->ObjectData;

//缩小极限为-0.1
if(scalex<=-0.1 || scaley<-0.1)
{
return;
}

//求出缩放差
float sx=sc->LHxxScaleX-scalex;
float sy=sc->LHxxScaleY-scaley;

if(sx<0)//放大
{
sc->LHxxIw=sc->LHxxIw+abs(sc->LHxxRw*sx);
sc->LHxxScaleOffsetX+=abs(sc->LHxxRw*sx);//计得缩放了多大
}
if(sx>0)//缩小
{
sc->LHxxIw=sc->LHxxIw-sc->LHxxRw*sx;
sc->LHxxScaleOffsetX-=abs(sc->LHxxRw*sx);
}

if(sy<0)//放大
{
sc->LHxxIh=sc->LHxxIh+abs(sc->LHxxRh*sy);
sc->LHxxScaleOffsetY+=abs(sc->LHxxRh*sy);
}
if(sy>0)//缩小
{
sc->LHxxIh=sc->LHxxIh-sc->LHxxRh*sy;
sc->LHxxScaleOffsetY-=abs(sc->LHxxRh*sy);
}

//当前缩放倍数
sc->LHxxScaleX=scalex;
sc->LHxxScaleY=scaley;


//将放大的数据过滤
LHxxROTATE_2DIMAGE(Tname,sc->LHxxAngle,mirrorX,mirrorY);
}


leechrockgames 2009-12-14
  • 打赏
  • 举报
回复

VOID ENobject2D::LHxxDRAW_2DIMAGE(char *Tname,void* value,int distance,int veversal)
{
int i=0;

TList=ENobject2DListOb.GetNode(Tname);
LHxx2DIMAGE *ob=TList->ObjectData;

if(ob->LHxxVisible<=0){return;}
LHxxMOVE_2DIMAGE(Tname,ob->LHxxIx,ob->LHxxIy,ob->LHxxMirrorXOff,ob->LHxxMirrorYOff);


//设置数字显示
if(distance!=-8888)
{
char ss[200];

strcpy(ss,(char*)value);
int size=strlen(ss);

int tempx=ob->LHxxIx;
int tempy=ob->LHxxIy;


for(i=0;i<size;i++)
{
ob->LHxx2DATCurFrame=(int)ss[i]-48;//计得ASKII码
if(veversal==0)//正常
{
ob->LHxxIx=tempx+(ob->LHxxIw*i/2+(distance*i));
}
else if(veversal==1)//反转
{
ob->LHxxIx=tempx+(ob->LHxxIw*((size-1)-i)/2+distance*((size-1)-i));
}
ob->LHxxIy=tempy;

LHxxMOVE_2DIMAGE(Tname,ob->LHxxIx,ob->LHxxIy,ob->LHxxMirrorXOff,ob->LHxxMirrorYOff);
ob->LHxxIx=tempx;
ob->LHxxIy=tempy;


this->ENobject::m_pd3dDevice->SetTexture( 0, ob->LHxx2DTexAT[ob->LHxx2DATCurFrame].
LHxxATTexture );

//设置渲染模式flat/gouraud
TENd3dOb->ENrenderStateOb->RenderState_RenderMode(2);


//设置渲染模式(渲染出正常面或者不断渲染出最底的面)(2D镜像要打开这个)
TENd3dOb->ENrenderStateOb->RenderState_CULLMODE(D3DRS_CULLMODE,D3DCULL_NONE);

//2D禁用,不然显示次序相反
//深度测试
//1:激活深度缓冲区;
//2:设置深度缓冲区;
//3:允许深度缓冲区更新
//4:设置深度测试
TENd3dOb->ENrenderStateOb->RenderState_ZFUNCTEST(false);

//辅助功能
//1:使程序允许抖动
TENd3dOb->ENrenderStateOb->RenderState_ASSISTANT(true);


//纹理alpha混合/alpha测试
TENd3dOb->ENrenderStateOb->RenderState_ALPHATEXTRUE(true);

//1:物理RGB混合方式
//2:设置纹理坐标是第几个纹理层(默认纹理坐标)P197
//3:设置纹理坐标输出为几维(2D)P199
TENd3dOb->ENrenderStateOb->RenderState_TEXTURE_BasicSet(0,1);

//纹理采样
TENd3dOb->ENrenderStateOb->RenderState_TEXTURE_Sampling(0,ob->Texture2DSample,1);

//纹理寻址
TENd3dOb->ENrenderStateOb->RenderState_TEXTURE_VisMode(0,ob->Texture2DAddress,ob->Texture2DAddressColor,1);

this->ENobject::m_pd3dDevice->SetStreamSource( 0, ob->LHxx2DMVertexBuffer, 0, sizeof(LHxx2DSCREENVERTEX) );
this->ENobject::m_pd3dDevice->SetFVF( LHxx2DSCREENVERTEXFVF );
// this->ENobject::m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2);

//基本图元:将顶点连结成基本图元
//能够绘制当前的索引数组;P56(多边形用)
// this->ENobject::m_pd3dDevice->DrawPrimitive( D3DPT_POINTLIST, 0, 2*3);//顶点集合
// this->ENobject::m_pd3dDevice->DrawPrimitive( D3DPT_LINELIST, 0,3*2 );//线段集合
// this->ENobject::m_pd3dDevice->DrawPrimitive( D3DPT_LINESTRIP, 0,3*2);//不间断线段集合
// this->ENobject::m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0,2);//三角形集合
this->ENobject::m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0,2);//不间断三角形集合
// this->ENobject::m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0,2);//fan集合
}


}
else if(distance==-8888)//正常图片显示
{
this->ENobject::m_pd3dDevice->SetTexture( 0, ob->LHxx2DTexAT[ob->LHxx2DATCurFrame].
LHxxATTexture );

//设置渲染模式flat/gouraud
TENd3dOb->ENrenderStateOb->RenderState_RenderMode(2);


//设置渲染模式(渲染出正常面或者不断渲染出最底的面)(2D镜像要打开这个)
TENd3dOb->ENrenderStateOb->RenderState_CULLMODE(D3DRS_CULLMODE,D3DCULL_NONE);

//2D禁用,不然显示次序相反
//深度测试
//1:激活深度缓冲区;
//2:设置深度缓冲区;
//3:允许深度缓冲区更新
//4:设置深度测试
TENd3dOb->ENrenderStateOb->RenderState_ZFUNCTEST(false);

//辅助功能
//1:使程序允许抖动
TENd3dOb->ENrenderStateOb->RenderState_ASSISTANT(true);


//纹理alpha混合/alpha测试
TENd3dOb->ENrenderStateOb->RenderState_ALPHATEXTRUE(true);

//1:物理RGB混合方式
//2:设置纹理坐标是第几个纹理层(默认纹理坐标)P197
//3:设置纹理坐标输出为几维(2D)P199
TENd3dOb->ENrenderStateOb->RenderState_TEXTURE_BasicSet(0,1);

//纹理采样
TENd3dOb->ENrenderStateOb->RenderState_TEXTURE_Sampling(0,ob->Texture2DSample,1);

//纹理寻址
TENd3dOb->ENrenderStateOb->RenderState_TEXTURE_VisMode(0,ob->Texture2DAddress,ob->Texture2DAddressColor,1);



this->ENobject::m_pd3dDevice->SetStreamSource( 0, ob->LHxx2DMVertexBuffer, 0, sizeof(LHxx2DSCREENVERTEX) );
this->ENobject::m_pd3dDevice->SetFVF( LHxx2DSCREENVERTEXFVF );
// this->ENobject::m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2);

//基本图元:将顶点连结成基本图元
//能够绘制当前的索引数组;P56(多边形用)
// this->ENobject::m_pd3dDevice->DrawPrimitive( D3DPT_POINTLIST, 0, 2*3);//顶点集合
// this->ENobject::m_pd3dDevice->DrawPrimitive( D3DPT_LINELIST, 0,3*2 );//线段集合
// this->ENobject::m_pd3dDevice->DrawPrimitive( D3DPT_LINESTRIP, 0,3*2);//不间断线段集合
// this->ENobject::m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0,2);//三角形集合
this->ENobject::m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0,2);//不间断三角形集合
// this->ENobject::m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0,2);//fan集合

}


//还原
TENd3dOb->ENrenderStateOb->RenderState_Reset();

for(i=0;i<8;i++)
{
m_pd3dDevice->SetTextureStageState( i,D3DTSS_COLOROP,D3DTOP_DISABLE);
}

}




void ENobject2D::LHxxFREE_2DIMAGE(char* Tname)
{
int i=0;

TList=ENobject2DListOb.GetNode(Tname);
LHxx2DIMAGE *ob=TList->ObjectData;

for(i=0;i<ob->LHxx2DATMaxFrame;i++)
{
if(ob->LHxx2DTexAT[i].LHxxATTexture!=NULL)
{
SAFE_RELEASE( ob->LHxx2DTexAT[i].LHxxATTexture);
ob->LHxx2DTexAT[i].LHxxATTexture=NULL;
if(ob->LHxx2DTexAT[i].LHxxAlphaData!=NULL)
{
free(ob->LHxx2DTexAT[i].LHxxAlphaData);
ob->LHxx2DTexAT[i].LHxxAlphaData=NULL;
}
}
}


free(ob->LHxx2DTexAT);



if(ob->LHxx2DMatrixOb)
{
delete ob->LHxx2DMatrixOb;
ob->LHxx2DMatrixOb=NULL;
}




free(ob->LHxx2DVertex);
SAFE_RELEASE( ob->LHxx2DMVertexBuffer);

//用图片生成路径存放数据对象
ob->ImagePathOb.clear();

ENobject2D::count2DOb_LIST--;//计算有多少个2D对象在LIST中.

delete ob;
ob=NULL;

ENobject2DListOb.EraseNode(Tname);//pass



}
leechrockgames 2009-12-14
  • 打赏
  • 举报
回复

#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);

}



vcPlayer 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 glacierful 的回复:]
使用CBitmap装载位图,然后创建内存DC,使用CDC的SelectObject把位图选入内存DC。在内存DC上绘图,绘图完成后,使用那个StretchBlt函数把内存DC上的位图复制到对话框的DC上。

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

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

变形是因为你的长、宽没有按同一个比例进行缩放
。不过这个函数的缺点还是很明显的——马赛克。
andywei1982 2009-12-14
  • 打赏
  • 举报
回复

以伸缩模式绘制
void StretchBlt(CDC* dc,const CRect& rect)
{
CDC memDC;
memDC.CreateCompatibleDC(dc);
CBitmap *oldBmp = memDC.SelectObject(this);

dc->StretchBlt(rect.left,
rect.top,
rect.Width(),
rect.Height(),
&memDC,//图片DC
0,
0,
this->Width,
this->Height,
SRCCOPY);
memDC.SelectObject(oldBmp);
memDC.DeleteDC();
}
andywei1982 2009-12-14
  • 打赏
  • 举报
回复
StretchBlt这个函数贴图的时候可以选择吧图贴到一个特定的矩形中,程序会自动拉伸图片以填满矩形区域
glacierful 2009-12-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fandh 的回复:]
还是StretchBlt!
你刚开始读入的时候,就StretchBlt!然后,再绘图,最后,bitblt就行了!
[/Quote]

CDC 装载位图的时候是用selectObject,还有别的装载的时候就拉伸的方式吗?
aa3000 2009-12-14
  • 打赏
  • 举报
回复
拉伸怎么做都会变形啊!
fandh 2009-12-14
  • 打赏
  • 举报
回复
这中间多了一道手续而已!
fandh 2009-12-14
  • 打赏
  • 举报
回复
还是StretchBlt!
你刚开始读入的时候,就StretchBlt!然后,再绘图,最后,bitblt就行了!

19,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧