diff --git a/MusicPlayer2/CPlayerUIHelper.cpp b/MusicPlayer2/CPlayerUIHelper.cpp index dd52f94e..0201c0db 100644 --- a/MusicPlayer2/CPlayerUIHelper.cpp +++ b/MusicPlayer2/CPlayerUIHelper.cpp @@ -23,11 +23,17 @@ UIColors CPlayerUIHelper::GetUIColors(bool dark, bool draw_alpha) colors.color_text_lable = theApp.m_app_setting_data.theme_color.light2; colors.color_text_2 = theApp.m_app_setting_data.theme_color.light1; colors.color_text_heighlight = theApp.m_app_setting_data.theme_color.light2; - colors.color_text_disabled = GRAY(180); + colors.color_text_disabled = GRAY(200); if (draw_alpha) + { colors.color_back = GRAY(64); + colors.color_panel_back = GRAY(72); + } else + { colors.color_back = GRAY(48); + colors.color_panel_back = GRAY(56); + } colors.color_lyric_back = theApp.m_app_setting_data.theme_color.dark3; if (draw_alpha) @@ -62,6 +68,10 @@ UIColors CPlayerUIHelper::GetUIColors(bool dark, bool draw_alpha) colors.color_text_heighlight = theApp.m_app_setting_data.theme_color.dark1; colors.color_text_disabled = GRAY(160); colors.color_back = ColorTable::WHITE; + if (draw_alpha) + colors.color_panel_back = ColorTable::WHITE; + else + colors.color_panel_back = GRAY(240); colors.color_lyric_back = theApp.m_app_setting_data.theme_color.light3; colors.color_control_bar_back = theApp.m_app_setting_data.theme_color.light3; colors.color_spectrum = theApp.m_app_setting_data.theme_color.original_color; @@ -95,7 +105,7 @@ bool CPlayerUIHelper::IsMidiLyric() bool CPlayerUIHelper::IsDrawStatusBar() { return theApp.m_app_setting_data.always_show_statusbar || CPlayer::GetInstance().m_loading || (theApp.IsMeidaLibUpdating() && theApp.m_media_update_para.num_added > 0) - /*|| CPlayer::GetInstance().GetABRepeatMode() != CPlayer::AM_NONE*/; + /*|| CPlayer::GetInstance().GetABRepeatMode() != CPlayer::AM_NONE*/; } diff --git a/MusicPlayer2/CPlayerUIHelper.h b/MusicPlayer2/CPlayerUIHelper.h index 3a3f3ed7..9e6f9eaa 100644 --- a/MusicPlayer2/CPlayerUIHelper.h +++ b/MusicPlayer2/CPlayerUIHelper.h @@ -1,22 +1,23 @@ #pragma once #include "ColorConvert.h" -struct UIColors //界面颜色 +struct UIColors //界面颜色 { - COLORREF color_text; //文本颜色 - COLORREF color_text_lable; //标签文本的颜色 - COLORREF color_text_2; //歌词未播放文本的颜色 - COLORREF color_text_heighlight; //鼠标指向时文本的颜色 + COLORREF color_text; //文本颜色 + COLORREF color_text_lable; //标签文本的颜色 + COLORREF color_text_2; //歌词未播放文本的颜色 + COLORREF color_text_heighlight; //鼠标指向时文本的颜色 COLORREF color_text_disabled; //禁用时的文本颜色 - COLORREF color_back; //背景颜色 - COLORREF color_lyric_back; //歌词界面背景颜色 - COLORREF color_control_bar_back; //控制条背景颜色 - COLORREF color_spectrum; //频谱分析柱形的颜色 - COLORREF color_spectrum_cover; //有专辑封面时的频谱分析柱形的颜色 - COLORREF color_progress_back; //进度条的背景颜色 - COLORREF color_button_checked; //按钮选中状态的背景色 - COLORREF color_button_pressed; //按钮按下的颜色 - COLORREF color_button_hover; //按钮指向时的颜色 + COLORREF color_back; //背景颜色 + COLORREF color_panel_back; //面板的背景色 + COLORREF color_lyric_back; //歌词界面背景颜色 + COLORREF color_control_bar_back; //控制条背景颜色 + COLORREF color_spectrum; //频谱分析柱形的颜色 + COLORREF color_spectrum_cover; //有专辑封面时的频谱分析柱形的颜色 + COLORREF color_progress_back; //进度条的背景颜色 + COLORREF color_button_checked; //按钮选中状态的背景色 + COLORREF color_button_pressed; //按钮按下的颜色 + COLORREF color_button_hover; //按钮指向时的颜色 COLORREF color_stack_indicator; //staticElement指示器的颜色 COLORREF color_scrollbar_handle; //滚动条把手的颜色 COLORREF color_list_selected; //列表选中项的颜色 @@ -31,7 +32,7 @@ public: static UIColors GetUIColors(bool dark, bool draw_alpha = true); - static bool IsMidiLyric(); //是否绘制MIDI音乐的歌词 + static bool IsMidiLyric(); //是否绘制MIDI音乐的歌词 static bool IsDrawStatusBar(); //是否绘制状态栏 static double GetScrollTextPixel(); diff --git a/MusicPlayer2/UIElement/AbstractListElement.cpp b/MusicPlayer2/UIElement/AbstractListElement.cpp index 5339ab9a..fc0473ae 100644 --- a/MusicPlayer2/UIElement/AbstractListElement.cpp +++ b/MusicPlayer2/UIElement/AbstractListElement.cpp @@ -54,7 +54,8 @@ void UiElement::AbstractListElement::DrawScrollArea() bool is_selected_item = false; if (draw_hover_row_background) { - is_selected_item = GetDisplayedIndexByPoint(m_mouse_pos) == i; + if (rect.PtInRect(m_mouse_pos)) + is_selected_item = GetDisplayedIndexByPoint(m_mouse_pos) == i; } else { @@ -493,6 +494,13 @@ bool UiElement::AbstractListElement::MouseWheel(int delta, CPoint point) return false; } +bool UiElement::AbstractListElement::MouseLeave() +{ + bool rtn = AbstractScrollArea::MouseLeave(); + m_mouse_pos = CPoint(-1, -1); + return rtn; +} + bool UiElement::AbstractListElement::DoubleClick(CPoint point) { if (rect.PtInRect(point) && !scrollbar_rect.PtInRect(point) && GetItemSelected() >= 0) diff --git a/MusicPlayer2/UIElement/AbstractListElement.h b/MusicPlayer2/UIElement/AbstractListElement.h index 759e4b73..a0c6ca3a 100644 --- a/MusicPlayer2/UIElement/AbstractListElement.h +++ b/MusicPlayer2/UIElement/AbstractListElement.h @@ -20,6 +20,7 @@ namespace UiElement virtual bool RButtonUp(CPoint point) override; virtual bool RButtonDown(CPoint point) override; virtual bool MouseWheel(int delta, CPoint point) override; + virtual bool MouseLeave() override; virtual bool DoubleClick(CPoint point) override; void ShowContextMenu(CMenu* menu, CWnd* cmd_reciver); virtual void ClearRect() override; @@ -86,10 +87,11 @@ namespace UiElement virtual void FromXmlNode(tinyxml2::XMLElement* xml_node); + int GetDisplayedIndexByPoint(CPoint point); //获取一个坐标所在的行号 + private: void DisplayRowToAbsoluteRow(int& row); //将显示的行号转换为绝对行号 void AbsoluteRowToDisplayRow(int& row); //将绝对行号转换为显示的行号 - int GetDisplayedIndexByPoint(CPoint point); protected: int GetListIndexByPoint(CPoint point); diff --git a/MusicPlayer2/UIElement/AbstractScrollArea.cpp b/MusicPlayer2/UIElement/AbstractScrollArea.cpp index e5e97f3c..2535cd4e 100644 --- a/MusicPlayer2/UIElement/AbstractScrollArea.cpp +++ b/MusicPlayer2/UIElement/AbstractScrollArea.cpp @@ -165,8 +165,7 @@ bool UiElement::AbstractScrollArea::MouseMove(CPoint point) } bool rtn = false; - if (hover) - rtn = Element::MouseMove(point); + rtn = Element::MouseMove(point); if (last_hover && !hover) { Element::MouseLeave(); diff --git a/MusicPlayer2/UIElement/ComboBox.cpp b/MusicPlayer2/UIElement/ComboBox.cpp index 1e84c978..604b7a9a 100644 --- a/MusicPlayer2/UIElement/ComboBox.cpp +++ b/MusicPlayer2/UIElement/ComboBox.cpp @@ -24,7 +24,7 @@ void UiElement::ComboBox::Draw() text_rect.right = icon_rect.left; text_rect.left += ui->DPI(4); std::wstring cur_text = GetCurString(); - ui->GetDrawer().DrawWindowText(text_rect, cur_text.c_str(), ui->GetUIColors().color_text); + ui->GetDrawer().DrawWindowText(text_rect, cur_text.c_str(), IsEnable() ? ui->GetUIColors().color_text : ui->GetUIColors().color_text_disabled); Element::Draw(); } @@ -36,19 +36,20 @@ void UiElement::ComboBox::DrawTopMost() //计算下拉列表的位置 rect_drop_list = rect; rect_drop_list.top = rect.bottom; + const int drop_list_margin = ui->DPI(4); //下拉列表的高度 - int list_height = drop_list->GetRowCount() * drop_list->ItemHeight() + 1; - CCommon::SetNumRange(list_height, ui->DPI(30), ui->DPI(200)); + int list_height = drop_list->GetRowCount() * drop_list->ItemHeight() + 2 * drop_list_margin + ui->DPI(1); rect_drop_list.bottom = rect_drop_list.top + list_height; - //限制下拉列表中绘图区域内 - CRect draw_rect = ui->GetClientDrawRect(); - rect_drop_list = draw_rect & rect_drop_list; + ////限制下拉列表中绘图区域内 + //CRect draw_rect = ui->GetClientDrawRect(); + //rect_drop_list = draw_rect & rect_drop_list; - drop_list->SetRect(rect_drop_list); if (theApp.m_app_setting_data.button_round_corners) - ui->GetDrawer().DrawRoundRect(rect_drop_list, ui->GetUIColors().color_back, ui->CalculateRoundRectRadius(rect_drop_list), 255); + ui->GetDrawer().DrawRoundRect(rect_drop_list, ui->GetUIColors().color_panel_back, ui->CalculateRoundRectRadius(rect_drop_list), 255); else - ui->GetDrawer().FillRect(rect_drop_list, ui->GetUIColors().color_back); + ui->GetDrawer().FillRect(rect_drop_list, ui->GetUIColors().color_panel_back); + rect_drop_list.DeflateRect(drop_list_margin, drop_list_margin); + drop_list->SetRect(rect_drop_list); drop_list->Draw(); } } @@ -57,9 +58,6 @@ void UiElement::ComboBox::InitComplete() { CElementFactory factory; drop_list = std::dynamic_pointer_cast(factory.CreateElement("listElement", ui)); - drop_list->SetSelectionChangedTrigger([&](AbstractListElement* list_element) { - selection_changed = true; - }); drop_list->SetDrawAlternateBackground(false); drop_list->SetDrawHoverRowBackground(true); } @@ -77,11 +75,6 @@ bool UiElement::ComboBox::LButtonUp(CPoint point) if (show_drop_list && rect_drop_list.PtInRect(point)) { drop_list->LButtonUp(point); - if (selection_changed) - { - OnSelChanged(); - selection_changed = false; - } return true; } @@ -106,8 +99,12 @@ bool UiElement::ComboBox::LButtonDown(CPoint point) bool UiElement::ComboBox::MouseMove(CPoint point) { - hover = (rect.PtInRect(point)); - if (show_drop_list && rect_drop_list.PtInRect(point)) + hover = (rect.PtInRect(point) && IsEnable()); + bool drop_list_hover = show_drop_list && rect_drop_list.PtInRect(point); + if (last_drop_list_hover && !drop_list_hover) + drop_list->MouseLeave(); + last_drop_list_hover = drop_list_hover; + if (drop_list_hover) { drop_list->MouseMove(point); return true; @@ -124,6 +121,27 @@ bool UiElement::ComboBox::MouseLeave() return false; } +void UiElement::ComboBox::TopMostClicked(CPoint point) +{ + if (!rect.PtInRect(point) && IsShown() && IsEnable()) + { + if (show_drop_list && rect_drop_list.PtInRect(point)) + { + int selected_row = drop_list->GetDisplayedIndexByPoint(point); + drop_list->LButtonUp(point); + int cur_sel = GetCurSel(); + SetCurSel(selected_row); + if (selected_row != cur_sel) + { + if (m_selection_changed_trigger) + m_selection_changed_trigger(this); + } + } + show_drop_list = false; + + } +} + void UiElement::ComboBox::AddString(const std::wstring& str) { drop_list->AddRow(str); @@ -149,19 +167,7 @@ std::wstring UiElement::ComboBox::GetCurString() return drop_list->GetItemText(selected_row, 0); } -void UiElement::ComboBox::SetSelectionChangedTrigger(std::function func) +void UiElement::ComboBox::SetSelectionChangedTrigger(std::function func) { m_selection_changed_trigger = func; } - -void UiElement::ComboBox::OnSelChanged() -{ - //同步选中行和Highlight行 - int selected_row = drop_list->GetItemSelected(); - drop_list->SetHighlightRow(selected_row); - - if (m_selection_changed_trigger) - m_selection_changed_trigger(drop_list.get()); - - show_drop_list = false; -} diff --git a/MusicPlayer2/UIElement/ComboBox.h b/MusicPlayer2/UIElement/ComboBox.h index fe9ab176..c438cfd2 100644 --- a/MusicPlayer2/UIElement/ComboBox.h +++ b/MusicPlayer2/UIElement/ComboBox.h @@ -13,26 +13,25 @@ namespace UiElement virtual bool LButtonDown(CPoint point) override; virtual bool MouseMove(CPoint point) override; virtual bool MouseLeave() override; + virtual void TopMostClicked(CPoint point) override; void AddString(const std::wstring& str); void SetCurSel(int index); int GetCurSel(); std::wstring GetCurString(); - void SetSelectionChangedTrigger(std::function func); - - protected: - void OnSelChanged(); + void SetSelectionChangedTrigger(std::function func); protected: bool show_drop_list{ false }; std::shared_ptr drop_list; - std::function m_selection_changed_trigger; + std::function m_selection_changed_trigger; private: bool hover{}; bool pressed{}; CRect rect_drop_list; - bool selection_changed{}; + //bool selection_changed{}; + bool last_drop_list_hover{}; }; } diff --git a/MusicPlayer2/UIPanel/PlayerUIPanel.cpp b/MusicPlayer2/UIPanel/PlayerUIPanel.cpp index 9aba0744..d315c967 100644 --- a/MusicPlayer2/UIPanel/PlayerUIPanel.cpp +++ b/MusicPlayer2/UIPanel/PlayerUIPanel.cpp @@ -3,106 +3,106 @@ #include "UserUi.h" CPlayerUIPanel::CPlayerUIPanel(CPlayerUIBase* ui, UINT res_id) - : m_ui(ui) + : m_ui(ui) { - string xml = CCommon::GetTextResourceRawData(res_id); - if (!xml.empty()) - LoadUIData(xml); + string xml = CCommon::GetTextResourceRawData(res_id); + if (!xml.empty()) + LoadUIData(xml); } CPlayerUIPanel::CPlayerUIPanel(CPlayerUIBase* ui, const std::wstring file_name) - : m_ui(ui) + : m_ui(ui) { - std::wstring file_path = theApp.m_local_dir + L"skins\\panels\\" + file_name; - std::string xml; - if (CCommon::GetFileContent(file_path.c_str(), xml)) - LoadUIData(xml); + std::wstring file_path = theApp.m_local_dir + L"skins\\panels\\" + file_name; + std::string xml; + if (CCommon::GetFileContent(file_path.c_str(), xml)) + LoadUIData(xml); } CPlayerUIPanel::CPlayerUIPanel(CPlayerUIBase* ui, std::shared_ptr panel_element) - : m_ui(ui) + : m_ui(ui) { - m_root_element = panel_element; + m_root_element = panel_element; } void CPlayerUIPanel::LoadUIData(const std::string& xml_contents) { - //读取xml - tinyxml2::XMLDocument doc; - auto rtn = doc.Parse(xml_contents.c_str(), xml_contents.size()); - if (rtn == tinyxml2::XML_SUCCESS) - { - tinyxml2::XMLElement* root = doc.RootElement(); - CTinyXml2Helper::IterateChildNode(root, [&](tinyxml2::XMLElement* xml_child) { - std::string item_name = CTinyXml2Helper::ElementName(xml_child); - //查找panel元素 - if (item_name == "panel") - { - if (m_root_element == nullptr) - m_root_element = std::dynamic_pointer_cast(CUserUi::BuildUiElementFromXmlNode(xml_child, m_ui)); - } - }); - } + //读取xml + tinyxml2::XMLDocument doc; + auto rtn = doc.Parse(xml_contents.c_str(), xml_contents.size()); + if (rtn == tinyxml2::XML_SUCCESS) + { + tinyxml2::XMLElement* root = doc.RootElement(); + CTinyXml2Helper::IterateChildNode(root, [&](tinyxml2::XMLElement* xml_child) { + std::string item_name = CTinyXml2Helper::ElementName(xml_child); + //查找panel元素 + if (item_name == "panel") + { + if (m_root_element == nullptr) + m_root_element = std::dynamic_pointer_cast(CUserUi::BuildUiElementFromXmlNode(xml_child, m_ui)); + } + }); + } } void CPlayerUIPanel::Draw() { - if (m_root_element != nullptr) - { - CRect draw_rect = m_ui->GetClientDrawRect(); + if (m_root_element != nullptr) + { + CRect draw_rect = m_ui->GetClientDrawRect(); - //计算面板矩形区域 - m_panel_rect = CalculatePanelRect(); - //如果未通过代码获取面板的矩形区域,则根据ui计算面板区域 - if (m_panel_rect.IsRectEmpty()) - { - m_root_element->CalculateRect(draw_rect); - m_panel_rect = m_root_element->GetRect(); - } - else - { - m_panel_rect &= draw_rect; - m_root_element->SetRect(m_panel_rect); - } + //计算面板矩形区域 + m_panel_rect = CalculatePanelRect(); + //如果未通过代码获取面板的矩形区域,则根据ui计算面板区域 + if (m_panel_rect.IsRectEmpty()) + { + m_root_element->CalculateRect(draw_rect); + m_panel_rect = m_root_element->GetRect(); + } + else + { + m_panel_rect &= draw_rect; + m_root_element->SetRect(m_panel_rect); + } - //判断面板是否占满整个窗口 - m_is_full_fill = (m_panel_rect.left == draw_rect.left) && (m_panel_rect.top == draw_rect.top) && (m_panel_rect.right == draw_rect.right) && (m_panel_rect.bottom == draw_rect.bottom); + //判断面板是否占满整个窗口 + m_is_full_fill = (m_panel_rect.left == draw_rect.left) && (m_panel_rect.top == draw_rect.top) && (m_panel_rect.right == draw_rect.right) && (m_panel_rect.bottom == draw_rect.bottom); - //绘制一层半透明的黑色背景 - if (!m_is_full_fill) - { - BYTE alpha = ALPHA_CHG(theApp.m_app_setting_data.background_transparency); - m_ui->GetDrawer().FillAlphaRect(draw_rect, m_ui->GetUIColors().color_back, alpha); - } + //绘制一层半透明的黑色背景 + if (!m_is_full_fill) + { + BYTE alpha = ALPHA_CHG(theApp.m_app_setting_data.background_transparency); + m_ui->GetDrawer().FillAlphaRect(draw_rect, m_ui->GetUIColors().color_back, alpha); + } - //绘制面板背景 - if (!IsFullFill()) - { - BYTE alpha = 255; - if (m_ui->IsDrawBackgroundAlpha()) - alpha = 255 - (255 - alpha) / 2; + //绘制面板背景 + if (!IsFullFill()) + { + BYTE alpha = 255; + if (m_ui->IsDrawBackgroundAlpha()) + alpha = 255 - (255 - alpha) / 2; - CRect draw_rect = m_ui->GetClientDrawRect(); - //当面板的四个边都没有帖靠UI绘图矩形区域时,才绘制圆角矩形 - bool draw_round_background = m_panel_rect.left != draw_rect.left && m_panel_rect.top != draw_rect.top && m_panel_rect.right != draw_rect.right && m_panel_rect.bottom != draw_rect.bottom; - if (theApp.m_app_setting_data.button_round_corners && draw_round_background) - m_ui->GetDrawer().DrawRoundRect(m_panel_rect, m_ui->GetUIColors().color_back, m_ui->CalculateRoundRectRadius(m_panel_rect), alpha); - else - m_ui->GetDrawer().FillAlphaRect(m_panel_rect, m_ui->GetUIColors().color_back, alpha, true); - } + CRect draw_rect = m_ui->GetClientDrawRect(); + //当面板的四个边都没有帖靠UI绘图矩形区域时,才绘制圆角矩形 + bool draw_round_background = m_panel_rect.left != draw_rect.left && m_panel_rect.top != draw_rect.top && m_panel_rect.right != draw_rect.right && m_panel_rect.bottom != draw_rect.bottom; + if (theApp.m_app_setting_data.button_round_corners && draw_round_background) + m_ui->GetDrawer().DrawRoundRect(m_panel_rect, m_ui->GetUIColors().color_panel_back, m_ui->CalculateRoundRectRadius(m_panel_rect), alpha); + else + m_ui->GetDrawer().FillAlphaRect(m_panel_rect, m_ui->GetUIColors().color_panel_back, alpha, true); + } - //绘制面板 - m_root_element->Draw(); - m_root_element->DrawTopMost(); - } + //绘制面板 + m_root_element->Draw(); + m_root_element->DrawTopMost(); + } } std::shared_ptr CPlayerUIPanel::GetRootElement() const { - return m_root_element; + return m_root_element; } bool CPlayerUIPanel::IsFullFill() const { - return m_is_full_fill; + return m_is_full_fill; } diff --git a/MusicPlayer2/UIPanel/TestPanel.cpp b/MusicPlayer2/UIPanel/TestPanel.cpp index 8bcb6bcf..acec7b22 100644 --- a/MusicPlayer2/UIPanel/TestPanel.cpp +++ b/MusicPlayer2/UIPanel/TestPanel.cpp @@ -3,95 +3,115 @@ #include "UserUi.h" CTestPanel::CTestPanel(CPlayerUIBase* ui) - : CPlayerUIPanel(ui, IDR_TEST_PANEL) + : CPlayerUIPanel(ui, IDR_TEST_PANEL) { - m_ok_btn = m_root_element->FindElement("okBtn"); - if (m_ok_btn != nullptr) - m_ok_btn->SetClickedTrigger([&](UiElement::Button* sender) { OnOkClicked(sender); }); + m_ok_btn = m_root_element->FindElement("okBtn"); + if (m_ok_btn != nullptr) + m_ok_btn->SetClickedTrigger([&](UiElement::Button* sender) { OnOkClicked(sender); }); - m_cancel_btn = m_root_element->FindElement("cancelBtn"); - if (m_cancel_btn != nullptr) - m_cancel_btn->SetClickedTrigger([&](UiElement::Button* sender) { OnCancelClicked(sender); }); + m_cancel_btn = m_root_element->FindElement("cancelBtn"); + if (m_cancel_btn != nullptr) + m_cancel_btn->SetClickedTrigger([&](UiElement::Button* sender) { OnCancelClicked(sender); }); - m_check_box1 = m_root_element->FindElement("checkbox1"); - if (m_check_box1 != nullptr) - m_check_box1->SetClickedTrigger([&](UiElement::AbstractToggleButton* sender) { OnCheckBox1Clicked(sender); }); + m_check_box1 = m_root_element->FindElement("checkbox1"); + if (m_check_box1 != nullptr) + m_check_box1->SetClickedTrigger([&](UiElement::AbstractToggleButton* sender) { OnCheckBox1Clicked(sender); }); - m_toggle_btn = m_root_element->FindElement("toggleBtn1")->GetToggleBtn(); - if (m_toggle_btn != nullptr) - m_toggle_btn->SetClickedTrigger([&](UiElement::AbstractToggleButton* sender) { OnToggleBtnClicked(sender); }); - m_toggle_btn->SetChecked(true); + m_toggle_btn = m_root_element->FindElement("toggleBtn1")->GetToggleBtn(); + if (m_toggle_btn != nullptr) + m_toggle_btn->SetClickedTrigger([&](UiElement::AbstractToggleButton* sender) { OnToggleBtnClicked(sender); }); + m_toggle_btn->SetChecked(true); - m_radio1 = m_root_element->FindElement("radio1"); - m_radio2 = m_root_element->FindElement("radio2"); - m_toggle_group2 = m_root_element->FindElement("toggleBtn2"); + m_radio1 = m_root_element->FindElement("radio1"); + m_radio2 = m_root_element->FindElement("radio2"); + m_toggle_group2 = m_root_element->FindElement("toggleBtn2"); - m_combobox1 = m_root_element->FindElement("combobox1"); - m_combobox1->AddString(L"测试下拉项1"); - m_combobox1->AddString(L"测试下拉项2"); - m_combobox1->AddString(L"测试下拉项3"); - m_combobox1->SetCurSel(0); + m_combobox1 = m_root_element->FindElement("combobox1"); + m_combobox1->SetSelectionChangedTrigger([&](UiElement::ComboBox* sender) { + OnComboboxSelChanged(sender); + }); + m_combobox1->AddString(L"测试下拉项1"); + m_combobox1->AddString(L"测试下拉项2"); + m_combobox1->AddString(L"测试下拉项3"); + m_combobox1->SetCurSel(0); - m_text1 = m_root_element->FindElement("text1"); - m_text2 = m_root_element->FindElement("text2"); - m_list1 = m_root_element->FindElement("list1"); - m_list1->SetColumnCount(2); - m_list1->SetColumnWidth(0, ui->DPI(80)); + m_tip_info_text = m_root_element->FindElement("tipInfoText"); + if (m_list1 != nullptr) + { + m_list1 = m_root_element->FindElement("list1"); + m_list1->SetColumnCount(2); + m_list1->SetColumnWidth(0, ui->DPI(80)); + } - auto* add_btn = m_root_element->FindElement("addBtn"); - add_btn->SetClickedTrigger([&](UiElement::Button* sender) { OnAddClicked(sender); }); - auto* del_btn = m_root_element->FindElement("deleteBtn"); - del_btn->SetClickedTrigger([&](UiElement::Button* sender) { OnDeleteClicked(sender); }); + auto* add_btn = m_root_element->FindElement("addBtn"); + if (add_btn != nullptr) + add_btn->SetClickedTrigger([&](UiElement::Button* sender) { OnAddClicked(sender); }); + auto* del_btn = m_root_element->FindElement("deleteBtn"); + if (del_btn != nullptr) + del_btn->SetClickedTrigger([&](UiElement::Button* sender) { OnDeleteClicked(sender); }); } void CTestPanel::OnOkClicked(UiElement::Button* sender) { - m_ui->ShowUiTipInfo(L"点击了应用按钮。"); + m_ui->ShowUiTipInfo(L"点击了应用按钮。"); } void CTestPanel::OnCancelClicked(UiElement::Button* sender) { - CUserUi* user_ui = dynamic_cast(m_ui); - user_ui->ClosePanel(); + CUserUi* user_ui = dynamic_cast(m_ui); + user_ui->ClosePanel(); } void CTestPanel::OnCheckBox1Clicked(UiElement::AbstractToggleButton* sender) { - bool checked = m_check_box1->Checked(); - if (checked) - m_text1->SetText(_T("复选框已勾选。")); - else - m_text1->SetText(_T("复选框取消勾选。")); + bool checked = m_check_box1->Checked(); + if (checked) + m_tip_info_text->SetText(_T("复选框已勾选。")); + else + m_tip_info_text->SetText(_T("复选框取消勾选。")); } void CTestPanel::OnToggleBtnClicked(UiElement::AbstractToggleButton* sender) { - bool checked = sender->Checked(); - if (checked) - m_text2->SetText(_T("控件已启用")); - else - m_text2->SetText(_T("控件已禁用")); + bool checked = sender->Checked(); + if (checked) + m_tip_info_text->SetText(_T("控件已启用")); + else + m_tip_info_text->SetText(_T("控件已禁用")); - //设置控件启用禁用状态 - m_check_box1->SetEnable(checked); - m_radio1->SetEnable(checked); - m_radio2->SetEnable(checked); - m_toggle_group2->SetEnable(checked); + //设置控件启用禁用状态 + m_check_box1->SetEnable(checked); + m_radio1->SetEnable(checked); + m_radio2->SetEnable(checked); + m_toggle_group2->SetEnable(checked); + m_combobox1->SetEnable(checked); } void CTestPanel::OnAddClicked(UiElement::Button* sender) { - std::map row_data; - int row = m_list1->GetRowCount(); - row_data[0] = std::to_wstring(row + 1); - row_data[1] = L"第" + std::to_wstring(row + 1) + L"行"; - m_list1->AddRow(row_data); + if (m_list1 != nullptr) + { + std::map row_data; + int row = m_list1->GetRowCount(); + row_data[0] = std::to_wstring(row + 1); + row_data[1] = L"第" + std::to_wstring(row + 1) + L"行"; + m_list1->AddRow(row_data); + } } void CTestPanel::OnDeleteClicked(UiElement::Button* sender) { - int row = m_list1->GetItemSelected(); - if (row >= 0 && row < m_list1->GetRowCount()) - m_list1->DeleteRow(row); + if (m_list1 != nullptr) + { + int row = m_list1->GetItemSelected(); + if (row >= 0 && row < m_list1->GetRowCount()) + m_list1->DeleteRow(row); + } +} + +void CTestPanel::OnComboboxSelChanged(UiElement::ComboBox* sender) +{ + std::wstring str_combo = m_combobox1->GetCurString(); + m_tip_info_text->SetText(L"下拉框当前选择:" + str_combo); } diff --git a/MusicPlayer2/UIPanel/TestPanel.h b/MusicPlayer2/UIPanel/TestPanel.h index 6b8ac88e..00f65fba 100644 --- a/MusicPlayer2/UIPanel/TestPanel.h +++ b/MusicPlayer2/UIPanel/TestPanel.h @@ -12,28 +12,28 @@ class CTestPanel : public CPlayerUIPanel { public: - CTestPanel(CPlayerUIBase* ui); + CTestPanel(CPlayerUIBase* ui); private: - void OnOkClicked(UiElement::Button* sender); - void OnCancelClicked(UiElement::Button* sender); - void OnCheckBox1Clicked(UiElement::AbstractToggleButton* sender); - void OnToggleBtnClicked(UiElement::AbstractToggleButton* sender); - void OnAddClicked(UiElement::Button* sender); - void OnDeleteClicked(UiElement::Button* sender); + void OnOkClicked(UiElement::Button* sender); + void OnCancelClicked(UiElement::Button* sender); + void OnCheckBox1Clicked(UiElement::AbstractToggleButton* sender); + void OnToggleBtnClicked(UiElement::AbstractToggleButton* sender); + void OnAddClicked(UiElement::Button* sender); + void OnDeleteClicked(UiElement::Button* sender); + void OnComboboxSelChanged(UiElement::ComboBox* sender); private: - UiElement::Button* m_ok_btn{}; - UiElement::Button* m_cancel_btn{}; - UiElement::ToggleButton* m_toggle_btn{}; - UiElement::CheckBox* m_check_box1{}; - UiElement::RadioButton* m_radio1{}; - UiElement::RadioButton* m_radio2{}; - UiElement::ToggleSettingGroup* m_toggle_group2{}; - UiElement::Text* m_text1{}; - UiElement::Text* m_text2{}; - UiElement::ComboBox* m_combobox1{}; + UiElement::Button* m_ok_btn{}; + UiElement::Button* m_cancel_btn{}; + UiElement::ToggleButton* m_toggle_btn{}; + UiElement::CheckBox* m_check_box1{}; + UiElement::RadioButton* m_radio1{}; + UiElement::RadioButton* m_radio2{}; + UiElement::ToggleSettingGroup* m_toggle_group2{}; + UiElement::Text* m_tip_info_text{}; + UiElement::ComboBox* m_combobox1{}; - UiElement::ListElement* m_list1{}; + UiElement::ListElement* m_list1{}; }; diff --git a/MusicPlayer2/res/ui/test_panel.xml b/MusicPlayer2/res/ui/test_panel.xml index fdd35fc5..c41a8dff 100644 --- a/MusicPlayer2/res/ui/test_panel.xml +++ b/MusicPlayer2/res/ui/test_panel.xml @@ -4,8 +4,10 @@ + + - + @@ -17,7 +19,6 @@ - @@ -31,12 +32,10 @@ - - - +