[C#] 텍스트 에디터(윈도우 메모장) 만들기 3
2024. 2. 4. 00:00ㆍ[C#]/[C# 윈폼] 혼자해보는 윈도우 메모장 만들기
오늘은 "파일" 메뉴의 1. 새 창 2. 열기 3. 다른 이름으로 저장 4. 인쇄 기능을 구현해볼 것이다.
1. 새 창
private void NewMemoToolTip_Click(object sender, EventArgs e)
{
// 새 창을 만들기 위해 메모장의 복사본을 생성
메모장 newMemo = new 메모장();
newMemo.Show();
}
- 새로운 객체를 생성해서 보여준다.
2. 열기
private void OpenToolTip_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;
}
}
//OpenFileDialog 호출(.txt text 파일만 열기)
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "텍스트 파일 (*.txt)|*.txt|모든 파일 (*.*)|*.*";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
currentFilePath = openFileDialog.FileName;
MyTextArea.Text = File.ReadAllText(currentFilePath);
isTextChanged = false;
}
}
- 우선 현재 메모장에 변경사항이 있으면 저장 여부를 받고 저장 로직 or 저장안함 로직을 실행한다.
- 이후 OpenFileDialog를 이용하여 .txt (text)파일을 검색하는 다이얼로그를 호출해준다.
- OpenFileDialog에서 읽어온 파일을 Path에 넣어주고 해당 파일의 텍스트를 읽어와서 TextArea에 뿌려준다.
- 해당 로직이 완료되면 isTextChanged를 false로 변경해준다.
3. 다른 이름으로 저장
private void DnameSaveToolTip_Click(object sender, EventArgs e)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "텍스트 파일 (*.txt)|*.txt|모든 파일 (*.*)|*.*";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
currentFilePath = saveFileDialog.FileName;
SaveFile();
}
}
- saveFileDialog를 새로 열어주고 파일을 저장해주면 된다.
4. 인쇄 기능
private void PrintToolTip_Click(object sender, EventArgs e)
{
PrintDialog printDialog = new PrintDialog();
printDialog.Document = new PrintDocument();
if (printDialog.ShowDialog() == DialogResult.OK)
{
printDialog.Document.PrintPage += new PrintPageEventHandler(PrintDocument_PrintPage);
printDialog.Document.Print();
}
}
// 프린트할 때 호출되는 이벤트 핸들러
private void PrintDocument_PrintPage(object sender, PrintPageEventArgs e)
{
Font font = new Font("Arial", 12);
e.Graphics.DrawString(MyTextArea.Text, font, Brushes.Black, 10, 10);
}
전체 코드
using Microsoft.VisualBasic;
using System.Drawing.Printing;
namespace MyTextEditor
{
public partial class 메모장 : Form
{
private string currentFilePath = string.Empty;
private bool isTextChanged = false;
public 메모장()
{
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+Shift+N)
private void NewMemoToolTip_Click(object sender, EventArgs e)
{
// 새 창을 만들기 위해 Form1의 복사본을 생성
메모장 newMemo = new 메모장();
newMemo.Show();
}
//열기(Ctrl+O)
private void OpenToolTip_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;
}
}
//OpenFileDialog 호출(.txt text 파일만 열기)
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "텍스트 파일 (*.txt)|*.txt|모든 파일 (*.*)|*.*";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
currentFilePath = openFileDialog.FileName;
MyTextArea.Text = File.ReadAllText(currentFilePath);
isTextChanged = false;
}
}
// 저장(Ctrl+S)
private void SaveToolTip_Click(object sender, EventArgs e)
{
SaveFile();
}
//다른 이름으로 저장(Ctrl+Shift+S)
private void DnameSaveToolTip_Click(object sender, EventArgs e)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "텍스트 파일 (*.txt)|*.txt|모든 파일 (*.*)|*.*";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
currentFilePath = saveFileDialog.FileName;
SaveFile();
}
}
//페이지 설정
private void PageSettingToolTip_Click(object sender, EventArgs e)
{
}
//인쇄(Ctrl+P)
private void PrintToolTip_Click(object sender, EventArgs e)
{
PrintDialog printDialog = new PrintDialog();
printDialog.Document = new PrintDocument();
if (printDialog.ShowDialog() == DialogResult.OK)
{
printDialog.Document.PrintPage += new PrintPageEventHandler(PrintDocument_PrintPage);
printDialog.Document.Print();
}
}
#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;
}
// 프린트할 때 호출되는 이벤트 핸들러
private void PrintDocument_PrintPage(object sender, PrintPageEventArgs e)
{
Font font = new Font("Arial", 12);
e.Graphics.DrawString(MyTextArea.Text, font, Brushes.Black, 10, 10);
}
#endregion
}
}
반응형
'[C#] > [C# 윈폼] 혼자해보는 윈도우 메모장 만들기' 카테고리의 다른 글
[C#] 텍스트 에디터(윈도우 메모장) 만들기 6 (0) | 2024.02.06 |
---|---|
[C#] 텍스트 에디터(윈도우 메모장) 만들기 5 (1) | 2024.02.05 |
[C#] 텍스트 에디터(윈도우 메모장) 만들기 4 (0) | 2024.02.04 |
[C#] 텍스트 에디터(윈도우 메모장) 만들기 2 (0) | 2024.02.02 |
[C#] 텍스트 에디터(윈도우 메모장) 만들기 1 (0) | 2024.02.01 |