最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

混合語(yǔ)言編程—C#使用原生的Directx和OpenGL繪圖的方法

 更新時(shí)間:2013年09月11日 14:42:43   作者:  
本文要說(shuō)的是混合C#和C/C++語(yǔ)言編程,在C#的Winform和WPF下使用原生的Direct和OpenGL進(jìn)行繪圖

由于項(xiàng)目需要做一些圖形展示,所以就想到了使用Directx和OpenGL來(lái)繪圖,但項(xiàng)目準(zhǔn)備使用C#來(lái)開(kāi)發(fā)(大家比較熟悉C#),在網(wǎng)上看了相關(guān)的資料,有一些第三方的控件可用,試用了下,一運(yùn)行就占了幾百M(fèi)的內(nèi)存,而且也不知道是否穩(wěn)定,教程也少,還不如直接使用原生的。在網(wǎng)上看的Directx和OpenGL的教程基本上都是C/C++的,找了很久也就找到相關(guān)介紹,只能自己研究下。

我以前做過(guò)C#和C++混合語(yǔ)言編程相關(guān)的東西,在C++實(shí)現(xiàn)一些C#不好實(shí)現(xiàn)的功能,C#動(dòng)態(tài)調(diào)用DLL文件,所以也想到了用C++的代碼來(lái)控制Winform控件的繪畫(huà),這樣就可實(shí)現(xiàn)用Direct和OpenGL在Winform的控件上繪畫(huà)了。

由于我對(duì)Direct和OpenGL都不熟悉,沒(méi)有這方面的編程經(jīng)驗(yàn),只能去瞎折騰,下面分別說(shuō)說(shuō)最近在Directx和OpenGL怎么試驗(yàn)的。

Directx:

之前沒(méi)學(xué)過(guò)Directx,拿了同學(xué)的代碼來(lái)看,也是霧里看花啊,不過(guò)有一點(diǎn)啟示了我,在初始化的時(shí)候,要傳入一個(gè)句柄去創(chuàng)建設(shè)備(CreateDevice),通常都是傳入窗口的設(shè)備,我想如果傳入一個(gè)控件的句柄,那所有的繪畫(huà)都將在這個(gè)控件上實(shí)現(xiàn),因?yàn)榭丶彩抢^承自Window的。而Winform的控件在底層的實(shí)現(xiàn)應(yīng)該和WIN32是一樣的。這樣的話只要把Winform的控件的句柄傳入C++代碼進(jìn)行初始化,那么繪畫(huà)的結(jié)果將顯示在這個(gè)控件上。結(jié)果一試,還真行。關(guān)鍵代碼如下:

復(fù)制代碼 代碼如下:

extern "C" _declspec(dllexport) HRESULT InitD3D( HWND hWnd );

extern "C" _declspec(dllexport) VOID Render();

在InitD3D傳入控件的句柄進(jìn)行初始化,C#再調(diào)用Render進(jìn)行繪畫(huà),以下是C#代碼:

復(fù)制代碼 代碼如下:

HWND handle = this.button1.Handle;

InitD3D(handle);

private void Draw()

  {

         for (; ; )

            {

                Render();

            }

        }
 


效果圖:

OpenGL:
         查看了OpenGL的相關(guān)教程(推薦http://www.yakergong.net/nehe/),OpenGL是通過(guò)RC來(lái)執(zhí)行的,創(chuàng)建RC時(shí)就必須指定一個(gè)DC,還要設(shè)置DC的像素格式。每個(gè)線程有且只能擁有一個(gè)RC。
         如果在初始化OpenGL的繪畫(huà)環(huán)境時(shí)傳入一個(gè)Winform的控件句柄,再通過(guò)這個(gè)句柄取到HDC,就可使用這個(gè)HDC來(lái)創(chuàng)建RC,這樣OpenGL的繪畫(huà)環(huán)境就準(zhǔn)備好了,并且這個(gè)RC關(guān)聯(lián)到Winform的控件上。
         在給制前,先為當(dāng)前線程選擇RC(之前通過(guò)HDC創(chuàng)建的),再進(jìn)行繪制,這樣繪制的結(jié)果將顯示在這個(gè)Winform控件上。
         關(guān)鍵代碼如下:
C++:

復(fù)制代碼 代碼如下:

extern "C" _declspec(dllexport) void Init( HWND hWnd);
extern "C" _declspec(dllexport) void Render();
void Init(HWND hWnd)
{
   int PixelFormat;
   int bits = 16;
   hDC = GetDC(hWnd);
   static  PIXELFORMATDESCRIPTOR pfd=           // pfd Tells Windows How We Want Things To Be
   {
      sizeof(PIXELFORMATDESCRIPTOR),              // Size Of This Pixel Format Descriptor
      1,                                                            // Version Number
      PFD_DRAW_TO_WINDOW |                        // Format Must Support Window
      PFD_SUPPORT_OPENGL |                          // Format Must Support OpenGL
      PFD_DOUBLEBUFFER,                               // Must Support Double Buffering
      PFD_TYPE_RGBA,                                     // Request An RGBA Format
      bits,                                                        // Select Our Color Depth
      0, 0, 0, 0, 0, 0,                                       // Color Bits Ignored
      0,                                                         // No Alpha Buffer
      0,                                                         // Shift Bit Ignored
      0,                                                        // No Accumulation Buffer
      0, 0, 0, 0,                                           // Accumulation Bits Ignored
      16,                                                    // 16Bit Z-Buffer (Depth Buffer)
      0,                                                     // No Stencil Buffer
      0,                                                     // No Auxiliary Buffer
      PFD_MAIN_PLANE,                         // Main Drawing Layer
      0,                                                  // Reserved
      0, 0, 0                                          // Layer Masks Ignored
   };
   PixelFormat=ChoosePixelFormat(hDC,&pfd);
   SetPixelFormat(hDC,PixelFormat,&pfd);
   hRC=wglCreateContext(hDC);
}
void Render()
{
   wglMakeCurrent(hDC, hRC);
   draw();
   SwapBuffers(hDC);
   wglMakeCurrent(NULL, NULL);
}

C#:
復(fù)制代碼 代碼如下:

Init(this.pictureBox1.Handle);
//開(kāi)始繪制
var timer = new System.Timers.Timer();
timer.Interval = 100;
 timer.Elapsed += (tsender, te) =>
                {
                    Render();
                };
timer.AutoReset = true;
timer.Enabled = true;

效果圖:

WPF:WPF的控件沒(méi)有句柄,但是可以換個(gè)思路,把繪畫(huà)代碼封裝在Winform控件上,在WPF使用自定義的Winform控件。

相關(guān)文章

最新評(píng)論

灵璧县| 瑞丽市| 安宁市| 乳山市| 都匀市| 宣化县| 克山县| 忻州市| 高碑店市| 霍邱县| 鲁甸县| 河池市| 兴安县| 尉氏县| 根河市| 泸西县| 云南省| 东平县| 鄯善县| 富阳市| 中卫市| 德兴市| 同仁县| 阜新市| 宁德市| 华阴市| 太谷县| 逊克县| 连平县| 高雄市| 临海市| 繁昌县| 于都县| 滨海县| 龙海市| 化州市| 永胜县| 富顺县| 安乡县| 张家港市| 苍南县|