Правильный способ сделать динамическое позиционирование CSplitterWnd на WM_SIZE (MFC)

В моем приложении MDI у меня есть элемент управления CSplitterWnd с 1 строкой и 2 столбцами, он просто делит клиентскую область на 2 вертикальных представления. Вид слева (панель) занимает 1/4 от ClientRect, это начальная позиция разделительной панели, и ее можно изменить (изменить размер). Теперь, когда я изменяю размер главного окна, я хочу, чтобы разделительная панель сразу следовала за новым измененным размером окна pos (динамическая разделительная панель). Как мне сделать это сейчас?

void CChildFrame::OnSize(UINT nType, int cx, int cy)
{
    int currentWidth, _min;

    m_MainSplitter.GetColumnInfo(0, currentWidth, _min);
    double newWidth = cx / ((double)m_cx / (double)currentWidth) + 0.5;
    m_MainSplitter.SetColumnInfo(0, newWidth, _min);

    m_cx=cx
}

Таким образом, в основном каждый WM_SIZE я вычисляю отношение положения разделителя в предыдущем (m_cx) размере окна, а затем просто применяю это соотношение в новом (cx) размере окна. Затем новый cx стал старым m_cx (m_cx=cx). Это работает довольно хорошо, за исключением одного:

При многократном изменении размера главного окна положение сплиттера может меняться на +-10-20 пикселей. В первой итерации изменения размера левый вид (панель) может иметь ширину 300 пикселей. Затем мы изменяем размер вперед и назад, и левый вид может иметь ширину 310 или 290 пикселей. Его размер вращается вокруг некоторой точки, но в некоторых сторонних приложениях я могу заметить, что сплиттеры работают точно - пиксель за пикселем при каждом изменении размера. Я предполагаю, что это некоторые ошибки в моих расчетах.

Итак, вопрос в том, как правильно обрабатывать динамическое изменение размера (масштабирование).

0 ответов

Другие вопросы по тегам