когда плейлист прилеплен сбоку и включена опция "Соотношение сторон окна как у видеокадра" - размер окна определяется неправильно.
Размеры DockedBars вычисляются в void CMainFrame::CalcControlsSize(CSize& cSize)
Не понял что там, как и зачем сейчас вычисляется, но логика подсчетов размеров баров должна быть проста, а именно:
- перебираем все видимые панели
- если панель снизу/сверху (горизонтальная) - считаем только высоту
- если панель слева/справа(вертикальная) - считаем только ширину
- суммируем размеры всех панелей и передаем значения дальше, где уже подгоняем размеры окна (с учетом размеров панелей) под видеокадр
функция должна выглядеть где то так:
void CMainFrame::CalcControlsSize(CSize& cSize)
{
cSize.SetSize(0, 0);
for (const auto& pBar : m_bars) {
if (IsWindow(pBar->m_hWnd) && pBar->IsVisible()) {
cSize.cy += pBar->CalcFixedLayout(TRUE, TRUE).cy; // все m_bars только горизонтальные, поэтому находим их высоту
}
}
for (const auto& pDockingBar : m_dockingbars) {
if (IsWindow(pDockingBar->m_hWnd)) {
BOOL bIsWindowVisible = pDockingBar->IsWindowVisible();
if (auto* playlistBar = dynamic_cast(pDockingBar)) {
bIsWindowVisible = playlistBar->IsPlaylistVisible();
}
if (bIsWindowVisible && !pDockingBar->IsFloating()) {
if (pDockingBar->IsHorzDocked()) { // если горизонтальная панель
cSize.cy += pDockingBar->CalcFixedLayout(TRUE, TRUE).cy - GetSystemMetrics(SM_CYBORDER); // находим ее высоту
}
else if (pDockingBar->IsVertDocked()) { // если вертикальная панель
cSize.cx += pDockingBar->CalcFixedLayout(TRUE, FALSE).cx - GetSystemMetrics(SM_CXBORDER); // находим ее ширину
}
}
}
}
}
и при таком раскладе начинает правильно все работать. Ну по крайней мере определение размеров окна с вертикальным плейлистом и опцией "Соотношение сторон окна как у видеокадра".
Может кто объяснить, почему:
- сейчас определение размеров баров вычисляется как то "замудренно"
- зачем нужна в функции CalcFixedLayout(BOOL bStretch, BOOL bHorz) параметр bStretch? В значении TRUE (которые мы используем (хотя и без надобности) передает "страшные" цифры (максимальный размер?) :) )
вот как выглядит функция в svn:
void CMainFrame::CalcControlsSize(CSize& cSize)
{
cSize.SetSize(0, 0);
for (const auto& pBar : m_bars) {
if (IsWindow(pBar->m_hWnd) && pBar->IsVisible()) {
cSize.cy += pBar->CalcFixedLayout(TRUE, TRUE).cy;
}
}
long HorzH = 0;
long VertH = 0;
for (const auto& pDockingBar : m_dockingbars) {
if (IsWindow(pDockingBar->m_hWnd)) {
BOOL bIsWindowVisible = pDockingBar->IsWindowVisible();
if (auto* playlistBar = dynamic_cast(pDockingBar)) {
bIsWindowVisible = playlistBar->IsPlaylistVisible();
}
if (bIsWindowVisible && !pDockingBar->IsFloating()) {
const CSize sizeHorz = pDockingBar->CalcFixedLayout(TRUE, TRUE);
if (pDockingBar->IsHorzDocked()) {
HorzH += sizeHorz.cy - GetSystemMetrics(SM_CYBORDER);
}
else if (pDockingBar->IsVertDocked()) {
cSize.cx += pDockingBar->CalcFixedLayout(TRUE, FALSE).cx;
if (sizeHorz.cy > VertH) {
VertH = sizeHorz.cy;
}
}
}
}
}
cSize.cy += std::max(HorzH, VertH);
}
Ну и в идеале, было бы логично делать пересчет размеров окна под видеокадр каждый раз при появлении/скрытии плейлиста во время воспроизведения (OnViewPlaylist()), а не только в момент запуска файла.
Залил изменения.