Правильный способ сделать динамическое позиционирование 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 пикселей. Его размер вращается вокруг некоторой точки, но в некоторых сторонних приложениях я могу заметить, что сплиттеры работают точно - пиксель за пикселем при каждом изменении размера. Я предполагаю, что это некоторые ошибки в моих расчетах.
Итак, вопрос в том, как правильно обрабатывать динамическое изменение размера (масштабирование).