2008-09-24 6 views
12

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

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

Спасибо! :)

+0

Спасибо за ответы, но кто-то может быть более конкретным с примером? Спасибо – Konrad 2008-09-24 14:37:12

ответ

8

Когда ваш кадр получает сообщение 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); 
} 
3

SetWindowPos немного сверхмощный для этой цели. У MoveWindow есть только то, что необходимо.

5

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

10

Окно получает WM_SIZE сообщение (которое обрабатывается обработчиком OnSize в MFC) сразу после него был изменен, поэтому CEdit :: OnSize - это не то, что вы ищете.

Вы должны добавить обработчик OnSize в свой класс фрейма и внутри этого обработчика, как Rob pointed out, вы получите ширину и высоту клиентской области вашего кадра, тогда вы должны добавить код, который регулирует размер и положение вашего элемента управления.

Что-то вроде этого

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 veriable CEdit myEdit which you need to resize/more 
    myEdit.MoveWindow(w/5, h/5, w/2, h/2); 
} 
1

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

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

1

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

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

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

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

Source code

Смежные вопросы