由於我們使用的是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_WAIT);
rectSec就將圖片限制在form所在的區域。效果如下:
這一次圖片的顯示區域已經被限制到窗體上了,可是還有一點問題,窗體上方的控制條被覆蓋掉了。這一次我們加入Clipper來限制圖片繪制的邊界。代碼如下:
dDclipper=dDraw.CreateClipper(0);
dDclipper.SetHWnd(this.Handle.ToInt32());
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;
dDsurface.Blt(ref rectSec,dDsurfaceSec,ref rect,DxVBLib.CONST_DDBLTFLAGS.DDBLT_WAIT);
}