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

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

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

Спасибо! :)


person Konrad    schedule 24.09.2008    source источник
comment
Спасибо за ответы, но может ли кто-нибудь привести конкретный пример? Спасибо   -  person Konrad    schedule 24.09.2008
comment
Какую версию Visual Studio вы используете?   -  person Rob    schedule 24.09.2008


Ответы (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);
}
person Rob    schedule 24.09.2008

Окно получает сообщение 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);
}
person Serge    schedule 24.09.2008

GetDlgItem (IDC_your_slidebar) -> SetWindowPos (...) // на самом деле вы можете перемещать, изменять размер ... и т. Д.

person Eddie    schedule 24.09.2008

SetWindowPos - немного сложнее для этой цели. В MoveWindow есть все, что нужно.

person ravenspoint    schedule 24.09.2008

Другие указали, что WM_SIZE - это сообщение, которое вы должны обработать и изменить размер дочерних элементов управления на этом этапе. WM_SIZE отправляется после завершения изменения размера.

Вы также можете обработать сообщение WM_SIZING, которое отправляется во время изменения размера. Это позволит вам активно изменять размер дочерних окон, пока пользователь все еще перетаскивает мышь. Обработка WM_SIZING не является строго обязательной, но она может улучшить взаимодействие с пользователем.

person Brian Ensink    schedule 24.09.2008

Я использую класс CResize из CodeGuru для автоматического изменения размеров всех элементов управления. Вы говорите, как вы хотите изменить размер каждого элемента управления, и он выполняет свою работу за вас.

Парадигма изменения размера заключается в том, чтобы указать, насколько каждая сторона элемента управления будет перемещаться при изменении размера диалогового окна.

SetResize(IDC_EDIT1, 0,   0,   0.5, 1);
SetResize(IDC_EDIT2, 0.5, 0,   1,   1);

Очень удобно при большом количестве диалоговых элементов управления.

Исходный код

person Sergey Kornilov    schedule 24.09.2008

Когда дело доходит до изменения размера окна, вас могут заинтересовать три оконных сообщения: 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; и если вы хотите получить изменения размера в реальном времени, вы можете обратиться к двум другим сообщениям.

person nUOs    schedule 08.01.2019

Лучше использовать возможности динамического макета каждого элемента управления в разделе «Свойство».

Допустим, вы хотите иметь определенный элемент управления, например заголовок, всегда в центре представления / диалогового окна, затем вы просто выбираете свойства динамического макета элемента управления, перемещение типа по горизонтали и перемещение X как 50, но вы продолжаете изменять размер на Нет. Таким образом, когда вы изменяете размер представления, заголовок всегда остается в центре. Вы должны иметь в виду, что минимум изменения размера / перемещения - это размер / положение элемента управления в диалоговом окне / представлении, когда вы создавали его в представлении ресурсов.

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

person DevMat    schedule 14.10.2020