[C#] 텍스트 에디터(윈도우 메모장) 만들기 2

2024. 2. 2. 19:19[C#]/[C# 윈폼] 혼자해보는 윈도우 메모장 만들기

오늘은 1. 시간 입력 2. 파일 저장 3. 새 파일 기능을 구현해볼 것이다.

 

 


 

1. 시간 입력 기능

  • 메모장에 보면 편집 -> 시간/날짜 라는 기능이 있다.
  • 해당 메뉴를 클릭하거나 F5를 누르면 시간이 나타난다.
//시간 입력(F5)
private void TimeTextToolTip_Click(object sender, EventArgs e)
{
    //현재 시간 추가
    MyTextArea.Text += DateTime.Now.ToString();
    //커서 맨 뒤로 이동
    MyTextArea.SelectionStart = MyTextArea.Text.Length;
    MyTextArea.SelectionLength = 0;
    MyTextArea.Focus();
}
  • 현재 Text뒤에  DateTime.Now를 사용해서 현재 날짜/시간을 추가해준다.
  • 그냥 시간만 추가하면 커서가 맨 앞으로 이동한다. 고치기 위해 포커싱 하는 부분을 추가해줬다.

 

2. 파일 저장 기능

private void SaveToolTip_Click(object sender, EventArgs e)
{
    SaveFile();
}

 

private void SaveFile()
{
    if (string.IsNullOrEmpty(currentFilePath))
    {
        // 파일 경로가 없는 경우 SaveFileDialog 표시
        SaveFileDialog saveFileDialog = new SaveFileDialog();
        saveFileDialog.Filter = "텍스트 파일 (*.txt)|*.txt|모든 파일 (*.*)|*.*";
        saveFileDialog.FilterIndex = 1; //필터 기본 값

        if (saveFileDialog.ShowDialog() == DialogResult.OK)
        {
            currentFilePath = saveFileDialog.FileName;
        }
        else
        {
            return; // 사용자가 취소한 경우 저장 중단
        }
    }

    try
    {
        // 텍스트 에디터의 내용을 파일에 저장
        File.WriteAllText(currentFilePath, MyTextArea.Text);
        isTextChanged = false; // 저장 후 변경되지 않은 상태로 표시
    }
    catch (Exception ex)
    {
        MessageBox.Show($"파일 저장 중 오류가 발생했습니다: {ex.Message}", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
  • SaveFileDialog를 호출한다. 
  • 사용자가 저장 확인을 누르면 currentFilePath에 있는 이름을 저장해준 후 isTextChanged를 false로 설정한다.

 

3. 새 파일 기능

 private void NewFileToolTip_Click(object sender, EventArgs e)
 {
     if (isTextChanged)
     {
         // 파일이 변경되었을 경우 저장 여부 확인
         DialogResult result = MessageBox.Show("변경된 내용을 저장하시겠습니까?", "저장 확인", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

         if (result == DialogResult.Yes)
         {
             // 저장
             SaveFile();
         }
         else if (result == DialogResult.Cancel)
         {
             // 취소
             return;
         }
     }

     // 새 파일 초기화
     MyTextArea.Text = string.Empty;
     currentFilePath = string.Empty;
     isTextChanged = false;
 }
  • isTextChanged가 True면 저장 기능을 활성화 시키고
  • 저장 후에는 다시 false로 만들어준다.
 private void MyTextArea_TextChanged(object sender, EventArgs e)
 {
     isTextChanged = true;
 }
  • TextArea의 변화가 생기면 isTextChanged를 True로 만들어준다.

 


전체 코드

using Microsoft.VisualBasic;

namespace MyTextEditor
{
    public partial class Form1 : Form
    {

        private string currentFilePath = string.Empty;
        private bool isTextChanged = false;

        public Form1()
        {
            InitializeComponent();
        }

        #region 파일
        // 새 파일(Ctrl+N)
        private void NewFileToolTip_Click(object sender, EventArgs e)
        {
            if (isTextChanged)
            {
                // 파일이 변경되었을 경우 저장 여부 확인
                DialogResult result = MessageBox.Show("변경된 내용을 저장하시겠습니까?", "저장 확인", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

                if (result == DialogResult.Yes)
                {
                    // 저장
                    SaveFile();
                }
                else if (result == DialogResult.Cancel)
                {
                    // 취소
                    return;
                }
            }

            // 새 파일 초기화
            MyTextArea.Text = string.Empty;
            currentFilePath = string.Empty;
            isTextChanged = false;
        }

        // 저장(Ctrl+S)
        private void SaveToolTip_Click(object sender, EventArgs e)
        {
            SaveFile();
        }


        //프린트(Ctrl+P)
        private void PrintToolTip_Click(object sender, EventArgs e)
        {
        }
        #endregion


        #region 편집
        //시간 입력(F5)
        private void TimeTextToolTip_Click(object sender, EventArgs e)
        {
            //현재 시간 추가
            MyTextArea.Text += DateTime.Now.ToString();
            //커서 맨 뒤로 이동
            MyTextArea.SelectionStart = MyTextArea.Text.Length;
            MyTextArea.SelectionLength = 0;
            MyTextArea.Focus();
        }

        #endregion



        #region 메소드들
        // 실제 파일 저장 로직
        private void SaveFile()
        {
            if (string.IsNullOrEmpty(currentFilePath))
            {
                // 파일 경로가 없는 경우 SaveFileDialog 표시
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.Filter = "텍스트 파일 (*.txt)|*.txt|모든 파일 (*.*)|*.*";
                saveFileDialog.FilterIndex = 1;

                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    currentFilePath = saveFileDialog.FileName;
                }
                else
                {
                    return; // 사용자가 취소한 경우 저장 중단
                }
            }

            try
            {
                // 텍스트 에디터의 내용을 파일에 저장
                File.WriteAllText(currentFilePath, MyTextArea.Text);
                isTextChanged = false; // 저장 후 변경되지 않은 상태로 표시
            }
            catch (Exception ex)
            {
                MessageBox.Show($"파일 저장 중 오류가 발생했습니다: {ex.Message}", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // 텍스트 에디터 내용 변경 여부 확인
        private void MyTextArea_TextChanged(object sender, EventArgs e)
        {
            isTextChanged = true;
        }
        #endregion


    }
}

 


반응형