폰트 처리하기 위한 창으로 변경해본다.
wxOptionsDialog.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
|
#pragma once
#include <wx/wx.h>
#include <wx/combobox.h>
#include <wx/fontenum.h>
#include <wx/sizer.h>
#include "wxMyCustomEvent.h"
#ifndef __WX_WIDGETS_OPTION_DIALOG_H__
#define __WX_WIDGETS_OPTION_DIALOG_H__
// 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);
void OnFontChange(wxCommandEvent& evnt);
void UpdatePreview();
wxComboBox* familyComboBox;
wxComboBox* styleComboBox;
wxComboBox* sizeComboBox;
wxTextCtrl* previewTextCtrl;
};
#endif
|
cs |
wxOptionsDialog.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
|
#include <wx/wx.h>
#include "wxOptionsDialog.h"
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);
// 설정 대화 상자의 내용을 여기에 구성
// 폰트 패밀리 선택 콤보박스
wxArrayString fontFamilies = wxFontEnumerator::GetFacenames();
familyComboBox = new wxComboBox(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, fontFamilies, wxCB_READONLY);
mainSizer->Add(new wxStaticText(this, wxID_ANY, wxT("폰트(E):")), 0, wxLEFT | wxTOP, 5);
mainSizer->Add(familyComboBox, 0, wxLEFT | wxEXPAND, 5);
// 폰트 스타일 선택 콤보박스
wxArrayString fontStyles;
fontStyles.Add("보통");
fontStyles.Add("기울임꼴");
fontStyles.Add("두껍게");
styleComboBox = new wxComboBox(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, fontStyles, wxCB_READONLY);
mainSizer->Add(new wxStaticText(this, wxID_ANY, wxT("폰트 스타일(Y):")), 0, wxLEFT | wxTOP, 5);
mainSizer->Add(styleComboBox, 0, wxLEFT | wxEXPAND, 5);
// 폰트 크기 선택 콤보박스
wxArrayString fontSizes;
for (int i = 8; i < 30; ++i)
fontSizes.Add(wxString::Format(wxT("%d"), i));
sizeComboBox = new wxComboBox(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, fontSizes, wxCB_READONLY);
mainSizer->Add(new wxStaticText(this, wxID_ANY, wxT("크기(S):")), 0, wxLEFT | wxTOP, 5);
mainSizer->Add(sizeComboBox, 0, wxLEFT | wxEXPAND, 5);
// 폰트 미리보기
previewTextCtrl = new wxTextCtrl(this, wxID_ANY, wxT("AaBbYyZz"), wxDefaultPosition, wxDefaultSize, wxTE_CENTER);
mainSizer->Add(new wxStaticText(this, wxID_ANY, wxT("보기")), 0, wxLEFT | wxTOP, 5);
mainSizer->Add(previewTextCtrl, 1, wxLEFT | wxEXPAND, 5);
// 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);
// 이벤트 처리기 등록
Bind(wxEVT_COMBOBOX, &wxOptionDialog::OnFontChange, this, wxID_ANY);
}
void wxOptionDialog::OnFontChange(wxCommandEvent& event)
{
UpdatePreview();
}
void wxOptionDialog::UpdatePreview()
{
wxString family = familyComboBox->GetValue();
wxString styleName = styleComboBox->GetValue();
wxString sizeStr = sizeComboBox->GetValue();
long size;
if (!sizeStr.ToLong(&size)) return; // 크기 변환 실패 시 리턴
wxFont font(wxFontInfo(size).Family(wxFONTFAMILY_DEFAULT).FaceName(family));
previewTextCtrl->SetFont(font);
}
void wxOptionDialog::OnOkButtonClicked(wxCommandEvent& _event)
{
MyCustomEvent event(MY_CUSTOM_EVENT);
event.SetMyData("여기에 전달하고 싶은 데이터");
wxPostEvent(GetParent(), event); // 부모 윈도우에 이벤트 전달
EndModal(wxID_OK);
}
|
cs |
이렇게 하면, 미리보기용 TextCotrl에서 Font에 맞춰서 적용이 가능하다.
이 소스에서는 FontStyle에 관련된건 제외하고, FontFamily와 Font Size만 적용해 놓은 상태인데.
ComboBox의 변화를 인식하는 OnFontChange에 맞춰서 동작하도록 만들었고, 그럴 처리하기 위한 UpDatePreview라는 함수에서 적용해서 미리보기를 갱신할 수 있다.
여기서 Event로 전송하기 위해서는
wxOptionsDialog.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
|
#pragma once
#include <wx/wx.h>
#include <wx/combobox.h>
#include <wx/fontenum.h>
#include <wx/sizer.h>
#include "wxMyCustomEvent.h"
#ifndef __WX_WIDGETS_OPTION_DIALOG_H__
#define __WX_WIDGETS_OPTION_DIALOG_H__
// 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);
void OnFontChange(wxCommandEvent& evnt);
void UpdatePreview();
wxComboBox* familyComboBox;
wxComboBox* styleComboBox;
wxComboBox* sizeComboBox;
wxTextCtrl* previewTextCtrl;
wxFont font;
};
#endif
|
cs |
이렇게 해서 wxFont font;를 추가해주고
wxMyCustomEvent.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
|
#pragma once
// wxMyCusomEvent.h
#pragma once
#include <wx/wx.h>
#include <wx/event.h>
#ifndef __WX_MY_CUSTOM_EVENT_H__
#define __WX_MY_CUSTOM_EVENT_H__
class MyCustomEvent : public wxCommandEvent
{
public:
MyCustomEvent(wxEventType commandType = wxEVT_NULL, int id = 0)
: wxCommandEvent(commandType, id) { }
// 복사 생성자 - 이벤트 시스템에서 이벤트 복사 시 필요
MyCustomEvent(const MyCustomEvent& event)
: wxCommandEvent(event), myData(event.myData) { }
// wxEvent의 Clone() 메서드 구현 - 이벤트 시스템에서 필요
virtual wxEvent* Clone() const override { return new MyCustomEvent(*this); }
// 데이터 설정 및 가져오기 메서드
void SetMyData(const wxString& data);
const wxString GetMyData(void) ;
void SetwxFont(const wxFont& data) { m_font = data; }
wxFont GetwxFont() const { return m_font; }
private:
wxString myData; // 전달하고자 하는 데이터
wxFont m_font;
};
#endif
// 사용자 정의 이벤트 타입 선언
wxDECLARE_EVENT(MY_CUSTOM_EVENT, MyCustomEvent);
|
cs |
이렇게 해서 font를 이벤트에 적용할 수 있게 해야한다.
이후 wxOptinosDialog.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
|
#include <wx/wx.h>
#include "wxOptionsDialog.h"
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);
// 설정 대화 상자의 내용을 여기에 구성
// 폰트 패밀리 선택 콤보박스
wxArrayString fontFamilies = wxFontEnumerator::GetFacenames();
familyComboBox = new wxComboBox(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, fontFamilies, wxCB_READONLY);
mainSizer->Add(new wxStaticText(this, wxID_ANY, wxT("폰트(E):")), 0, wxLEFT | wxTOP, 5);
mainSizer->Add(familyComboBox, 0, wxLEFT | wxEXPAND, 5);
// 폰트 스타일 선택 콤보박스
wxArrayString fontStyles;
fontStyles.Add("보통");
fontStyles.Add("기울임꼴");
fontStyles.Add("두껍게");
styleComboBox = new wxComboBox(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, fontStyles, wxCB_READONLY);
mainSizer->Add(new wxStaticText(this, wxID_ANY, wxT("폰트 스타일(Y):")), 0, wxLEFT | wxTOP, 5);
mainSizer->Add(styleComboBox, 0, wxLEFT | wxEXPAND, 5);
// 폰트 크기 선택 콤보박스
wxArrayString fontSizes;
for (int i = 8; i < 30; ++i)
fontSizes.Add(wxString::Format(wxT("%d"), i));
sizeComboBox = new wxComboBox(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, fontSizes, wxCB_READONLY);
mainSizer->Add(new wxStaticText(this, wxID_ANY, wxT("크기(S):")), 0, wxLEFT | wxTOP, 5);
mainSizer->Add(sizeComboBox, 0, wxLEFT | wxEXPAND, 5);
// 폰트 미리보기
previewTextCtrl = new wxTextCtrl(this, wxID_ANY, wxT("AaBbYyZz"), wxDefaultPosition, wxDefaultSize, wxTE_CENTER);
mainSizer->Add(new wxStaticText(this, wxID_ANY, wxT("보기")), 0, wxLEFT | wxTOP, 5);
mainSizer->Add(previewTextCtrl, 1, wxLEFT | wxEXPAND, 5);
// 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);
// 이벤트 처리기 등록
Bind(wxEVT_COMBOBOX, &wxOptionDialog::OnFontChange, this, wxID_ANY);
}
void wxOptionDialog::OnFontChange(wxCommandEvent& event)
{
UpdatePreview();
}
void wxOptionDialog::UpdatePreview()
{
wxString family = familyComboBox->GetValue();
wxString styleName = styleComboBox->GetValue();
wxString sizeStr = sizeComboBox->GetValue();
long size;
if (!sizeStr.ToLong(&size)) return; // 크기 변환 실패 시 리턴
wxFont updatedFont(wxFontInfo(size).Family(wxFONTFAMILY_DEFAULT).FaceName(family));
this->font = updatedFont; // 멤버 변수에 폰트 저장
previewTextCtrl->SetFont(font);
}
void wxOptionDialog::OnOkButtonClicked(wxCommandEvent& _event)
{
MyCustomEvent event(MY_CUSTOM_EVENT);
event.SetwxFont(font);
wxPostEvent(GetParent(), event); // 부모 윈도우에 이벤트 전달
EndModal(wxID_OK);
}
|
cs |
이렇게 수정하여, font의 정보를 전송하는 기능을 제공할 수 있게 된다.
'프로그래밍 > wxWidgets' 카테고리의 다른 글
[wxWidgets] 체크 할 수 있는 메뉴 추가하기. (1) | 2024.02.11 |
---|---|
[wxWidgets] Font 정보를 받아서 TextControl에 적용하기. (0) | 2024.02.10 |
[wxWidgets] Custom Event을 제작하기. (0) | 2024.02.09 |
[wxWidgets] Event 전송하기. (1) | 2024.02.08 |
[wxWidgets] Sizer을 추가하여 깔끔하게 보이게하기. (0) | 2024.02.08 |