欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

Directx:

之前沒學過Directx,拿了同學的代碼來看,也是霧里看花啊,不過有一點啟示了我,在初始化的時候,要傳入一個句柄去創(chuàng)建設備(CreateDevice),通常都是傳入窗口的設備,我想如果傳入一個控件的句柄,那所有的繪畫都將在這個控件上實現(xiàn),因為控件也是繼承自Window的。而Winform的控件在底層的實現(xiàn)應該和WIN32是一樣的。這樣的話只要把Winform的控件的句柄傳入C++代碼進行初始化,那么繪畫的結果將顯示在這個控件上。結果一試,還真行。關鍵代碼如下:

復制代碼 代碼如下:

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

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

在InitD3D傳入控件的句柄進行初始化,C#再調用Render進行繪畫,以下是C#代碼:

復制代碼 代碼如下:

HWND handle = this.button1.Handle;

InitD3D(handle);

private void Draw()

  {

         for (; ; )

            {

                Render();

            }

        }
 


效果圖:

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

復制代碼 代碼如下:

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#:
復制代碼 代碼如下:

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

效果圖:

WPF:WPF的控件沒有句柄,但是可以換個思路,把繪畫代碼封裝在Winform控件上,在WPF使用自定義的Winform控件。

相關文章

  • c#數(shù)字圖像處理的3種方法示例分享

    c#數(shù)字圖像處理的3種方法示例分享

    這篇文章主要介紹了c#數(shù)字圖像處理的3種方法示例,需要的朋友可以參考下
    2014-02-02
  • C#操作注冊表的方法

    C#操作注冊表的方法

    以下從‘讀’‘寫’‘刪除’‘判斷’四個事例實現(xiàn)對注冊表的簡單操作
    2007-03-03
  • C#常用自定義函數(shù)小結

    C#常用自定義函數(shù)小結

    這篇文章主要介紹了C#常用自定義函數(shù),包括將數(shù)組轉成字符串、DateTime時間格式轉換為Unix時間戳格式和生成某個范圍內的隨機數(shù),需要的朋友可以參考下
    2014-09-09
  • C#將DataGridView中的數(shù)據(jù)保存到CSV和Excel中

    C#將DataGridView中的數(shù)據(jù)保存到CSV和Excel中

    這篇文章介紹了C#將DataGridView中的數(shù)據(jù)保存到CSV和Excel中的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C#實現(xiàn)將32位MD5摘要串轉換為128位二進制字符串的方法

    C#實現(xiàn)將32位MD5摘要串轉換為128位二進制字符串的方法

    這篇文章主要介紹了C#實現(xiàn)將32位MD5摘要串轉換為128位二進制字符串的方法,涉及C#字符串遍歷、加密與轉換相關操作技巧,需要的朋友可以參考下
    2017-04-04
  • c# 異步編程入門

    c# 異步編程入門

    這篇文章主要介紹了c# 異步編程入門的相關資料,幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#+EmguCV使用攝像頭讀取、保存視頻

    C#+EmguCV使用攝像頭讀取、保存視頻

    這篇文章主要為大家詳細介紹了C#+EmguCV使用攝像頭讀取、保存視頻,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C# AE之返回上一級和下一級的實戰(zhàn)操作

    C# AE之返回上一級和下一級的實戰(zhàn)操作

    這篇文章主要介紹了C# AE之返回上一級和下一級的實戰(zhàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Unity Shader實現(xiàn)徑向模糊效果

    Unity Shader實現(xiàn)徑向模糊效果

    這篇文章主要為大家詳細介紹了Unity Shader實現(xiàn)徑向模糊效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C#實現(xiàn)學生管理系統(tǒng)

    C#實現(xiàn)學生管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C#實現(xiàn)學生管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評論