C#2010. 3. 31. 17:53

#. 내용.
 - 특정 인코딩으로 입력된 문자를 읽을 수 있습니다. StreamReader를 사용하여 표준 텍스트 파일에서 정보 줄을 읽습니다. 별도로 지정하지 않으면 StreamReader는 기본적으로 현재 시스템의 ANSI 코드 페이지 대신 UTF-8 인코딩으로 지정됩니다. UTF-8은 유니코드 문자를 정확하게 처리하고 운영 체제의 지역화된 버전에 대한 일관성 있는 결과를 제공합니다.

#. 사용예제
 - StreamReader sr = new StreamReader("FilePath", Encoding);

Posted by 쿵캉켕
C#2010. 3. 31. 13:36
#. 다른사람에게 프로젝트를 받아서 내 PC에서 실행시키는 경우 ["파일경로" 명령이 1 코드에서 끝났습니다.] 대충 이런 글귀의 에러가 발생하면서 실행이 안되는 경우 확인하는 방법.
 - 파일경로중 한글이 포함되어 있다면 한글을 제거하고 다시 실행하면 실행이 가능합니다.
Posted by 쿵캉켕
C#2010. 3. 31. 10:13

#. Managed Code
 - .NET 프레임워크 환경에서 동작하는 코드로 CLR(Common Language Runtime)에 적용받는 코드입니다. managed code의 경우 .NET 실행환경에 의해 제공되는 기능들(ex. 가비지 컬렉션 등)을 그대로 이용할 수 있습니다. C#, VB.NET, ASP.NET등이 managed code에 포함됩니다.

#. Unmanaged Code
 - Unmanaged code, 또는 Native code라고 불리우며 CLR에 적용 받지 않고 개발자가 사용하고 있는 PC의 윈도우 운영체제상에서 동작하는 코드를 말합니다. 이럴 경우 각 운영체제에 따라 동작이 안될 수도 있습니다. 예를 들면 Visual Studio 6.0까지의 VC++ 6.0을 들 수 있습니다.

Posted by 쿵캉켕
C#2010. 3. 23. 13:27

1. delegate(델리게이트)
#. 내용
 - 프로그램에서 어떤 기능을 대신 수행해 주는 대리자 역할을 하게됩니다.
 - 델리케이트는 일종의 메소드 포인터로 메소드를 효율적으로 사용하기 위한 캡슐화를 위해 주로 사용 합니다.
 - event를 구현하기 위해 선언 합니다.

#. 메소드 대리자 델리게이트
 - 델리게이트는 class와 같은 위치에서 선언해 줍니다.
 - 델리게이트를 인스턴스화 시킬 때 반드시 메소드를 참조시켜야 합니다.
 - 선언 형식은 선언할 메소드(함수)와 동일란 형식으로 선언되어야 합니다. 즉, 위임 메소드는 대리자와 형식이 일치해야 합니다.
 - 예제

001: using System;

002: //델리게이트 선언

003: delegate void dele1();

004: delegate int dele2(int a,int b);

005: class MainClass

006: {

007:    static void Main(string[] args)

008:    {

009:           //Math클래스 선언및 인스턴스화

010:           MathClass MathClass=new MathClass();

011:           //델리게이트 선언및 인스턴스화

012:           dele1 Sum1=new dele1(MathClass.Intro);

013:           dele2 Sum2=new dele2(MathClass.Sum);

014:           //델리게이트에 위임된 메서드 실행

015:           Sum1();

016:           Console.WriteLine("Result : {0}",Sum2(-10,90));

017:    }

018: }

019: class MathClass

020: {

021:    public void Intro()

022:    {

023:           Console.WriteLine("계산을 시작합니다.");

024:    }

025:    public int Sum(int a, int b)

026:    {

027:           return a+b;

028:    }

029: }
 - 결과
계산을 시작합니다.
Result : 80


#. 델리게이트의 연산
 - 델리게이트는 Combine과 Remove라는 두개의 연산 메소드를 지원합니다. 이것으로 인해 델리게이트는 여러 메소드의 참조가 가능합니다.
  -> Combine: 기존 위임에 또 위임을 추가합니다.[=+]
  -> Remove: 기존의 위임중에 특정 위임을 제거합니다.[=-]
 - 아래 예제의 15줄에서 +=로 메소드를 추가한 Math는 Plus(10), Minus(10), Multiply(10) 이렇게 3개의 메소드를 차례대로 호출하는 것과 같은 의미를 갖게 됩니다.
 - 아래 예제의 22줄에서처럼 -=로 메소드를 삭제하면 Math는 Plus(10), Multiply(10)만을 위임받게 됩니다.
 - 예제

001: using System;

002: delegate void deleMath(int Value); //델리게이트 선언

003: class MainClass

004: {

005:    static void Main(string[] args)

006:    {

007:           //Math클래스 선언및 인스턴스화

008:           MathClass MathClass=new MathClass();

009:          

010:           //델리게이트 선언및 인스턴스화(덧셈)

011:           deleMath Math=new deleMath(MathClass.Plus);

012:

013:           //위임연산(뺄셈,곱셈추가)

014:           Math+=new deleMath(MathClass.Minus);

015:           Math+=new deleMath(MathClass.Multiply);

016:           //결과1

017:           MathClass.Number=10;

018:           Math(10);

019:           Console.WriteLine("Result:{0}",MathClass.Number);

020:

021:           //위임연산(뺄셈제거)

022:           Math-=new deleMath(MathClass.Minus);

023:           //결과2

024:           MathClass.Number=10;

025:           Math(10);

026:           Console.WriteLine("Result:{0}",MathClass.Number);

027:

028:           //위임연산(곱셈제거)

029:           Math-=new deleMath(MathClass.Multiply);

030:           //결과3

031:           MathClass.Number=10;

032:           Math(10);

033:           Console.WriteLine("Result:{0}",MathClass.Number);

034:

035:    }

036: }

037: class MathClass

038: {

039:    public int Number;

040:    public void Plus(int Value)//더하기

041:    {

042:           Number+=Value;

043:    }

044:    public void Minus(int Value)//빼기

045:    {

046:           Number-=Value;

047:    }

048:    public void Multiply(int Value)//곱하기

049:    {

050:           Number*=Value;

051:    }
052: }

 - 결과
Result:100
Result:200
Result:20


2. event(이벤트)
#. 내용
 - 프로그램 상에서 행해지게 되는 일련의 행위들을 가리킵니다.
 - 마우스를 클릭하는것, 키보드를 입력하는것, 윈도우 창을 움직이는 것 이런 것들이 모두 이벤트 입니다.
 - 각 이벤트에가 발생할 경우 어떻게 처리하겠다는 코드를 작성할 수 있습니다.
 - 델리게이트를 통해 구현됩니다.

#. 구현
 - event 선언된델리게이트명 이벤트명;

#. 예제

001: using System;

002: //델리게이트 선언

003: delegate void eventDelegate();

004: class EventTest

005: {

006:    // Event1 이라는 우리만의 새로운 이벤트를 선언해 주고,

007:    // 이 이벤트의 처리는 eventDelegate 타입의 delegate들이

008:    // 하게 된다는 것을 알립니다.

009:    public event eventDelegate ckEvent;

010:    // 어떤 버튼을 누를 때, 이 메서드가 호출된다고 가정 합시다.

011:    public void btnClick()

012:    {

013:           ckEvent();

014:    }

015: }

016: class MainClass

017: {

018:    static void Click()

019:    {

020:           Console.WriteLine("클릭 되었습니다.");

021:    }

022:    static void Main(string[] args)

023:    {

024:           //클래스 선언및 인스턴스화

025:           EventTest eTest = new EventTest();

026:          

027:           // 미리 정의한 이벤트 즉,ckEvent가 발생한 경우

028:           // eTest 라는 인스턴스에서 이 이벤트를 처리할 메서드

029:           // (핸들러, Delegate)를 지정합니다.

030:           eTest.ckEvent += new eventDelegate(MainClass.Click);

031:

032:           // 어떤 버튼이 눌려서 클릭 이벤트가 발생되었다고 가정합니다.

033:           eTest.btnClick();

034:    }
035: }

#. 결과
계산을 시작합니다.
Result : 80

출처: 훈스닷넷(http://www.hoons.kr/)

Posted by 쿵캉켕
DirectShow2010. 3. 18. 12:20

동영상 프로그램 제작 시 새창을 띄우지 않고 동영상이 플레이되길 원한다면 IVideoWindow 인터페이스를 이용하여 비디오 재생 윈도우를 동영상 프로그램에 붙여야 합니다. IVideoWindow를 설정하지 않을 경우 기본적으로 새 창에서 동영상이 플레이 됩니다.

밑에는 간단한 사용 방법 입니다.


public partial class Form1 : Form
    {
        IGraphBuilder pGraph = null;
        IMediaControl pControl = null;
        //IMediaEvent pEvent = null;
        IVideoWindow videoWindow = null;

        private string strTitle = "";   //파일 대화상자의 제목표시줄에 표시될 문자열.
        private string strTitleTmp = "";    //임시 제목표시줄 저장 변수.
        private string strFilePath = "";    //선택한 파일 경로.


        public Form1()
        {
            InitializeComponent();

        }


        private void Form1_Load(object sender, EventArgs e)
        {

        }


        private void btnList_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFile = new OpenFileDialog();
            openFile.Filter = "미디어 파일(avi, wmv)|*.avi;*.wmv|All Files|*.*";

            if (DialogResult.OK == openFile.ShowDialog())
            {
                strFilePath = openFile.FileName;
                strTitleTmp = strFilePath;

                int titleIndex = strTitleTmp.LastIndexOf("\\");

                strTitle = strTitleTmp.Substring(titleIndex + 1);
                this.Text = strTitle;
            }
        }


        private void btnPlay_Click(object sender, EventArgs e)
        {
            pGraph = (IGraphBuilder)new FilterGraph();
            pControl = (IMediaControl)pGraph;
            videoWindow = (IVideoWindow)pGraph;

            pGraph.RenderFile(strFilePath, "");

            //붙이고자 하는 부모 윈도우의 핸들을 받습니다.
            this.videoWindow.put_Owner(this.Handle);
            //비디오 윈도우의 스타일을 자식 윈도우로 변경합니다.
            this.videoWindow.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipChildren);
            //비디오 윈도우가 재생될 위치를 지정합니다.
            this.videoWindow.SetWindowPosition(this.panel1.Left, this.panel1.Top, this.panel1.Width, this.panel1.Height);
            //비디오 윈도우가 표시되도록 설정합니다.
            this.videoWindow.put_Visible(OABool.True);

            pControl.Run();
        }


        private void btnStop_Click(object sender, EventArgs e)
        {
            pControl.Stop();
        }
    }

Posted by 쿵캉켕
DirectShow2010. 3. 18. 09:52

C#에서 DirectShow를 활용할 수 있는 라이브러리 파일입니다. DirectShow를 사용하면 비디오 및 오디오를 제어할 수 있습니다.

Posted by 쿵캉켕