일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Xamarin
- 게임의 심리학
- 롤
- HGC
- c#
- lck
- .NET
- 압축프로그램
- 리그오브레전드
- 그림판
- 탐색기
- 리뷰
- 돋보기
- 음악플레이어
- 히어로즈오브더스톰
- Chromium Embedded Framework
- 메모장
- lol
- 히오스
- winmm.dll
- OAuth 2.0
- Facebook developer
- ogn
- NuGet
- Today
- Total
1인 콘텐츠 개발실
[c#] 간단한 유틸을 만들어보자! - [DIY 메모장] 편 본문
해당 포스팅은 C#을 이용하여 간단한 유틸리티 프로그램을 개발하면서, 그 안에 쓰이는 라이브러리나 알고리즘(로직) 등을 다뤄보고 학습하는 포스팅입니다. 이 글을 통해 기존에 있던 프로그램과 비교하면서 해당 프로그램의 쓰임새, 동작 방식 등을 분석하거나 조금은 다른 관점으로 접근하여 생각해 보는것이 이 글과 앞으로 있을 포스팅의 목표입니다.
# 개요
이번에 다룰 유틸리티 프로그램은 [메모장]입니다. 메모장은 텍스트 파일(.txt) 파일을 생성하거나 기존에 있는것을 열어 그 내용을 볼 수 있고, 직접 텍스트 편집이 가능한 에디트 프로그램입니다. 최소한의 텍스트 편집 기능이 갖춰져 있고, 윈도우 운영체제의 기본 프로그램으로 설치되어 있기 때문에 언제든지 간편하게 사용할 수 있습니다.
메모장 이외에도 문서 에디터 프로그램은 여러가지 있으며, 각각의 프로그램은 저마다의 특색을 갖고 있습니다.
메모장보다 간편함을 더욱 극대화하여 평상시 바탕화면에 붙여놓듯이 사용하는 스티커 메모,
문서 서식을 자유자재로 편집할 수 있어 격식있는 문서를 작성하기 적합한 워드프로세서(아래아 한글, MS 워드),
프로그래밍을 위한 여러 종류의 코드 문서를 직관적으로 볼 수 있는 에디트플러스 등 등을 꼽을 수 있습니다.
에디트플러스 4.2 구동 모습
사용자들은 필요에 따라 이러한 에디터 프로그램들을 사용함에 따라 여러 기능이 추가되고, UI도 개선되면서 더욱 많은 에디터 프로그램이 개발되고 발전해왔습니다. 따라서 텍스트 파일 열기/편집/저장 외에도 여러 기능이 있겠지만, 기본 기능에 초점을 맞춰 [DIY 메모장]을 한번 만들어보도록 하겠습니다.
# [DIY 메모장] 기능
[DIY 메모장]은 문서 작성, 글꼴 바꾸기, .txt 파일 열기/저장, 문서 인쇄 기능이 구현되어 있습니다. 지금부터 그 기능들을 어떻게 구현하였는지 알려드리도록 하겠습니다.
문서 작성은 따로 코드 작성 필요없이, 윈폼 중에 TextBox를 배치하면 기본적인 편집이 가능합니다. 지금은 단순히 텍스트 입력 뿐만 아니라 글꼴을 변경해야 하므로 TextBox 대신 RichTextBox를 사용하였습니다. 글꼴을 적용하는 로직에 대해서는 일단 텍스트 파일 열기/저장을 설명한 후에 말씀드리겠습니다.
텍스트 파일을 열고 저장하는 부분은 OpenFileDialog/SaveFileDialog 클래스를 사용하여 간단하게 적용할 수 있습니다.
OpenFileDialog의 모습
Dialog는 대화 상자라고도 불리는데, Dialoig는 쉽게 말하면 메인이 되는 창 이외에 따로 창이 띄워져 정해진 역할을 수행한 뒤 종료되는 창으로 생각할 수 있습니다. 따라서 OpenFileDialog과 SaveFileDialog는 파일을 열고, 저장하는 역할을 할 수 있는 기본 윈폼으로 제공되는 Dialog들입니다.
[텍스트 파일 열기]
private void ToolStripMenu_Open_Click(object sender, EventArgs e) { OpenFileDialog fdOpen = new OpenFileDialog(); fdOpen.Filter = "Text Files|*.txt"; fdOpen.Title = "Select a Text File"; // Dialog에서 파일 열기 요청이 성공했을 때 할 처리 if (fdOpen.ShowDialog() == DialogResult.OK) { richTextBox1.Text = null; // 연속적으로 파일을 열 때 메모장 내용이 중복되지 않도록 하기 위함. string[] filelines = File.ReadAllLines(fdOpen.FileName); foreach (string s in filelines) { richTextBox1.Text += s + Environment.NewLine; } richTextBox1.SelectionStart = richTextBox1.Text.Length; // 텍스트 내용 끝에 커서를 놓음 } }
[텍스트 파일 저장]
private void ToolStripMenu_Save_Click(object sender, EventArgs e) { SaveFileDialog fdSave = new SaveFileDialog(); fdSave.FileName = "notepad1.txt"; fdSave.Filter = "Text File | *.txt"; // Dialog에서 파일 저장 요청이 성공했을 때 할 처리 if (fdSave.ShowDialog() == DialogResult.OK) { StreamWriter writer = new StreamWriter(fdSave.OpenFile()); writer.Write(richTextBox1.Text); // richTextBox1.Text의 내용을 writer(SaveFileDialog로 저장하는 파일)에 옮겨 씀. writer.Dispose(); writer.Close(); } }
OpenFileDialog를 이용하여 텍스트 파일을 여는데 성공하면 해당 파일의 내용을 읽어서 richTextBox1에 옮겨 출력합니다.
대개는 OpenFileDialog로 파일을 읽을때는 어떤 확장자의 파일을 읽게 될지 확정적이지 않기 때문에 Stream이나 StreamReader 클래스를 이용하여 파일을 읽어들입니다. 지금은 메모장이라는 프로그램 특성상 텍스트로 이뤄진 파일만 읽을 것이 확정적이기 때문에 위와 같이 단순히 string 배열로 직접 옮기도록 한번 처리해봤습니다. 물론 Filter를 통해 .txt 파일만 보여지게끔 적용해서 다른 확장자의 파일을 선택할 수 없도록 되어있습니다.
OpenFileDialog의 자세한 사용 방법은 msdn을 참고하시면 좋을 것 같습니다.
- OpenFileDialog 구성 요소를 사용하여 파일 열기 : https://msdn.microsoft.com/ko-kr/library/61097ykx(v=vs.110).aspx
반대로 텍스트 파일 저장시에는 정석적으로 StreamWriter를 통해 파일을 쓰도록 처리해봤습니다. 이외에도 여러 방법이 있을테니, 때에 따라 쉽고 편한것을 선택하셔서 사용하시길 바랍니다.
이어서 글꼴 바꾸기에 대해 살펴보면 다음과 같습니다.
[글꼴 바꾸기]
private void ToolStripMenu_Font_Click(object sender, EventArgs e) { FontDialog fontDialog = new FontDialog(); fontDialog.ShowColor = true; fontDialog.Font = richTextBox1.Font; // FontDialog를 열었을 때 현재 폰트와 색상이 어떤것인지 보여주기 위함. fontDialog.Color = richTextBox1.ForeColor; // Dialog에서 폰트 설정 요청이 성공했을 때 할 처리
if (fontDialog.ShowDialog() == DialogResult.OK) { richTextBox1.ForeColor = fontDialog.Color; richTextBox1.Font = fontDialog.Font; // richTextBox1.SelectionColor = fontDialog.Color; // 블럭 지정된 텍스트만 적용. // richTextBox1.SelectionFont = fontDialog.Font; // 블럭 지정된 텍스트만 적용. } }
글꼴은 FontDialog를 통해 기본적으로 폰트 종류와 크기 지정이 가능하며, fontDialog의 ShowColor 멤버 변수 값을 true로 함에 따라 색상도 수정할 수 있도록 처리했습니다. 지금은 기존의 메모장 처럼 글꼴을 바꾸면 전체 텍스트에 적용되도록 했지만, 만약 워드 프로세서 프로그램들 처럼 지정한 텍스트만 다른 글꼴과 색상을 처리하고 싶을 때는 14, 15번째줄의 구문처럼 SelectionColor, SelectionFont에 적용하시면 됩니다.
이제 마지막으로 작성한 문서를 직접 인쇄하는 로직을 설명하겠습니다. 이 역시 윈폼에서 제공하는 PrintDialog를 사용하면 손쉽게 구현할 수 있습니다.
[파일 인쇄하기]
private void ToolStripMenu_Print_Click(object sender, EventArgs e) { PrintDialog printDialog = new PrintDialog(); if (printDialog.ShowDialog() == DialogResult.OK) { printDocument1.Print(); } } private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) { string text = richTextBox1.Text; Font font = richTextBox1.Font; Brush brush = new SolidBrush(richTextBox1.ForeColor); e.Graphics.DrawString(text, font, brush, e.MarginBounds.Left, e.MarginBounds.Top); }
printDialog가 성공적으로 처리되었을 때 미리 윈폼으로 배치되어 있는 printDocument1를 이용하여 Print() 메서드를 호출합니다. Print가 수행될 때 어떻게 프린팅을 할지 printDocument1_PrintPage()의 로직을 따릅니다. 지금은 여백이나 출력 위치등의 페이지 설정 기능 없이 단순히 있는 그대로의 날것을 출력하도록 작성되어 있습니다.
# 완성 및 마무리
- [DIY 메모장] 소스 파일 : https://github.com/hyunil-stdlib/SimpleNotepad
(소스코드와 실행 파일(/Notepad/bin/Debug/Notepad.exe)을 받으실 수 있습니다.)
기존의 메모장도 위의 5가지 기능에서 크게 벗어나지 않았지만, 그 기능들이 좀 더 세밀하게 기능이 적용되어 있다는 점이 큰 차이점일 것입니다.
한 가지 예를 들면 기존의 메모장은 문서를 새로이 편집하게 되면 내용이 변경되었는지 변경되지 않았는지 체크합니다. 이 기능은 지금 [DIY 메모장]에는 없어 새로 편집했든, 편집하지 않았든 저장은 다른 이름으로 저장하도록 다이얼로그를 띄웁니다. 만약 이 기능을 추가한다고 한다면, 문서 내용을 변수로 저장하여 저장 버튼이나 종료 이벤트가 호출될 때 현재 내용과 미리 담아놓은 내용을 비교하는 식으로 구현 방법을 생각할 수 있을 듯합니다. (만약 변수를 text 통째로 string으로 저장한다면, 간단히 ==로 비교 가능하지 않을까 생각합니다.)
이번 [DIY 메모장] 포스팅은 이것으로 마치고, 다음에 올라오게 될 포스팅도 기대해주시면 감사하겠습니다.
# 참조
- 에디트플러스 홈페이지 : https://www.editplus.com/kr/index.html
- 마이크로소프트 Developer Network (msdn) : https://msdn.microsoft.com/ko-kr/library/618ayhy6.aspx
'개발&제작 > 프로그램' 카테고리의 다른 글
[c#] 간단한 유틸을 만들어보자! - [DIY 그림판] 편 (4) | 2017.04.14 |
---|---|
[c#] 간단한 유틸을 만들어보자! - [DIY 돋보기] 편 (1) | 2017.04.06 |
[c#] CEF를 이용한 페이스북 자동화 프로그램 (5) (3) | 2017.03.02 |
[c#] CEF를 이용한 페이스북 자동화 프로그램 (4) (0) | 2017.02.27 |
[c#] CEF를 이용한 페이스북 자동화 프로그램 (3) (2) | 2017.02.23 |