程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> DirectDraw之C#入門攻略(3)

DirectDraw之C#入門攻略(3)

編輯:關於C語言

由於我們使用的是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);
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved