Skip to content

Commit

Permalink
自动调整播放列表上方控件的大小
Browse files Browse the repository at this point in the history
  • Loading branch information
zhongyang219 committed Jul 11, 2024
1 parent 2da1a15 commit 125e011
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 22 deletions.
13 changes: 5 additions & 8 deletions MusicPlayer2/CFloatPlaylistDlg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,12 @@ void CFloatPlaylistDlg::ReSizeControl(int cx, int cy)
CRect rect_base{ m_layout.margin, m_layout.margin, cx - m_layout.margin, cy - m_layout.margin };

// 设置IDC_PATH_STATIC/IDC_PATH_EDIT/ID_MEDIA_LIB的位置和大小
int static_width = theApp.DPI(32);
CMusicPlayerDlg* pDlg = dynamic_cast<CMusicPlayerDlg*>(theApp.m_pMainWnd);
if (pDlg != nullptr)
static_width = pDlg->GetPathStaticWidth();
int edit_height = m_layout.path_edit_height;
CRect rect_static{ rect_base.left, rect_base.top, rect_base.left + max(m_part_static_playlist_width, m_part_static_folder_width), rect_base.top + edit_height };
CRect rect_static{ rect_base.left, rect_base.top, rect_base.left + static_width, rect_base.top + edit_height };
CRect rect_media_lib{ rect_base.right - m_medialib_btn_width, rect_base.top - 1, rect_base.right, rect_base.top + edit_height + 1 };
CRect rect_edit{ rect_static.right + m_layout.margin, rect_base.top, rect_media_lib.left - m_layout.margin, rect_base.top + edit_height };
m_path_static.MoveWindow(rect_static);
Expand Down Expand Up @@ -174,15 +178,8 @@ bool CFloatPlaylistDlg::InitializeControls()
SetWindowTextW(theApp.m_str_table.LoadText(L"TXT_PLAYLIST").c_str());
// 测量受翻译字符串影响的控件所需宽度,并应用翻译字符串到控件
CString text;
// "播放列表:"宽度(含图标)
text = theApp.m_str_table.LoadText(L"UI_TXT_PLAYLIST").c_str();
int playlist_width = (std::min)(GetTextExtent(text).Width() + theApp.DPI(20), theApp.DPI(150));
m_part_static_playlist_width = (std::max)(m_part_static_playlist_width, playlist_width);
// "文件夹:"宽度(含图标)
text = theApp.m_str_table.LoadText(L"UI_TXT_FOLDER").c_str();
m_path_static.SetWindowTextW(text);
int folder_width = (std::min)(GetTextExtent(text).Width() + theApp.DPI(20), theApp.DPI(150));
m_part_static_folder_width = (std::max)(m_part_static_folder_width, folder_width);
// 媒体库按钮宽度
text = theApp.m_str_table.LoadText(L"UI_TXT_BTN_MEDIA_LIB").c_str();
m_media_lib_button.SetWindowTextW(text);
Expand Down
2 changes: 0 additions & 2 deletions MusicPlayer2/CFloatPlaylistDlg.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,6 @@ class CFloatPlaylistDlg : public CBaseDialog
CPlayerToolBar m_playlist_toolbar;

SLayoutData m_layout; //窗口布局的固定数据
int m_part_static_playlist_width{ theApp.DPI(32) }; // 这里的值是最小宽度,窗口init时会根据文字变大
int m_part_static_folder_width{ theApp.DPI(32) }; // 这里的值是最小宽度,窗口init时会根据文字变大
int m_medialib_btn_width{ theApp.DPI(64) }; // 这里的值是最小宽度,窗口init时会根据文字变大

bool m_searched{ false }; //播放列表是否处于搜索状态
Expand Down
51 changes: 41 additions & 10 deletions MusicPlayer2/MusicPlayerDlg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -765,7 +765,7 @@ void CMusicPlayerDlg::SetPlaylistSize(int cx, int cy, int playlist_width)

// 设置IDC_PATH_STATIC/IDC_PATH_EDIT/ID_MEDIA_LIB的位置和大小
int edit_height = m_layout.path_edit_height;
CRect rect_static{ rect_base.left, rect_base.top, rect_base.left + max(m_part_static_playlist_width, m_part_static_folder_width), rect_base.top + edit_height };
CRect rect_static{ rect_base.left, rect_base.top, rect_base.left + m_part_static_width, rect_base.top + edit_height};
CRect rect_media_lib{ rect_base.right - m_medialib_btn_width, rect_base.top - 1, rect_base.right, rect_base.top + edit_height + 1 };
CRect rect_edit{ rect_static.right + m_layout.margin, rect_base.top, rect_media_lib.left - m_layout.margin, rect_base.top + edit_height };
m_path_static.MoveWindow(rect_static);
Expand Down Expand Up @@ -2062,17 +2062,8 @@ BOOL CMusicPlayerDlg::OnInitDialog()
CRect text_size;
CDC* pDC = GetDC();
pDC->SelectObject(&theApp.m_font_set.dlg.GetFont());
// "播放列表:"宽度(含图标)
text = theApp.m_str_table.LoadText(L"UI_TXT_PLAYLIST").c_str();
pDC->DrawTextW(text, &text_size, DT_CALCRECT);
if (m_part_static_playlist_width < text_size.Width() + theApp.DPI(20))
m_part_static_playlist_width = min(text_size.Width() + theApp.DPI(20), theApp.DPI(150));
// "文件夹:"宽度(含图标)
text = theApp.m_str_table.LoadText(L"UI_TXT_FOLDER").c_str();
m_path_static.SetWindowTextW(text);
pDC->DrawTextW(text, &text_size, DT_CALCRECT);
if (m_part_static_folder_width < text_size.Width() + theApp.DPI(20))
m_part_static_folder_width = min(text_size.Width() + theApp.DPI(20), theApp.DPI(150));
// 媒体库按钮宽度
text = theApp.m_str_table.LoadText(L"UI_TXT_BTN_MEDIA_LIB").c_str();
m_media_lib_button.SetWindowTextW(text);
Expand Down Expand Up @@ -4098,6 +4089,10 @@ afx_msg LRESULT CMusicPlayerDlg::OnPlaylistIniComplate(WPARAM wParam, LPARAM lPa
}
}

m_part_static_width = UpdatePlaylistCtrlPosition(this, &m_path_static, &m_path_edit);
if (IsFloatPlaylistExist())
UpdatePlaylistCtrlPosition(m_pFloatPlaylistDlg, &m_pFloatPlaylistDlg->GetPathStatic(), &m_pFloatPlaylistDlg->GetPathEdit());

return 0;
}

Expand Down Expand Up @@ -6422,6 +6417,42 @@ bool CMusicPlayerDlg::IsPointValid(CPoint point)
return (point.x != INT_MAX && point.y != INT_MAX && point.x != INT_MIN && point.y != INT_MAX);
}

int CMusicPlayerDlg::UpdatePlaylistCtrlPosition(CWnd* pParent, CWnd* pStatic, CWnd* pEdit)
{
if (!IsWindow(pParent->GetSafeHwnd()) || !IsWindow(pStatic->GetSafeHwnd()) || !IsWindow(pEdit->GetSafeHwnd()))
return 0;

//计算CStatic控件的宽度
int static_width = theApp.DPI(20);
std::wstring static_text;
if (CPlayer::GetInstance().IsFolderMode())
static_text = theApp.m_str_table.LoadText(L"UI_TXT_FOLDER");
else if (CPlayer::GetInstance().IsPlaylistMode())
static_text = theApp.m_str_table.LoadText(L"UI_TXT_PLAYLIST");
else if (CPlayer::GetInstance().IsMediaLibMode())
static_text = CMediaLibPlaylistMgr::GetTypeName(CPlayer::GetInstance().GetMediaLibPlaylistType());
CDC* pDC = pParent->GetDC();
pDC->SelectObject(&theApp.m_font_set.dlg.GetFont());
static_width += pDC->GetTextExtent(static_text.c_str()).cx;
pParent->ReleaseDC(pDC);

if (!static_text.empty())
static_width += theApp.DPI(4);

//获取两个控件原来的位置
CRect static_rect;
CRect edit_rect;
pStatic->GetWindowRect(static_rect);
pEdit->GetWindowRect(edit_rect);
pParent->ScreenToClient(&static_rect);
pParent->ScreenToClient(&edit_rect);
//计算static控件原来的宽度和要设置的宽度的差
int width_diff = static_rect.Width() - static_width;
pStatic->SetWindowPos(nullptr, 0, 0, static_width, static_rect.Height(), SWP_NOMOVE | SWP_NOZORDER);
pEdit->SetWindowPos(nullptr, edit_rect.left - width_diff, edit_rect.top, edit_rect.Width() + width_diff, edit_rect.Height(), SWP_NOZORDER);
return static_width;
}

afx_msg LRESULT CMusicPlayerDlg::OnRecentFolderOrPlaylistChanged(WPARAM wParam, LPARAM lParam)
{
//初始化点击文件夹/播放列表右侧按钮弹出的菜单
Expand Down
5 changes: 3 additions & 2 deletions MusicPlayer2/MusicPlayerDlg.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,7 @@ class CMusicPlayerDlg : public CMainDialogBase
int m_window_height; //窗口的高度
CPoint m_desktop_lyric_pos{ -1, -1 }; //桌面歌词窗口的位置
CSize m_desktop_lyric_size{ 0, 0 };
int m_part_static_playlist_width{ theApp.DPI(32) }; // 这里的值是最小宽度,窗口init时会根据文字变大
int m_part_static_folder_width{ theApp.DPI(32) }; // 这里的值是最小宽度,窗口init时会根据文字变大
int m_part_static_width{ theApp.DPI(32) }; // 这里的值是最小宽度,窗口init时会根据文字变大
int m_medialib_btn_width{ theApp.DPI(64) }; // 这里的值是最小宽度,窗口init时会根据文字变大

SLayoutData m_layout; //窗口布局的固定数据
Expand Down Expand Up @@ -206,6 +205,8 @@ class CMusicPlayerDlg : public CMainDialogBase
void SetUiPlaylistSelected(int index);

static bool IsPointValid(CPoint);
static int UpdatePlaylistCtrlPosition(CWnd* pParent, CWnd* pStatic, CWnd* pEdit); //更新播放列表上方的CStatic和CEdit控件的大小和位置,返回CStatic的宽度
int GetPathStaticWidth() const { return m_part_static_width; }

protected:
void SetPlayListColor(bool highlight_visible = true);
Expand Down

0 comments on commit 125e011

Please sign in to comment.