1 (изменено: judelaw, 2018-12-18 10:36:25)

Тема: Неверное определение размеров в CalcControlsSize() [Исправлено]

когда плейлист прилеплен сбоку и включена опция "Соотношение сторон окна как у видеокадра" - размер окна определяется неправильно.

Размеры 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<CPlayerPlaylistBar*>(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 (которые мы используем (хотя и без надобности) передает "страшные" цифры (максимальный размер?) smile )

вот как выглядит функция в 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<CPlayerPlaylistBar*>(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()), а не только в момент запуска файла.

2

Re: Неверное определение размеров в CalcControlsSize() [Исправлено]

Залил изменения.

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215