본문 바로가기
📁 [4] 개발자 정보 & 코드 노트/C#

C# Windows Forms 강의 54편: RichTextBox를 활용한 간단한 메모장 애플리케이션 제작

by wawManager 2025. 3. 29.

반응형

 

1. 강의 개요

이번 강의에서는 RichTextBox 컨트롤을 활용하여 간단한 메모장(Notepad) 애플리케이션을 제작합니다.
파일을 열고, 내용을 편집하며, 저장할 수 있는 기능을 구현합니다.
또한 글꼴(Font) 변경텍스트 색상(Color) 변경 기능을 추가하며, 단축키(Ctrl+S, Ctrl+O)를 지원합니다.


2. 학습 목표

  • RichTextBox 컨트롤 사용법 이해
  • OpenFileDialogSaveFileDialog를 활용한 파일 입출력 구현
  • FontDialogColorDialog를 이용한 글꼴 및 색상 변경 기능 구현
  • 단축키(Ctrl+S, Ctrl+O)를 설정하여 사용자 편의성 향상

3. 기능 요구사항

필수 기능

1️⃣ 파일 열기: OpenFileDialog를 통해 텍스트 파일 열기
2️⃣ 파일 저장: SaveFileDialog를 사용하여 텍스트 파일 저장
3️⃣ 글꼴 변경: FontDialog를 통해 텍스트 글꼴 변경
4️⃣ 텍스트 색상 변경: ColorDialog를 통해 텍스트 색상 변경
5️⃣ 단축키 지원: Ctrl+S(저장), Ctrl+O(열기)


4. 실습: 메모장 애플리케이션 구현

1️⃣ 폼 구성

  • 폼(Form) 이름: Form1
  • 컨트롤 배치

컨트롤 타입 이름 텍스트 위치 크기

MenuStrip menuStrip (없음) 상단 (400 x 30)
RichTextBox rtbEditor (없음) 폼의 중앙 (380 x 250)

2️⃣ 메뉴 구성 (MenuStrip)

메뉴 하위 메뉴 기능

파일 열기(Open) OpenFileDialog를 사용해 파일 열기
  저장(Save) SaveFileDialog를 사용해 파일 저장
  종료(Exit) 애플리케이션 종료
서식 글꼴(Font) FontDialog로 글꼴 변경
  텍스트 색상(Color) ColorDialog로 텍스트 색상 변경

3️⃣ 코드 작성

Form1.cs

using System;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApp_Notepad
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            InitializeEvents();
        }

        // 이벤트 연결
        private void InitializeEvents()
        {
            openToolStripMenuItem.Click += OpenFile;
            saveToolStripMenuItem.Click += SaveFile;
            exitToolStripMenuItem.Click += (s, e) => Application.Exit();
            fontToolStripMenuItem.Click += ChangeFont;
            colorToolStripMenuItem.Click += ChangeColor;

            // 단축키 설정
            this.KeyPreview = true;
            this.KeyDown += Form1_KeyDown;
        }

        // 파일 열기
        private void OpenFile(object sender, EventArgs e)
        {
            using (OpenFileDialog openFileDialog = new OpenFileDialog())
            {
                openFileDialog.Filter = "텍스트 파일 (*.txt)|*.txt|모든 파일 (*.*)|*.*";

                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    rtbEditor.Text = File.ReadAllText(openFileDialog.FileName);
                }
            }
        }

        // 파일 저장
        private void SaveFile(object sender, EventArgs e)
        {
            using (SaveFileDialog saveFileDialog = new SaveFileDialog())
            {
                saveFileDialog.Filter = "텍스트 파일 (*.txt)|*.txt";

                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    File.WriteAllText(saveFileDialog.FileName, rtbEditor.Text);
                }
            }
        }

        // 글꼴 변경
        private void ChangeFont(object sender, EventArgs e)
        {
            using (FontDialog fontDialog = new FontDialog())
            {
                if (fontDialog.ShowDialog() == DialogResult.OK)
                {
                    rtbEditor.Font = fontDialog.Font;
                }
            }
        }

        // 텍스트 색상 변경
        private void ChangeColor(object sender, EventArgs e)
        {
            using (ColorDialog colorDialog = new ColorDialog())
            {
                if (colorDialog.ShowDialog() == DialogResult.OK)
                {
                    rtbEditor.ForeColor = colorDialog.Color;
                }
            }
        }

        // 단축키 이벤트 처리
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Control && e.KeyCode == Keys.S) // Ctrl + S
            {
                SaveFile(sender, e);
            }
            else if (e.Control && e.KeyCode == Keys.O) // Ctrl + O
            {
                OpenFile(sender, e);
            }
        }
    }
}

Form1.Designer.cs

namespace WindowsFormsApp_Notepad
{
    partial class Form1
    {
        private System.ComponentModel.IContainer components = null;
        private MenuStrip menuStrip;
        private RichTextBox rtbEditor;
        private ToolStripMenuItem fileToolStripMenuItem;
        private ToolStripMenuItem openToolStripMenuItem;
        private ToolStripMenuItem saveToolStripMenuItem;
        private ToolStripMenuItem exitToolStripMenuItem;
        private ToolStripMenuItem formatToolStripMenuItem;
        private ToolStripMenuItem fontToolStripMenuItem;
        private ToolStripMenuItem colorToolStripMenuItem;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.menuStrip = new MenuStrip();
            this.fileToolStripMenuItem = new ToolStripMenuItem();
            this.openToolStripMenuItem = new ToolStripMenuItem();
            this.saveToolStripMenuItem = new ToolStripMenuItem();
            this.exitToolStripMenuItem = new ToolStripMenuItem();
            this.formatToolStripMenuItem = new ToolStripMenuItem();
            this.fontToolStripMenuItem = new ToolStripMenuItem();
            this.colorToolStripMenuItem = new ToolStripMenuItem();
            this.rtbEditor = new RichTextBox();

            this.menuStrip.Items.AddRange(new ToolStripItem[] {
                this.fileToolStripMenuItem,
                this.formatToolStripMenuItem
            });
            this.fileToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] {
                this.openToolStripMenuItem,
                this.saveToolStripMenuItem,
                this.exitToolStripMenuItem
            });
            this.formatToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] {
                this.fontToolStripMenuItem,
                this.colorToolStripMenuItem
            });

            // 메뉴 텍스트 설정
            this.fileToolStripMenuItem.Text = "파일";
            this.openToolStripMenuItem.Text = "열기";
            this.saveToolStripMenuItem.Text = "저장";
            this.exitToolStripMenuItem.Text = "종료";
            this.formatToolStripMenuItem.Text = "서식";
            this.fontToolStripMenuItem.Text = "글꼴";
            this.colorToolStripMenuItem.Text = "텍스트 색상";

            // RichTextBox 설정
            this.rtbEditor.Dock = DockStyle.Fill;

            // Form 설정
            this.ClientSize = new System.Drawing.Size(400, 300);
            this.Controls.Add(this.rtbEditor);
            this.Controls.Add(this.menuStrip);
            this.MainMenuStrip = this.menuStrip;
            this.Text = "간단한 메모장";
        }
    }
}

5. 실행 결과

1️⃣ 초기 화면

  • 빈 RichTextBox와 상단 메뉴가 보임

2️⃣ 파일 열기

  • "파일 → 열기" 클릭 → 텍스트 파일 선택 → 내용 표시

3️⃣ 파일 저장

  • "파일 → 저장" 클릭 → 텍스트 파일 저장

4️⃣ 글꼴/색상 변경

  • "서식 → 글꼴/텍스트 색상" 선택 → 적용

5️⃣ 단축키 작동

  • Ctrl+S → 파일 저장
  • Ctrl+O → 파일 열기

6. 주요 개념 요약

  • RichTextBox: 텍스트 입력 및 편집 컨트롤
  • OpenFileDialog/SaveFileDialog: 파일 입출력 대화 상자
  • FontDialog/ColorDialog: 글꼴 및 색상 변경 대화 상자
  • 단축키 핸들링: KeyDown 이벤트로 단축키 처리
반응형