Изменение размера элементов управления в MFC

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

Я почти уверен, что это связано с функцией CEdit::OnSize() ... Но я никуда не денусь ...

Спасибо! :)

Спасибо за ответы, но может ли кто-нибудь привести конкретный пример? Спасибо

Konrad 24.09.2008 18:37

Какую версию Visual Studio вы используете?

Rob 24.09.2008 18:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
14
2
37 751
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Ответ принят как подходящий

Когда ваш фрейм получит сообщение 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, но вы продолжаете изменять размер на Нет. Таким образом, когда вы изменяете размер представления, заголовок всегда остается в центре. Вы должны иметь в виду, что минимум изменения размера / перемещения - это размер / положение элемента управления в диалоговом окне / представлении, когда вы создавали его в представлении ресурсов.

Таким образом, вы избавитесь от бремени геометрии и преобразований.

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