C#

1.

이벤트 핸들링을 위해서 사용, 쉽게말해서 피동적인 액션을 취할때 사용한다

누군가가 나를 호출하므로서 내가 호출당하기 위해 사건에 개입하는 일이 없게된다

즉, 사건과 그로인한 행위를 분리할 수 있다

 

 

2.

C++에서 이 이벤트핸들링을 위해서 사용하던 함수포인터라는 개념을 더더욱 쓰기좋게 만들어둔 형태

 

 

3.

C# delegate는 C/C++의 함수 포인터와 비슷한 개념으로 메서드 파라미터와 리턴 타입에 대한 정의를 한 후, 동일한 파라미터와 리턴 타입을 가진 메서드를 서로 호환해서 불러 쓸 수 있는 기능이다.
예를 들면, 아래 RunDelegate 델리게이트는 입력 파라미터가 int 하나이고 리턴 값이 없는 메서드를 가리킨다. RunThis() 메서드와 RunThat()메서드는 모두 int 파라미터 하나에 리턴 값이 없는 메서드이므로, RunDelegate의 함수 형식(prototype)과 맞으므로 이 delegate를 사용할 수 있다. 

 

 

예시.

버튼을 누르면 월드내 생성되는 오브젝트 전체가 죽는다고 가정했을 때
이벤트핸들링 없이 처리하면, 버튼이 눌렸을 시점을 IF문 등으로 체크하여 
모든 오브젝트를 돌며 죽는 처리를 해야함.

foreach(WorldInObject obj in ..) 
    obj.die(); 


그러나 델리게이트를 사용하면, 이것에 대한 코드를 안짜도 된다. 
모든 오브젝트의 어미에 미리 void OnButtonPressed(){ this.die(); } 를 선언하고 관장하는쪽에 등록 해두기만하면 전혀 호출할 필요가 없다.
왜냐하면, 버튼이 눌렸을 경우 버튼을 관장하는 매니저에서 OnButtonPressed를 자동으로 호출할 것이기 때문이다.

 

출처 : http://devkorea.co.kr/bbs/board.php?bo_table=m03_qna&wr_id=36068

 

데브코리아

한국 게임개발자 커뮤니티

devkorea.co.kr

 

 

 

컴퓨터에 나오는 화면을 캡처하여 프로그램에 나타내는 프로그램이다.

 

원리는 간단하다.

1. 0.1초마다 사진을 찍듯 캡쳐를 한다.

2. WinForm의 Picture box에 띄워준다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.IO;
 
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        Size sz;
        Bitmap bitmap;
        Graphics graphics;
        Thread thread;
        MemoryStream ms;
        byte[] buf;
 
        public Form1()
        {
            InitializeComponent();
 
            graphics = Graphics.FromImage(bitmap);
            thread = new Thread(Capture_Thread);
            ms = new MemoryStream();
        }
 
        public void Capture_Thread()
        {
            while (true)
            {
                graphics.CopyFromScreen(0000, sz);
 
                try
                {
                    bitmap.Save("x2.jpg"ImageFormat.Jpeg);
                    bitmap.Save(ms, ImageFormat.Jpeg);
                    buf = ms.ToArray();
                }
                catch(Exception e)
                {
                    MessageBox.Show(e.StackTrace);
                }
 
                pictureBox1.ImageLocation = "x2.jpg";
                Thread.Sleep(100);
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            if (!thread.IsAlive)
            thread.Start();
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

 

최종 목표는 이미지를 Byte로 변환하여 TCP 통신하는 것이다.

그리고 현 상태의 문제점은 초당 10 프레임이라는 것.

1. 위와 같이 글꼴 파일을 하나 준비하자.

 

 

 

2. 위와 같이 프로젝트를 만들어 글꼴 파일을 추가하자

속성에서 출력 디렉터리에 복사 값을 '새 버전이면 복사' 로 변경

 

 

 

3. using System.Drawing.Text 상단에 명시

font 객체 생성 및 폰트 파일 추가 -> 폰트 대입 

 

 

어때요. 참 쉽죠?

 

이 프로그램을 만들 때 작성한 클래스다.

개요는 이렇다.

 

1. 복사 대상 폴더를 선택한다.

2. 복사할 폴더를 선택한다.

3. 폴더에 있는 파일들중에 바꿀 텍스트와 원래 텍스트를 적는다.

4. 실행한다.

5. 파일들중 바뀐 항목들을 확인한다.

 

디렉터리 및 파일을 관리하는 부분을 정리

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
        /****************************************************/
        /*                  변수 선언 부분                    */
        /****************************************************/
        private String m_sOriginPath, m_sTargetPath;
        private String m_sOriginText, m_sRewriteText;
        private DirectoryInfo m_dOriginDirInfo;
        private DirectoryInfo m_dTargetDirInfo;
 
        /****************************************************/
        /*        COPY할 폴더 경로에 중복 파일 체크 및 묻기     */
        /****************************************************/
 
        public bool m_CopyReady()
        {
            bool delFlag = false;
            foreach (var OriginFile in m_dOriginDirInfo.GetFiles())
            {
                foreach (var TargetFile in m_dTargetDirInfo.GetFiles())
                {
                    if (OriginFile.Name.Equals(TargetFile.Name))
                    {
                        if (delFlag)
                        {
                            TargetFile.Delete();
                        }
                        else
                        {
                            if (MessageBox.Show("중복된 이름의 파일이 있습니다.\r삭제후 복사합니다",
                                     "입력 취소", MessageBoxButtons.YesNo) == DialogResult.Yes)
                            {
                                TargetFile.Delete();
                                delFlag = true;
                            }
                            else
                            {
                                MessageBox.Show("실행을 취소했습니다.");
                                return false;
                            }
                        }
                    }
                }
            }
            return true;
        }
 
        /****************************************************/
        /*     파일을 한줄씩 읽어 텍스트 검사 후 수정, 파일 쓰기  */
        /****************************************************/
 
        public void m_CopyFiles(String fileName)
        {
            String[] OriginTextLine = System.IO.File.ReadAllLines(
                @m_sOriginPath + "\\" + fileName);
            StreamWriter TargetOutputFile = new StreamWriter(
                @m_sTargetPath + "\\" + fileName);
            if (OriginTextLine.Length > 0)
            {
                for (int i = 0; i < OriginTextLine.Length; i++)
                {
                    OriginTextLine[i] = OriginTextLine[i].Replace(
                        m_sOriginText, m_sRewriteText);
                    
                    TargetOutputFile.WriteLine(OriginTextLine[i]);
                }
            }
            TargetOutputFile.Close();
        }
 
cs

 

MainForm.cs

RewriteCopy.exe

RewriteCopy.cs

 

+ Recent posts