wxWidgets에서 열거나 저장한 후에 파일에서 저장을 매번 경로를 지정해줘야하는 문제점이 있다.
이 점을 개선하기 위해서 저장의 경로를 저장해놓아야 되는 경우가 생긴다.
경로를 저장하기 위해서 wxMain.h을 다음과 같이 수정한다.
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
#pragma once
#include "wx/wx.h"
#include <wx/filedlg.h>
#include <wx/textctrl.h>
#include <wx/splitter.h>
// Font Dialog
#include <wx/fontdlg.h>
// 파일을 읽어 들이기 위한 용도.
#include <fstream>
#include <sstream>
#include "wxOptionsDialog.h"
enum
{
ID_QUIT,
ID_WordWarp,
ID_FontSetting,
ID_StatusBar,
};
enum {
MY_EVENT_ID = 10001,
};
// 메뉴 항목 ID 정의
enum
{
ID_NEW_WINDOW = wxID_HIGHEST + 1 // 새 창을 위한 고유 ID
};
class MyApp : public wxApp
{
public:
virtual bool OnInit();
};
class MyFrame : public wxFrame
{
public:
MyFrame(const wxString& title);
void OnQuit(wxCommandEvent& event);
private:
wxTextCtrl* m_textControl;
// 현재 파일의 경로를 저장하는 변수
wxString m_currentFileName;
wxString m_currentFilePath;
//wxOptionDialog* m_dialog;
wxFont* m_font;
wxStatusBar* m_statusBar;
// 메뉴바 및 메뉴 변수.
wxMenuBar* m_menuBar;
wxMenu* m_menuFile;
wxMenu* m_menuFormat;
wxMenu* m_menuView;
void OnNew(wxCommandEvent& event);
void OnNewWindow(wxCommandEvent& event);
void OnOpen(wxCommandEvent& event);
void OnSave(wxCommandEvent& event);
void OnButtonClick(wxCommandEvent& event);
// Format 메뉴에 적용할 이벤트 핸들러
void OnToggleWordWrap(wxCommandEvent& event);
void OnFontSetting(wxCommandEvent& event);
// View 메뉴에 적용할 이벤트 핸들러
void OnToggleStatusBar(wxCommandEvent& event);
// 이벤트를 받기 위한 메소드
void OnMyCustomEvent(MyCustomEvent& event);
};
|
cs |
여기서 열어둔 파일들의 경로와 이름을 저장하기 위해서
wxString m_currentFileName; // 현재 파일 이름
wxString m_currentFilePath; // 현재 파일 경로
이 2개를 추가했다.
이 후에 wxMain.cpp에 있는 OnSave이라는 이벤트 핸들러를 다음과 같이 수정한다.
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
|
void MyFrame::OnSave(wxCommandEvent& event)
{
wxFileDialog saveFileDialog(this, _("Save TXT file"), "", "",
"TXT files (*.txt)|*.txt", wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
// 경로가 비어있는 경우엔.
if (m_currentFilePath.IsEmpty()) {
switch (saveFileDialog.ShowModal()) {
case wxID_CANCEL: {
return;
}
case wxID_OK: {
m_currentFileName = saveFileDialog.GetFilename();
// 세이브 및 적용이 완료했을 경우.
m_currentFilePath = saveFileDialog.GetPath();
break;
}
}
}
// 현재 텍스트 컨트롤의 내용을 파일에 저장합니다.
if (!m_textControl->SaveFile(m_currentFilePath)) {
// 현재 텍스트의 내용을 파일에 저장하지 못한다면.
wxMessageBox("Could Not save the File!", "Error", wxOK);
return;
}
wxString titleNames = m_currentFileName;
titleNames += " - Notepad";
// 타이틀을 열린 파일의 이름으로 설정합니다.
SetTitle(titleNames);
}
|
cs |
m_currentFilePath의 내용이 비어 있다면, 저장 경로를 받기 위해서 saveFileDialog.ShowModel을 하여, 경로를 제공 받게 한다.
OK을 눌렀을 경우에 saveFileDialog에 파일 이름과 파일 경로를 각각 m_currentFileName과 m_currentFilePath에 저장하도록 한다.
저장이 실패했을 경우엔 제대로 파일에 저장을 하지 못했다는 정보를 알려준다.
여기서 실패했을 경우에 다시 경로를 찾아 가야도록 해야되므로
지역 변수를 이용해서 적용하는 방법도 있다.
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
|
void MyFrame::OnSave(wxCommandEvent& event)
{
wxFileDialog saveFileDialog(this, _("Save TXT file"), "", "",
"TXT files (*.txt)|*.txt", wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
wxString saveFileName = m_currentFileName;
wxString saveFilePath = m_currentFilePath;
// 경로가 비어있는 경우엔.
if (m_currentFilePath.IsEmpty()) {
switch (saveFileDialog.ShowModal()) {
case wxID_CANCEL: {
return;
}
case wxID_OK: {
saveFileName = saveFileDialog.GetFilename();
// 세이브 및 적용이 완료했을 경우.
saveFilePath = saveFileDialog.GetPath();
break;
}
}
}
// 현재 텍스트 컨트롤의 내용을 파일에 저장합니다.
if (!m_textControl->SaveFile(saveFilePath)) {
// 현재 텍스트의 내용을 파일에 저장하지 못한다면.
wxMessageBox("Could Not save the File!", "Error", wxOK);
return;
}
m_currentFileName = saveFileName;
m_currentFilePath = saveFilePath;
wxString titleNames = m_currentFileName;
titleNames += " - Notepad";
// 타이틀을 열린 파일의 이름으로 설정합니다.
SetTitle(titleNames);
}
|
cs |
이 후에 Open을 했을 경우에 작동할 이벤트 핸들러를 적용해야한다.
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
|
void MyFrame::OnOpen(wxCommandEvent& event)
{
wxFileDialog openFileDialog(this, _("Open TXT file"), "", "",
"TXT files (*.txt)|*.txt", wxFD_OPEN | wxFD_FILE_MUST_EXIST);
wxString openFileName = m_currentFileName;
wxString openFilePath = m_currentFilePath;
switch (openFileDialog.ShowModal()) {
case wxID_OK: {
openFileName = openFileDialog.GetFilename();
// 세이브 및 적용이 완료했을 경우.
openFilePath = openFileDialog.GetPath();
break;
}
case wxID_CANCEL: {
return; // 사용자가 취소했을 때
}
}
std::ifstream file(openFilePath.ToStdString());
// 파일을 열고 텍스트 컨트롤에 내용을 로드합니다.
if (m_textControl->LoadFile(openFilePath)) {
std::stringstream buffer;
buffer << file.rdbuf(); // 파일의 내용을 buffer에 읽어 들입니다.
file.close(); // 파일을 닫습니다.
// textControl의 내용을 갱신합니다.
m_textControl->SetValue(buffer.str());
//textControl->SetLabelText(buffer.str());
m_currentFileName = openFileName;
m_currentFilePath = openFilePath;
wxString titleNames = m_currentFileName;
titleNames += " - Notepad";
// 타이틀을 열린 파일의 이름으로 설정합니다.
SetTitle(titleNames);
}
else {
wxMessageBox("Cannot open File!", "Error", wxOK | wxICON_ERROR);
}
}
|
cs |
이렇게 하면, 열었을때, 저장을 바로 적용할 수 있고,
저장 경로를 정했을 경우에 약간 수정하고 바로 저장을 누르면 적용이 가능해진다.
'프로그래밍 > wxWidgets' 카테고리의 다른 글
[wxWidgets] Text Control에서 시간과 날짜를 추가하기 (0) | 2024.02.14 |
---|---|
[wxWidgets] 다른 이름으로 저장 기능 구현 (1) | 2024.02.13 |
[wxWidgets] 상태바 On/Off 설정하기 (1) | 2024.02.12 |
[wxWidgets] 새 창 만들기 기능 구현하기. (1) | 2024.02.12 |
[wxWidgets] 새 글 기능 구현하기. (0) | 2024.02.11 |