2

CTreeCtrl在固定大小的任意位置都有一个CDialog。您能否建议如何定位它CTreeCtrlOnInitDialog使其左侧、右侧和底部接触到对话框侧,并且顶部有一个缩进 N?我现在已经试验了几个小时,但它并没有正确地粘在右边和底部:

CRect rect;
GetWindowRect(&rect);
rect.top = N;
m_Tree.MoveWindow(&rect);

我也试过了GetClientRect

我需要得到以下信息:

在此处输入图像描述

4

1 回答 1

2

到目前为止,在这种情况下最简单的解决方案就是使用内置的动态布局功能:

在此处输入图像描述

  • 在 IDE 中选择控件。
  • Sizing Type属性设置为Both
  • 大小 X大小 Y设置为100

然后,只要您的对话框Border属性设置为Resizing,树控件就会按照您的需要进行拉伸:

在此处输入图像描述

如您所见,无需编码:

在此处输入图像描述

容易多了!


手动方法

但是,如果您手动执行操作,则需要确保您了解 API 调用为您提供的坐标类型。坐标可以是相对的:

  • 屏幕坐标
  • 客户坐标

例如:

尺寸以相对于显示屏左上角的屏幕坐标给出。包括标题、边框和滚动条(如果存在)的尺寸。

客户坐标指定客户区的左上角和右下角。由于客户坐标是相对于CWnd客户区的左上角的,所以左上角的坐标是(0,0)。

对于顶级 CWnd对象,x 和 y 参数相对于屏幕的左上角。对于子CWnd对象,它们相对于父窗口客户区的左上角。

您的树控件是一个控件,因此当您移动它时,坐标需要相对于父窗口客户区的左上角。

请注意,有一个方便的CWnd::ScreenToClientAPI 可以从一个系统转换到另一个系统。但在这种情况下,这不是必需的。


手动方法 - 示例

把它们放在一起:

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。


我应该指出,上面的代码会手动将它放到正确的位置。但是当窗口调整大小时,您必须调整它的大小。请尝试使用动态布局方法。

于 2022-01-23T20:04:19.893 回答