Я пишу программу с двумя панелями (через CSplitter), однако у меня возникают проблемы с определением размера элементов управления в каждом кадре. Для простоты, может кто-нибудь сказать мне, как я бы сделал это для базового фрейма с одним элементом управления CEdit?
Я почти уверен, что это связано с функцией CEdit::OnSize() ... Но я никуда не денусь ...
Спасибо! :)
Какую версию Visual Studio вы используете?





Когда ваш фрейм получит сообщение OnSize, он предоставит вам новую ширину и высоту - вы можете просто вызвать метод CEdit SetWindowPos, передав ему эти значения.
Предположим, что CMyPane - это ваша панель разделителя, и она содержит созданный вами в OnCreate CEdit под названием m_wndEdit:
void CMyPane::OnSize(UINT nType, int cx, int cy)
{
m_wndEdit.SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
}
SetWindowPos - это немного сложнее для этой цели. В MoveWindow есть все, что нужно.
GetDlgItem (IDC_your_slidebar) -> SetWindowPos (...) // на самом деле вы можете перемещать, изменять размер ... и т. д.
Окно получает сообщение WM_SIZE (которое обрабатывается обработчиком OnSize в MFC) сразу после изменения размера, поэтому CEdit :: OnSize - это не то, что вы ищете.
Вы должны добавить обработчик OnSize в свой класс фрейма и внутри этого обработчика, как Rob указал, вы получите ширину и высоту клиентской области вашего фрейма, затем вы должны добавить код, который регулирует размер и положение вашего элемента управления.
Что-то вроде этого
void MyFrame::OnSize(UINT nType, int w, int h)
{
// w and h parameters are new width and height of your frame
// suppose you have member variable CEdit myEdit which you need to resize/move
myEdit.MoveWindow(w/5, h/5, w/2, h/2);
}
Другие указали, что WM_SIZE - это сообщение, которое вы должны обработать и изменить размер дочерних элементов управления на этом этапе. WM_SIZE отправляется после завершения изменения размера.
Вы также можете обработать сообщение WM_SIZING, которое отправляется во время изменения размера. Это позволит вам активно изменять размер дочерних окон, пока пользователь все еще перетаскивает мышь. Обрабатывать WM_SIZING не обязательно, но это может обеспечить лучший пользовательский интерфейс.
Я использую класс CResize из CodeGuru для автоматического изменения размеров всех элементов управления. Вы говорите, как вы хотите изменить размер каждого элемента управления, и он выполняет свою работу за вас.
Парадигма изменения размера заключается в том, чтобы указать, насколько каждая сторона элемента управления будет перемещаться при изменении размера диалогового окна.
SetResize(IDC_EDIT1, 0, 0, 0.5, 1);
SetResize(IDC_EDIT2, 0.5, 0, 1, 1);
Очень удобно при большом количестве диалоговых элементов управления.
Что касается изменения размера окна, вас могут заинтересовать три оконных сообщения: ON_WM_SIZE(), ON_WM_SIZING() и ON_WM_GETMINMAXINFO().
Как говорит официальные документы:
ON_WM_SIZE, чей обработчик сообщений - ::OnSize(), запускается после изменения размера CWnd;ON_WM_SIZING, обработчик сообщений которого является ::OnSizing(), запускается при изменении размера клиентской области окна программы просмотра клипборда;ON_WM_GETMINMAXINFO, чей обработчик сообщений - ::OnGetMinMaxInfo(), запускается всякий раз, когда окну необходимо знать развернутую позицию или размеры, или минимальный или максимальный размер отслеживания.Если вы хотите ограничить размер cwnd некоторым диапазоном, вы можете обратиться к сообщению ON_WM_GETMINMAXINFO; и если вы хотите получить изменения размера в реальном времени, вы можете обратиться к двум другим сообщениям.
Лучше использовать возможности динамического макета каждого элемента управления в разделе «Свойство».
Допустим, вы хотите, чтобы определенный элемент управления, например заголовок, всегда находился в центре представления / диалогового окна, затем вы просто выбираете свойства динамического макета элемента управления, перемещение типа по горизонтали и перемещение X как 50, но вы продолжаете изменять размер на Нет. Таким образом, когда вы изменяете размер представления, заголовок всегда остается в центре. Вы должны иметь в виду, что минимум изменения размера / перемещения - это размер / положение элемента управления в диалоговом окне / представлении, когда вы создавали его в представлении ресурсов.
Таким образом, вы избавитесь от бремени геометрии и преобразований.
Спасибо за ответы, но может ли кто-нибудь привести конкретный пример? Спасибо