C# 윈폼에서 DirectX 사용( VC2008 Express기준)

프로그래밍/C# 2008/04/30 21:12

C#에서 Managed DirectX 사용을 하기 위한 기초작업정리 : 조각지식

MS에 제공하는 튜토리얼 링크 .
http://msdn.microsoft.com/en-us/library/ms920768.aspx
(주의 : MS의 링크는 언제 바꿀지 언제 없어질지 아무도 모름)

gregs 블로그의 튜토리얼 링크.
http://gregs-blog.com/2008/02/26/managed-directx-c-graphics-tutorial-1-getting-started/

위의 두 링크를 학습하면 사용하는데 큰 무리없이 사용가능 하다.

==========================================================================

튜토리얼이 있지만  그럼에도 불구하고
어떻게요? 라고 물어볼수 있는, 이전의 프로그래밍 경험이 전혀없고 C#으로 출발한
초심자들을 위해 짧은 예제를 준비했다.

(하지만 튜토리얼을 보고 응용이 불가능하다면 ,
기본을 더 닦아야 되는 때라는 것을 명심하기 바란다.
C#기초 책을 더보아야 하고 , 프로그래밍에 대한 기본개념을
더 익혀야 하는 것을 절실하게 느껴야 한다..
일반적으로 프로그래머라고 하는 사람들은 신입이라고 해도
튜토리얼을 보면 알아서 할 수 있는 사람을 의미한다.
물론 가끔 메유얼이 개판인 경우는 삽질을 할수도 있지만 ====)



** 윈도우즈 폼 패널에 DirectX화면 만들어보기 ** by Xevious7

요약 : 간단하게 윈도우즈 폼에서 패널 같은 오브젝트를 만든다음 그 안에
DirectX Device를 생성하고 푸른화면을 표시하는 것을 만드는 예제.

필요 선행 작업 : DIrectX 9이상의 SDK설치 , VC2008 Express C# 설치

새로운 프로젝트를 만든다.
참조추가( Project -> Add Reference) 에서
Microsoft.DirectX
Microsoft.DirectX.3D 를 추가한다.


[그림 참조추가]

기본폼 디자인에서 패널하나를 추가한다. 패널이 아닌 다른 그래픽오브젝트가 사용가능한
다른 오브젝트도 상관 없다.

그래픽은 Paint 이벤트에서 처리된다. 내부적으로 보면 Paint 는 MFC의 OnPaint 이벤트나
순수 API에서 WM_PAINT 이벤트 처리하는 부분이라고 생각하면 된다.
폼을 선택하고 ,프로젝트 속성(Properties)의 이벤트에 Paint를 추가하여(더블클릭하면된다)
이벤트 처리함수를 만든다.

private void Form1_Paint(object sender, PaintEventArgs e)
{
}

초기화 처리를 위하여 다시 폼을 선택하고 클릭하면 Form1_Load 처리함수의
외형이 만들어진다.

private void Form1_Load(object sender, EventArgs e)
{
}


외형이 만들어지면 ,이 외형에 필요한 코드를 작성한다.
(순서는 바뀌어도 상관없고 스타일은 자유이다. 이것은 예일 뿐이다.)

첫번째는 라이브러리 참조를 위해 라이브러리 참조를 하는부분에 다음 두줄을 추가한다.
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;


Dx 초기화 함수의 작성
private Device dx_device = null; // 네임스페이스에서 쓸 디바이스를 정의한다.
void InitDx()
{
           PresentParameters pp = new PresentParameters(); //프레즌트 파라미터생성

           pp.Windowed = true; // 원도우즈모드 설정
           pp.SwapEffect = SwapEffect.Discard;

           dx_device = new Device(0,
                                               DeviceType.Hardware,
                                              this.panel1, // 현재폼의 패널을 랜더링윈도우로사용.
                                              CreateFlags.SoftwareVertexProcessing,
                                             pp); // 디바이스 생성
}

Load 함수에서 Dx 초기화 함수 호출
private void Form1_Load(object sender, EventArgs e)
       {
           InitDx();
       }

Paint 함수 에서 화면을 지우고 보여주는 부분을 작성하여 완료한다.
private void Form1_Paint(object sender, PaintEventArgs e)
       {
           dx_device.Clear(ClearFlags.Target,
                                   System.Drawing.Color.FromArgb(0, 0, 255).ToArgb(),
                                   1.0f,
                                   0); // 파란색배경으로 화면클리어
           dx_device.Present(); // DX present함수
       }

빌드(F6)후 실행(F5)

C#의 기본 윈폼 프로젝트 틀의 패널에 다이렉스화면이 만들어졌다.

C#윈폼 DirectX의 헬로우월드 프로그램인 셈이다.


PS.

managed가 아닌 일반적인 API수준에서 DirectX를 써서
파란화면을 만드는 예제에 비하면 엄청 간단하다.

당연한것이 이벤트처리부분이라든지 윈도우즈 초기화라든지
하는 부분들이 모두 윈폼이라는 틀 안에서 자동 처리 되기 때문에
프로그래머가 할 부분은 그 윗단의 실제 필요한 부분의 연결만이 필요한것이다.

이러한 개념으로 출발한 개발툴이 바로 RAD툴 이라고 불리어지는 툴이다.
RAD는 Rapid Application Development 의 약자이다.

RAD툴이라면 이정도는 되어야 된다고 생각한다.
애초부터 윈도우즈폼은 이러한 용도로 발전되어져 왔다.
RAD툴 초장기에 비주얼베이직은 델파이나 파워빌더에 비하면  너무 떨어지는
수준이었으나 사실 RAD툴 축에 끼지 못하는 것이였지만 MS제품으로는 VB가
그나마 가까운 툴이였다.  
그러나 점점 발전하여 윈폼에 이르러서는 쓸만한 툴이 된것 같다.
(10년전에 나온 파워빌더는 그 용도로 보면 제약적이지만, RAD툴 관점에서보면
굉장히 편리한 툴 이었다. 예를 들어 비디오샵 관리 프로그램을 만드는데
걸리는 시간이 반나절 정도의 코딩이면 충분했다.
물론 비베로도 충분히 만들수 있지만 그 당시 비베의 인터페이스나 지원환경은
파워빌더의 편리함에 비하면 상당히 모자랐다. 지금의 윈폼쓰는 정도의 편리함이
그 당시에 제공되었으니 , 여러제약에도 불구하고 참 잘만든 RAD툴로 생각된다.)

현재의 C#은 매우 여러가지 용도로 쓰여지는 스크립트 언어이지만,
RAD툴의 입장에서 보면 파워스크립트처럼 , 윈폼이나 Net Framework 3.5에서
새롭게 등장한 WPF의 기반틀을 잘 사용하기 위한 스크립트 언어라고
보면 된다. 이러한 관점에서 본다면 C#프로그래밍에서 중요한 요소는
각각의 구성요소 즉 윈폼을 사용한다면 윈폼의 각각의 구성요소에 대한
이해 콘테이너에 대한이해 인터페이싱에 대한 이해가 프로그래밍에서
가장 중요한 요소가 된다.

즉 C# 프로그래밍 이라기 보다는 윈폼 프로그래밍이랄까.

top

Trackback Address :: http://xevious7.com/trackback/343

  1. bruceKim 2008/06/22 22:16 MODIFY/DELETE REPLY

    좋은 글 잘 보고 갑니다.(링크 퍼가요~!)

  2. 아리수 2008/12/04 15:48 MODIFY/DELETE REPLY

    덕분에 많은 도움 되었습니다.
    잘보고 갑니다.^^

  3. dogtag 2009/01/21 12:29 MODIFY/DELETE REPLY

    추신에 적으신 C#에 대한 고찰에 동의 한표 던지고 갑니다.
    잘 읽고 갑니다~ ^^

    • xevious7 2009/01/21 16:31 MODIFY/DELETE

      네 감사합니다. 고급언어일수록 갖추어져 있는
      콘테이너에 대한 활용이 중요해지는것 같습니다. :)

  4. pill 2009/07/20 17:20 MODIFY/DELETE REPLY

    우오~~ 감사합니다 ㅠㅠ

    객체는 어케 올리나요? ㅎㅎ

  5. 되엔자앙 2011/02/15 12:03 MODIFY/DELETE REPLY

    덕분에 시작은(?) 순조로웠습니다.
    근데, 문제가 있더군요..

    C# 솔루션을 하나 만들면 기본적으로 Any CPU 가 됩니다.
    이 상태로 두면 BadImageFormatException 오류가 나더군요..
    검색을 해보니 x86 방식의 것으로 새로 만들어주고 실행해보니 잘 됩니다.
    환경(vs2008, win7 64bit) 였습니다.

    • xevious7 2011/02/18 09:24 MODIFY/DELETE

      네 문서가 예전문제라서 달라진 부분들이 있다면 수정해야 될듯 합니다. 답글 달아놓으신 부분이 다른분에게도 도움이 되겟네요. ^_^ 감사합니다.

Write a comment