Изменение размера элементов управления в MFC
Я пишу программу, которая имеет две панели (через CSplitter
), однако у меня возникают проблемы с настройкой размера элементов управления в каждом кадре. Для простоты, может ли кто-нибудь сказать мне, как я буду делать это для базового кадра с помощью одного элемента управления CEdit
?
Я уверен, что это связано с функцией CEdit::OnSize()
... Но я ничего не понимаю...
Спасибо!:)
Ответы
Ответ 1
Когда ваш кадр получает сообщение OnSize, он даст вам новую ширину и высоту - вы можете просто вызвать метод CEdit SetWindowPos, передав ему эти значения.
Предположим, что CMyPane - это панель сплиттера, и она содержит CEdit, созданный в OnCreate с именем 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);
}
Ответ 2
Окно получает сообщение WM_SIZE (которое обрабатывается обработчиком OnSize в MFC) сразу после изменения его размера, поэтому CEdit :: OnSize - это не то, что вы ищете.
Вы должны добавить обработчик OnSize в свой класс фрейма и в этом обработчике, как указал Роб , вы получите ширину и высоту клиентской области вашего фрейма, затем вы должны добавить код, который регулирует размер и положение вашего элемента управления.
Что-то вроде этого
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);
}
Ответ 3
GetDlgItem (IDC_your_slidebar) → SetWindowPos (...)//на самом деле вы можете перемещать, изменять размер... и т.д.
Ответ 4
SetWindowPos для этой цели немного тяжелый. MoveWindow имеет только то, что необходимо.
Ответ 5
Другие указали, что WM_SIZE - это сообщение, которое вы должны обрабатывать и изменять размеры дочерних элементов управления в этой точке. WM_SIZE отправляется после завершения изменения размера.
Вы также можете обрабатывать сообщение WM_SIZING, которое отправляется во время изменения размера. Это позволит вам активно изменять размеры дочерних окон, пока пользователь по-прежнему перетаскивает мышь. Его не обязательно нужно обрабатывать WM_SIZING, но он может обеспечить лучший пользовательский интерфейс.
Ответ 6
Я использую класс CResize для CodeGuru для автоматического изменения всех элементов управления. Вы рассказываете, как вы хотите, чтобы каждый элемент управления был изменен, и он выполняет эту работу для вас.
Парадигма изменения размера заключается в том, чтобы указать, насколько каждая сторона элемента управления будет перемещаться при изменении размера диалога.
SetResize(IDC_EDIT1, 0, 0, 0.5, 1);
SetResize(IDC_EDIT2, 0.5, 0, 1, 1);
Очень удобно, когда у вас имеется большое количество элементов управления диалоговыми окнами.
Исходный код
Ответ 7
Когда дело доходит до изменения размера окна, вас могут заинтересовать три окна: 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
; и если вы хотите получить изменения размера в режиме реального времени, вы можете обратиться к двум другим сообщениям.