×

DirectDraw之C#初步掌握攻略2

Kalet Kalet 发表于2009-03-20 12:00:14 浏览176 评论0

抢沙发发表评论

实体。它是通过一个DDSURFACEDESC与之对应来设置,该存储区的解释方式,和信息格式等信息。并不是所有的Surface都是可见,有的Surface仅仅是用于存储将要处理的图像信息。因此,显示的内存区域PRIMARYSURFACE和OVERLAY一般都在显存。(OverLay需要硬件支持,一般用作桌面悬浮层,它的显示区域是专门划分的有别于普通的显存)而其它的surface一般都是放在系统内存中,当然你也可以使用DSCAPS_VIDEOMEMORY/ DDSCAPS_SYSTEMMEMORY来指定surface存放的位置。我现在就需要两个surface,一个作为Primary,另一个则是用作存放从硬盘读取来的图片数据。最后,再把数据转换到Primary。
PrimarySurface如此之重要,是不能直接操作的。
DirectDraw之C#初步掌握攻略2

DxVBLib.RECT rect,rectSec;
DxVBLib.DDSURFACEDESC2 dDDesc=new DxVBLib.DDSURFACEDESC2();
DxVBLib.DirectDrawSurface7 dDsurface;
DxVBLib.DDSURFACEDESC2 dDDesc1=new DxVBLib.DDSURFACEDESC2();
DxVBLib.DirectDrawSurface7 dDsurfaceSec;
dDDesc.lFlags=DxVBLib.CONST_DDSURFACEDESCFLAGS.DDSD_CAPS; dDDesc.ddsCaps.lCaps=DxVBLib.CONST_DDSURFACECAPSFLAGS.DDSCAPS_PRIMARYSURFACE;
dDsurface=dDraw.CreateSurface(ref dDDesc);
dDsurfaceSec=dDraw.CreateSurfaceFromFile("c:\\3.bmp",ref dDDesc1);
rect.Top=0;
rect.Left=0;
rect.Right=dDDesc1.lWidth; / /按图片本身大小显示
rect.Bottom= dDDesc1.lHeight;
dDsurface.BltFast(0,0,dDsurfaceSec,ref rect,DxVBLib.CONST_DDBLTFASTFLAGS.DDBLTFAST_WA99v);//将图象在屏幕上显示
   由于我们使用的是BMP位图文件也就是一个DIB文件,它的头文件包含了调色板以及其他的一系列属性,dDDesc1已经被设置过了,所以就不用再来设置了。RECT是用于控制显示区域的结构体。Blt就是我们用来在surface之间转换数据的方法,也就是画图的方法,其实与之类似的还有Flip,Flip方法使用一个缓冲层来避免过多在Primary上的切换以换取效率,具体方法还是看一下在线帮助,这里就不作介绍了。BltFast的第一个参数和第二个参数用于控制IMAGE出现的顶点坐标(屏幕坐标系,单位长度为1个像素),RECT控制的是IMAGE是图片的哪一部分图片,所以这里IMAGE所指定的是整幅图片,也就是说我们可以局部的显示图片。运行的结果如下图;


   可以看到我们所绘制的图片并不再frm的区域里面。这是由于PrimarySurface代表的是整个
可见区域,所以我们以0,0为起始绘图自然不能保证在frm内,这个时候我们需要用另一个blt方法blt;代码如下:

dx.GetWindowRect(this.Handle.ToInt32(),ref rectSec);
dDsurface.Blt(ref rectSec,dDsurfaceSec,ref rect,DxVBLib.CONST_DDBLTFLAGS.DDBLT_WA99v);

  rectSec就将图片限制在form所在的区域。效果如下:


  这一次图片的显示区域已经被限制到窗体上了,可是还有一点问题,窗体上方的控制条被覆盖掉了。这一次我们加入Clipper来限制图片绘制的边界。代码如下:

dDclipper=dDraw.CreateClipper(0);
dDclipper.SetHWnd(this.Handle.ToInt32()); DirectDraw之C#初步掌握攻略2
dDsurface.SetClipper(dDclipper);

  Clipper取得的边界是form的句柄传递的,所以Clipper所覆盖的区域就是form的区域,这回我们可以看到正确的显示了;



   将代码整理如下

private void draw()
{
dDraw=dx.DirectDrawCreate("");
DxVBLib.DirectDrawClipper dDclipper;
dDraw. SetCooperativeLevel(this.Handle.ToInt32(),DxVBLib.CONST_DDSCLFLAGS.DDSCL_NORMAL);
DxVBLib.RECT rect,rectSec=new DxVBLib.RECT();
DxVBLib.DirectDrawSurface7 dDsurface;
DxVBLib.DirectDrawSurface7 dDsurfaceSec;
dDDesc.lFlags=DxVBLib.CONST_DDSURFACEDESCFLAGS.DDSD_CAPS;
dDDesc.ddsCaps.lCaps=DxVBLib.CONST_DDSURFACECAPSFLAGS.DDSCAPS_PRIMARYSURFACE;
dDsurface=dDraw.CreateSurface(ref dDDesc);
dDclipper=dDraw.CreateClipper(0);
dDclipper.SetHWnd(this.Handle.ToInt32());
dDsurface.SetClipper(dDclipper);
dDsurfaceSec=dDraw.CreateSurfaceFromFile("c:\\3.bmp",ref dDDesc1);
dx.GetWindowRect(this.Handle.ToInt32(),ref rectSec);
rect.Top=0;
rect.Left=0;
rect.Right=dDDesc1.lWidth;
rect.Bottom= dDDesc1.lHeight; DirectDraw之C#初步掌握攻略2
dDsurface.Blt(ref rectSec,dDsurfaceSec,ref rect,DxVBLib.CONST_DDBLTFLAGS.DDBLT_WA99v);
}


群贤毕至

访客