Подтвердить что ты не робот

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

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

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

Спасибо!:)

4b9b3361

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