我正在编写一个包含两个窗格(通过CSplitter
)的程序,但是我在确定每个框架中调整控件大小时遇到了问题。为简单起见,有人可以告诉我如何使用单个CEdit
控件进行基本框架吗?
我很确定它与CEdit::OnSize()
功能有关......但我真的没有到达任何地方......
谢谢! :)
答案 0 :(得分:11)
一个窗口在调整大小后立即接收WM_SIZE消息(由MFC中的OnSize处理程序处理),因此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 variable CEdit myEdit which you need to resize/move
myEdit.MoveWindow(w/5, h/5, w/2, h/2);
}
答案 1 :(得分:9)
当你的帧收到一个OnSize消息时,它会给你新的宽度和高度 - 你可以简单地调用CEdit SetWindowPos方法传递这些值。
假设CMyPane是您的拆分器窗格,它包含您在OnCreate中创建的名为m_wndEdit的CEdit:
void CMyPane::OnSize(UINT nType, int cx, int cy)
{
m_wndEdit.SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
}
答案 2 :(得分:5)
GetDlgItem(IDC_your_slidebar) - > SetWindowPos(...)//实际上你可以移动,调整大小......等等
答案 3 :(得分:3)
SetWindowPos对于此目的来说有点重要。 MoveWindow正是需要的。
答案 4 :(得分:2)
其他人已经指出WM_SIZE是你应该处理的消息,并在那时调整子控件的大小。调整大小完成后发送WM_SIZE。
您可能还希望处理在调整大小正在进行时发送的WM_SIZING消息。这将允许您在用户仍在拖动鼠标时主动调整子窗口的大小。它不是处理WM_SIZING所必需的,但它可以提供更好的用户体验。
答案 5 :(得分:1)
我使用CodeGuru的CResize类自动调整所有控件的大小。您告诉您希望如何调整每个控件的大小,并为您完成工作。
调整大小范例是指定在调整对话框大小时控件的每一边移动的程度。
SetResize(IDC_EDIT1, 0, 0, 0.5, 1);
SetResize(IDC_EDIT2, 0.5, 0, 1, 1);
当你有大量的对话框控件时非常方便。
答案 6 :(得分:0)
关于窗口大小的更改,您可能会对以下三种窗口消息感兴趣:ON_WM_SIZE()
,ON_WM_SIZING()
和ON_WM_GETMINMAXINFO()
。
ON_WM_SIZE
的::OnSize()
; ON_WM_SIZING
的::OnSizing()
; ON_WM_GETMINMAXINFO
的::OnGetMinMaxInfo()
。如果要将cwnd
的大小限制在某个范围内,可以参考消息ON_WM_GETMINMAXINFO
;如果您想实时获取尺寸变化,则可以参考其他两条消息。
答案 7 :(得分:0)
最好在“属性”部分使用每个控件的“动态布局”功能。
假设您要在视图/对话框的中心始终拥有一个特定的控件(例如标题),然后只需选择控件的“动态布局”属性,将“移动类型”设置为“水平”并将“移动X”设置为50,但您将尺寸调整为无。这样,当您调整视图大小时,标题始终保持在中心。您必须记住,在资源视图中设计控件/对话框时,其最小尺寸/移动是对话框/视图中控件的尺寸/位置。
这样,您可以节省几何图形和变换的负担。