xref: /MusicPlayer2/MusicPlayer2/EqualizerDlg.cpp (revision 52e916bf950c2adf540da0d33403a4ded9f9447d)
1 // EqualizerDlg.cpp : 实现文件
2 //
3 
4 #include "stdafx.h"
5 #include "MusicPlayer2.h"
6 #include "Player.h"
7 #include "EqualizerDlg.h"
8 #include "IniHelper.h"
9 
10 
11 // CEqualizerDlg 对话框
12 
IMPLEMENT_DYNAMIC(CEqualizerDlg,CTabDlg)13 IMPLEMENT_DYNAMIC(CEqualizerDlg, CTabDlg)
14 
15 CEqualizerDlg::CEqualizerDlg(CWnd* pParent /*=NULL*/)
16     : CTabDlg(IDD_EQUALIZER_DIALOG, pParent)
17 {
18 
19 }
20 
~CEqualizerDlg()21 CEqualizerDlg::~CEqualizerDlg()
22 {
23 }
24 
EnableControls(bool enable)25 void CEqualizerDlg::EnableControls(bool enable)
26 {
27     m_equ_style_list.EnableWindow(enable);
28     for (int i{}; i < EQU_CH_NUM; i++)
29     {
30         m_sliders[i].EnableWindow(enable);
31     }
32 }
33 
SaveConfig() const34 void CEqualizerDlg::SaveConfig() const
35 {
36     CIniHelper ini(theApp.m_config_path);
37 
38     ini.WriteInt(L"equalizer", L"equalizer_style", m_equ_style_selected);
39     //保存自定义的每个均衡器通道的增益
40     wchar_t buff[16];
41     for (int i{}; i < EQU_CH_NUM; i++)
42     {
43         swprintf_s(buff, L"channel%d", i + 1);
44         ini.WriteInt(L"equalizer", buff, m_user_defined_gain[i]);
45     }
46     ini.Save();
47 }
48 
LoadConfig()49 void CEqualizerDlg::LoadConfig()
50 {
51     CIniHelper ini(theApp.m_config_path);
52 
53     m_equ_style_selected = ini.GetInt(L"equalizer", L"equalizer_style", 0);
54     //读取自定义的每个均衡器通道的增益
55     wchar_t buff[16];
56     for (int i{}; i < EQU_CH_NUM; i++)
57     {
58         swprintf_s(buff, L"channel%d", i + 1);
59         m_user_defined_gain[i] = ini.GetInt(L"equalizer", buff, 0);
60     }
61 }
62 
UpdateChannelTip(int channel,int gain)63 void CEqualizerDlg::UpdateChannelTip(int channel, int gain)
64 {
65     if (channel < 0 || channel >= EQU_CH_NUM) return;
66     wchar_t buff[8];
67     swprintf_s(buff, L"%ddB", gain);
68     m_Mytip.UpdateTipText(buff, &m_sliders[channel]);       //更新鼠标提示
69 }
70 
InitializeControls()71 bool CEqualizerDlg::InitializeControls()
72 {
73     wstring temp;
74     temp = theApp.m_str_table.LoadText(L"TXT_EQ_ENABLE");
75     SetDlgItemTextW(IDC_ENABLE_EQU_CHECK, temp.c_str());
76     temp = theApp.m_str_table.LoadText(L"TXT_EQ_PRESET");
77     SetDlgItemTextW(IDC_TXT_EQ_PRESET_STATIC, temp.c_str());
78     temp = theApp.m_str_table.LoadText(L"TXT_EQ_CHANNEL_SETTING");
79     SetDlgItemTextW(IDC_TXT_EQ_CHANNEL_SETTING_STATIC, temp.c_str());
80 
81     return false;
82 }
83 
DoDataExchange(CDataExchange * pDX)84 void CEqualizerDlg::DoDataExchange(CDataExchange* pDX)
85 {
86     CTabDlg::DoDataExchange(pDX);
87     DDX_Control(pDX, IDC_SLIDER1, m_sliders[0]);
88     DDX_Control(pDX, IDC_SLIDER2, m_sliders[1]);
89     DDX_Control(pDX, IDC_SLIDER3, m_sliders[2]);
90     DDX_Control(pDX, IDC_SLIDER4, m_sliders[3]);
91     DDX_Control(pDX, IDC_SLIDER5, m_sliders[4]);
92     DDX_Control(pDX, IDC_SLIDER6, m_sliders[5]);
93     DDX_Control(pDX, IDC_SLIDER7, m_sliders[6]);
94     DDX_Control(pDX, IDC_SLIDER8, m_sliders[7]);
95     DDX_Control(pDX, IDC_SLIDER9, m_sliders[8]);
96     DDX_Control(pDX, IDC_SLIDER10, m_sliders[9]);
97     DDX_Control(pDX, IDC_EQU_STYLES_LIST, m_equ_style_list);
98 }
99 
100 
BEGIN_MESSAGE_MAP(CEqualizerDlg,CTabDlg)101 BEGIN_MESSAGE_MAP(CEqualizerDlg, CTabDlg)
102     ON_WM_VSCROLL()
103     ON_BN_CLICKED(IDC_ENABLE_EQU_CHECK, &CEqualizerDlg::OnBnClickedEnableEquCheck)
104     ON_WM_DESTROY()
105     ON_MESSAGE(WM_LISTBOX_SEL_CHANGED, &CEqualizerDlg::OnListboxSelChanged)
106 END_MESSAGE_MAP()
107 
108 
109 // CEqualizerDlg 消息处理程序
110 
111 
112 BOOL CEqualizerDlg::OnInitDialog()
113 {
114     CTabDlg::OnInitDialog();
115 
116     // TODO:  在此添加额外的初始化
117     LoadConfig();
118 
119     //初始化滑动条的位置
120     for (int i{}; i < EQU_CH_NUM; i++)
121     {
122         m_sliders[i].SetRange(-15, 15, TRUE);
123         m_sliders[i].SetPos(-CPlayer::GetInstance().GeEqualizer(i));
124     }
125 
126     //初始化均衡器开关复选框
127     CheckDlgButton(IDC_ENABLE_EQU_CHECK, CPlayer::GetInstance().GetEqualizerEnable());
128 
129     //初始化“均衡器预设”列表
130     m_equ_style_list.AddString(theApp.m_str_table.LoadText(L"TXT_EQ_NONE").c_str());
131     m_equ_style_list.AddString(theApp.m_str_table.LoadText(L"TXT_EQ_CLASSICAL").c_str());
132     m_equ_style_list.AddString(theApp.m_str_table.LoadText(L"TXT_EQ_POP").c_str());
133     m_equ_style_list.AddString(theApp.m_str_table.LoadText(L"TXT_EQ_JAZZ").c_str());
134     m_equ_style_list.AddString(theApp.m_str_table.LoadText(L"TXT_EQ_ROCK").c_str());
135     m_equ_style_list.AddString(theApp.m_str_table.LoadText(L"TXT_EQ_SOFT").c_str());
136     m_equ_style_list.AddString(theApp.m_str_table.LoadText(L"TXT_EQ_BASS").c_str());
137     m_equ_style_list.AddString(theApp.m_str_table.LoadText(L"TXT_EQ_ELIMINATE_BASS").c_str());
138     m_equ_style_list.AddString(theApp.m_str_table.LoadText(L"TXT_EQ_WEAKENING_TREBLE").c_str());
139     m_equ_style_list.AddString(theApp.m_str_table.LoadText(L"TXT_EQ_USER_DEFINE").c_str());
140     m_equ_style_list.SetCurSel(m_equ_style_selected);
141 
142     //初始化控件的启用禁用状态
143     EnableControls(CPlayer::GetInstance().GetEqualizerEnable());
144 
145     //初始化提示信息
146     m_Mytip.Create(this, TTS_ALWAYSTIP);
147     wchar_t buff[8];
148     for (int i{}; i < EQU_CH_NUM; i++)
149     {
150         swprintf_s(buff, L"%ddB", -m_sliders[i].GetPos());
151         m_Mytip.AddTool(&m_sliders[i], buff);
152     }
153 
154     return TRUE;  // return TRUE unless you set the focus to a control
155                   // 异常: OCX 属性页应返回 FALSE
156 }
157 
158 
OnVScroll(UINT nSBCode,UINT nPos,CScrollBar * pScrollBar)159 void CEqualizerDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
160 {
161     // TODO: 在此添加消息处理程序代码和/或调用默认值
162     for (int i{}; i < EQU_CH_NUM; i++)
163     {
164         if (pScrollBar->GetSafeHwnd() == m_sliders[i].GetSafeHwnd())
165         {
166             int gain{ -m_sliders[i].GetPos() };     //由于滑动条的值越往上越小,所以这里取负数
167             CPlayer::GetInstance().SetEqualizer(i, gain);       //设置通道i的增益
168             UpdateChannelTip(i, gain);      //更新鼠标提示
169 
170             if (m_equ_style_list.GetCurSel() == 9)      //如果“均衡器预设”中选中的是自定义
171             {
172                 m_user_defined_gain[i] = gain;      //将增益值保存到用户自定义增益里
173             }
174             else
175             {
176                 //否则,将当前每个滑动条上的增益设置保存到m_user_defined_gain里
177                 for (int j{}; j < EQU_CH_NUM; j++)
178                 {
179                     m_user_defined_gain[j] = -m_sliders[j].GetPos();
180                 }
181                 m_equ_style_list.SetCurSel(9);      //更改了均衡器的设定,“均衡器预设”中自动选中“自定义”
182                 m_equ_style_selected = 9;
183             }
184             break;
185         }
186     }
187 
188     CTabDlg::OnVScroll(nSBCode, nPos, pScrollBar);
189 }
190 
191 
PreTranslateMessage(MSG * pMsg)192 BOOL CEqualizerDlg::PreTranslateMessage(MSG* pMsg)
193 {
194     // TODO: 在此添加专用代码和/或调用基类
195     if (pMsg->message == WM_MOUSEMOVE)
196         m_Mytip.RelayEvent(pMsg);
197 
198     return CTabDlg::PreTranslateMessage(pMsg);
199 }
200 
201 
OnBnClickedEnableEquCheck()202 void CEqualizerDlg::OnBnClickedEnableEquCheck()
203 {
204     // TODO: 在此添加控件通知处理程序代码
205     bool enable = (IsDlgButtonChecked(IDC_ENABLE_EQU_CHECK) != FALSE);
206     CPlayer::GetInstance().EnableEqualizer(enable);
207     EnableControls(enable);
208 }
209 
210 
OnListboxSelChanged(WPARAM wParam,LPARAM lParam)211 afx_msg LRESULT CEqualizerDlg::OnListboxSelChanged(WPARAM wParam, LPARAM lParam)
212 {
213     if ((CWnd*)wParam == &m_equ_style_list)
214     {
215         m_equ_style_selected = (int)lParam;
216         if (m_equ_style_selected >= 0 && m_equ_style_selected < 9)
217         {
218             //根据选中的均衡器风格设置每个通道的增益
219             for (int i{}; i < EQU_CH_NUM; i++)
220             {
221                 int gain = EQU_STYLE_TABLE[m_equ_style_selected][i];
222                 CPlayer::GetInstance().SetEqualizer(i, gain);
223                 m_sliders[i].SetPos(-gain);
224                 UpdateChannelTip(i, gain);      //更新鼠标提示
225             }
226         }
227         else if (m_equ_style_selected == 9)     //如果选择了“自定义”
228         {
229             for (int i{}; i < EQU_CH_NUM; i++)
230             {
231                 int gain = m_user_defined_gain[i];
232                 CPlayer::GetInstance().SetEqualizer(i, gain);
233                 m_sliders[i].SetPos(-gain);
234                 UpdateChannelTip(i, gain);      //更新鼠标提示
235             }
236         }
237 
238     }
239     return 0;
240 }
241 
242 
OnDestroy()243 void CEqualizerDlg::OnDestroy()
244 {
245     CTabDlg::OnDestroy();
246 
247     // TODO: 在此处添加消息处理程序代码
248     SaveConfig();
249 }
250