'c#'에 해당되는 글 19건
- 2010.03.31 StreamReader 클래스 3
- 2010.03.31 명령이 1 코드에서 끝났습니다.
- 2010.03.31 Managed Code & Unmanaged Code
- 2010.03.23 delegate(델리게이트) or event(이벤트)
- 2010.03.18 C#에서 IVideoWindow 사용. 1
- 2010.03.18 DirectShow를 활용하기 위한 라이브러리 파일 1
#. 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을 들 수 있습니다.
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
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
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
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/)
동영상 프로그램 제작 시 새창을 띄우지 않고 동영상이 플레이되길 원한다면 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();
}
}
C#에서 DirectShow를 활용할 수 있는 라이브러리 파일입니다. DirectShow를 사용하면 비디오 및 오디오를 제어할 수 있습니다.