CTreeCtrl
在固定大小的任意位置都有一个CDialog
。您能否建议如何定位它CTreeCtrl
,OnInitDialog
使其左侧、右侧和底部接触到对话框侧,并且顶部有一个缩进 N?我现在已经试验了几个小时,但它并没有正确地粘在右边和底部:
CRect rect;
GetWindowRect(&rect);
rect.top = N;
m_Tree.MoveWindow(&rect);
我也试过了GetClientRect
。
我需要得到以下信息:
CTreeCtrl
在固定大小的任意位置都有一个CDialog
。您能否建议如何定位它CTreeCtrl
,OnInitDialog
使其左侧、右侧和底部接触到对话框侧,并且顶部有一个缩进 N?我现在已经试验了几个小时,但它并没有正确地粘在右边和底部:
CRect rect;
GetWindowRect(&rect);
rect.top = N;
m_Tree.MoveWindow(&rect);
我也试过了GetClientRect
。
我需要得到以下信息:
到目前为止,在这种情况下最简单的解决方案就是使用内置的动态布局功能:
然后,只要您的对话框Border属性设置为Resizing,树控件就会按照您的需要进行拉伸:
如您所见,无需编码:
容易多了!
但是,如果您手动执行操作,则需要确保您了解 API 调用为您提供的坐标类型。坐标可以是相对的:
例如:
尺寸以相对于显示屏左上角的屏幕坐标给出。包括标题、边框和滚动条(如果存在)的尺寸。
客户坐标指定客户区的左上角和右下角。由于客户坐标是相对于CWnd客户区的左上角的,所以左上角的坐标是(0,0)。
对于顶级
CWnd
对象,x 和 y 参数相对于屏幕的左上角。对于子CWnd
对象,它们相对于父窗口客户区的左上角。
您的树控件是一个子控件,因此当您移动它时,坐标需要相对于父窗口客户区的左上角。
请注意,有一个方便的CWnd::ScreenToClient
API 可以从一个系统转换到另一个系统。但在这种情况下,这不是必需的。
把它们放在一起:
CRect rct;
GetClientRect(&rct); // The client area of your window (in client coordinates)
rct.top += N; // Adjust the top margin as required
myTree.MoveWindow(&rct); // Now move the child control
请注意,我没有调试它来验证代码,但它传达了想法。
在可能的情况下,我使用内置的动态调整大小,尽管计算大小值可能非常棘手。但在你的情况下,它很简单 - 100。
我应该指出,上面的代码会手动将它放到正确的位置。但是当窗口调整大小时,您必须调整它的大小。请尝试使用动态布局方法。