Options에서 설정한 정보를 Main에 있는 textCtrl에게 적용하기 위해서 정보를 주고 받아야되는데.
여기서 간단하게 이벤트를 주고 받는 방법이 있다.
간단한 이벤트를 정의 하기 위해서는
1
|
wxDECLARE_EVENT(MY_CUSTOM_EVENT_TYPE, wxCommandEvent);
|
cs |
이 '매크로'를 사용한다.
wxOptions.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
|
#pragma once
#include <wx/wx.h>
#include <wx/combobox.h>
#include <wx/fontenum.h>
#include <wx/sizer.h>
#include <wx/event.h>
#ifndef __WX_WIDGETS_OPTION_DIALOG_H__
#define __WX_WIDGETS_OPTION_DIALOG_H__
// 사용자 정의 이벤트 타입 정의
wxDECLARE_EVENT(wxEVT_COMMAND_MY_CUSTOM_EVENT, wxCommandEvent);
// ID 값 정의
enum
{
ID_Options = wxID_HIGHEST + 1 // 사용자 정의 ID
};
class wxOptionDialog : public wxDialog
{
public:
wxOptionDialog(wxWindow* parent, wxWindowID id, const wxString& title,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_DIALOG_STYLE);
private:
void OnOkButtonClicked(wxCommandEvent& evnt);
};
#endif
|
cs |
wxOptions.cpp
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
|
#include <wx/wx.h>
#include "wxOptionsDialog.h"
// 사용자 정의 이벤트 타입 구현
wxDEFINE_EVENT(wxEVT_COMMAND_MY_CUSTOM_EVENT, wxCommandEvent);
wxOptionDialog::wxOptionDialog(wxWindow* parent, wxWindowID id, const wxString& title,
const wxPoint& pos,
const wxSize& size,
long style)
: wxDialog(parent, id, title, pos, size, style) {
// 컨트롤을 담을 메인 사이저 생성
wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
// 설정 대화 상자의 내용을 여기에 구성
// 예: 설정 옵션을 위한 컨트롤 추가
wxStaticText* staticText = new wxStaticText(this, wxID_ANY, "Font Family", wxPoint(20, 20), wxDefaultSize);
mainSizer->Add(staticText, 0, wxALL, 10);
// 콤보박스 생성 및 옵션 추가
wxComboBox* comboBox = new wxComboBox(this, wxID_ANY, "", wxPoint(20, 50), wxSize(150, -1));
// 사용 가능한 폰트 패밀리 목록을 가져옵니다.
wxArrayString fontFamilies = wxFontEnumerator::GetFacenames(wxFONTENCODING_SYSTEM, false);
// 콤보박스에 폰트 패밀리를 추가합니다. foreach문 사용.
for (const wxString& fontFamily : fontFamilies) {
comboBox->Append(fontFamily);
}
mainSizer->Add(comboBox, 0, wxALL | wxEXPAND, 10);
// OK 및 Cancel 버튼 추가
wxSizer* buttonSizer = CreateStdDialogButtonSizer(wxOK | wxCANCEL);
mainSizer->Add(buttonSizer, 0, wxALL | wxCENTER, 10);
// 메인 사이저를 대화 상자에 설정
SetSizer(mainSizer);
mainSizer->SetSizeHints(this); // 이 호출은 대화 상자가 최소 크기로 축소되지 않도록 합니다.
// 이벤트 처리기 등록
Bind(wxEVT_BUTTON, &wxOptionDialog::OnOkButtonClicked, this, wxID_OK);
}
void wxOptionDialog::OnOkButtonClicked(wxCommandEvent& event)
{
// 사용자 정의 이벤트 생성
wxCommandEvent myEvent(wxEVT_COMMAND_MY_CUSTOM_EVENT);
myEvent.SetString("여기에 정보를 설정"); // 필요한 정보를 이벤트와 함께 전달
// 메인 윈도우에 이벤트 전달
wxPostEvent(GetParent(), myEvent);
// 다이얼로그 닫기
EndModal(wxID_OK);
}
|
cs |
이렇게 하면, 메인 윈도우인 wxMain.cpp에 이벤트를 전달하여, 정보를 전송할 수 있다.
그리고, 이 이벤트를 받기 위해서 Binding을 해줘야하는데.
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
|
#pragma once
#include "wx/wx.h"
#include <wx/filedlg.h>
#include <wx/textctrl.h>
#include <wx/splitter.h>
// 파일을 읽어 들이기 위한 용도.
#include <fstream>
#include <sstream>
#include "wxOptionsDialog.h"
enum
{
ID_QUIT,
};
enum {
MY_EVENT_ID = 10001,
};
// ID 값 정의
enum
{
ID_Settings_Menu = 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* textControl;
void OnOpen(wxCommandEvent& event);
void OnSave(wxCommandEvent& event);
void OnButtonClick(wxCommandEvent& event);
// 세팅 창을 띄우기 위한 메소드
void OnSettings(wxCommandEvent& event);
// 이벤트를 받기 위한 메소드
void OnMyCustomEvent(wxCommandEvent& event);
};
|
cs |
wxMain.cpp
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#include "wxMain.h"
wxIMPLEMENT_APP(MyApp);
bool MyApp::OnInit()
{
MyFrame* frame = new MyFrame("Serial Graph");
frame->Show(true);
return true;
}
MyFrame::MyFrame(const wxString& title)
: wxFrame(NULL, wxID_ANY, title)
{
wxMenu* menuFile = new wxMenu;
menuFile->Append(wxID_OPEN, "&Open\tCtrl-O", "Open a file");
menuFile->Append(wxID_SAVE, "&Save\tCtrl-S", "Save the file");
menuFile->AppendSeparator();
menuFile->Append(ID_QUIT, "E&xit\tAlt-X", "프로그램 종료");
wxMenu* menuOptions = new wxMenu;
menuOptions->Append(ID_Options, "&Options", "Options Setting");
wxMenuBar* menuBar = new wxMenuBar;
menuBar->Append(menuFile, "&File");
menuBar->Append(menuOptions, "&Options");
SetMenuBar(menuBar);
textControl = new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
// sizer를 생성하여 텍스트 컨트롤의 크기를 조정합니다.
wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
sizer->Add(textControl, 1, wxEXPAND | wxALL, 0); // wxEXPAND는 컨트롤이 sizer의 가능한 모든 공간을 차지하도록 합니다. 1은 비율을 의미하며, 이 경우 다른 컨트롤이 없으므로 전체 크기를 차지합니다.
// 프레임에 sizer를 설정합니다.
this->SetSizer(sizer);
this->Layout(); // sizer를 강제로 다시 계산하여 적용합니다.
// 폰트 설정
wxFont* font = new wxFont(16, wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD);
textControl->SetFont(*font);
CreateStatusBar();
SetStatusText("Ready");
// 이벤트 핸들러 연결
Bind(wxEVT_MENU, &MyFrame::OnQuit, this, ID_QUIT);
Bind(wxEVT_MENU, &MyFrame::OnOpen, this, wxID_OPEN);
Bind(wxEVT_MENU, &MyFrame::OnSave, this, wxID_SAVE);
Bind(wxEVT_MENU, &MyFrame::OnSettings, this, ID_Options);
// 이벤트 처리기 등록
Bind(wxEVT_COMMAND_MY_CUSTOM_EVENT, &MyFrame::OnMyCustomEvent, this);
}
void MyFrame::OnQuit(wxCommandEvent& event)
{
Close(true);
}
void MyFrame::OnOpen(wxCommandEvent& event)
{
wxFileDialog openFileDialog(this, _("Open TXT file"), "", "",
"TXT files (*.txt)|*.txt", wxFD_OPEN | wxFD_FILE_MUST_EXIST);
if (openFileDialog.ShowModal() == wxID_CANCEL)
return; // 사용자가 취소했을 때
std::ifstream file(openFileDialog.GetPath().ToStdString());
// 파일을 열고 텍스트 컨트롤에 내용을 로드합니다.
if (textControl->LoadFile(openFileDialog.GetPath())) {
std::stringstream buffer;
buffer << file.rdbuf(); // 파일의 내용을 buffer에 읽어 들입니다.
file.close(); // 파일을 닫습니다.
// textControl의 내용을 갱신합니다.
textControl->SetValue(buffer.str());
//textControl->SetLabelText(buffer.str());
// 타이틀을 열린 파일의 이름으로 설정합니다.
SetTitle(openFileDialog.GetFilename());
}
else {
wxMessageBox("Cannot open File!", "Error", wxOK | wxICON_ERROR);
}
}
void MyFrame::OnSave(wxCommandEvent& event)
{
wxFileDialog saveFileDialog(this, _("Save TXT file"), "", "",
"TXT files (*.txt)|*.txt", wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
if (saveFileDialog.ShowModal() == wxID_CANCEL)
return; // 사용자가 취소했을 때
// 현재 텍스트 컨트롤의 내용을 파일에 저장합니다.
textControl->SaveFile(saveFileDialog.GetPath());
}
void MyFrame::OnSettings(wxCommandEvent& event)
{
wxOptionDialog dialog(this, wxID_ANY, "Settings");
dialog.ShowModal();
//if (dialog.ShowModal() == wxID_OK)
//{
// // 사용자가 설정을 변경하고 OK를 클릭했을 때의 처리
// SetStatusText("Settings Updated");
//}
}
// 이벤트 처리 함수 구현
void MyFrame::OnMyCustomEvent(wxCommandEvent& event)
{
wxString info = event.GetString();
// 이벤트와 함께 전달된 정보 처리
wxMessageBox(info, "이벤트 정보", wxOK | wxICON_INFORMATION);
}
|
cs |
이렇게 하면, OnMyCustomEvent라는 함수로 사용자가 적용한 이벤트의 정보가 오가게 된다.
'프로그래밍 > wxWidgets' 카테고리의 다른 글
[wxWidgets] Font 변경하는 창으로 수정하기. (0) | 2024.02.09 |
---|---|
[wxWidgets] Custom Event을 제작하기. (0) | 2024.02.09 |
[wxWidgets] Sizer을 추가하여 깔끔하게 보이게하기. (0) | 2024.02.08 |
[wxWidgets] 콤보박스에서 현재 컴퓨터의 FontFamily을 가지고 오기. (0) | 2024.02.07 |
[wxWidgets] 콤보박스 추가하기. (0) | 2024.02.07 |