MFC对话框设置成formview的子窗口还能调位置和大小吗
时间: 2024-03-24 09:37:16 浏览: 18
MFC对话框设置成`CFormView`的子窗口后,同样可以通过代码调整其位置和大小。不过与设置为普通子窗口的情况不同的是,`CFormView`的位置和大小通常是由其所属的`CFrameWnd`控制的。因此,调整`CFormView`的位置和大小需要在其所属的`CFrameWnd`中操作。
可以使用类似以下的代码:
```cpp
CRect rect;
GetClientRect(&rect); // 获取对话框客户区矩形
MapWindowPoints(GetParent(), &rect); // 将客户区矩形映射到父窗口坐标系中
// 调整位置和大小
rect.left += 100;
rect.top += 100;
rect.right -= 100;
rect.bottom -= 100;
// 获取所属的 CFrameWnd
CFrameWnd* pFrameWnd = GetParentFrame();
if (pFrameWnd != nullptr)
{
// 调整 CFormView 的位置和大小
pFrameWnd->SetWindowPos(this, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER);
}
```
需要注意的是,`CFrameWnd`和`CFormView`都有自己的位置和大小,需要保证二者的位置和大小是一致的,否则可能会出现显示异常的情况。
相关问题
MFC对话框设置成formview的子窗口那这个对话框还能调位置和大小吗
如果将MFC对话框设置为`CFormView`的子窗口,那么对话框的位置和大小通常是由父窗口控制的,因此需要在父窗口中实现对话框的位置和大小的调整。
假设你的`CFormView`子窗口名称为`CMyFormView`,那么在父窗口中可以使用以下代码来进行位置和大小的调整:
```cpp
CRect rect;
pMyFormView->GetWindowRect(&rect); // 获取对话框窗口矩形
ScreenToClient(&rect); // 将窗口矩形转换为父窗口客户区坐标系中的矩形
// 调整位置和大小
rect.left += 100;
rect.top += 100;
rect.right -= 100;
rect.bottom -= 100;
pMyFormView->MoveWindow(&rect); // 移动和调整大小
```
需要注意的是,`GetWindowRect`函数获取的是对话框窗口相对于整个屏幕的矩形,因此需要使用`ScreenToClient`函数将其转换为相对于父窗口的矩形。
此外,需要在父窗口中获取到`CMyFormView`子窗口的指针,可以通过`GetDlgItem`函数或者`GetDescendantWindow`函数来获取。
formview 里的对话框如何初始化大小位置
在 FormView 中嵌入一个对话框时,你可以使用以下方法来设置对话框的大小和位置:
1. 在你的 FormView 类的 OnInitialUpdate() 函数中,获取你的对话框对象的大小和位置,例如:
```
void CMyFormView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
// 初始化你的对话框对象
m_pMyDialog->Create(ID_MYDIALOG, this);
m_pMyDialog->ShowWindow(SW_SHOW);
// 获取对话框的大小和位置
CRect rect;
m_pMyDialog->GetWindowRect(&rect);
ScreenToClient(&rect);
}
```
在上述代码中,你需要使用 GetWindowRect() 函数获取对话框的屏幕坐标,然后使用 ScreenToClient() 函数将其转换为客户端坐标。
2. 在你的 FormView 类的 OnSize() 函数中,重新设置对话框的大小和位置,例如:
```
void CMyFormView::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// 重新设置对话框的大小和位置
CRect rect;
GetClientRect(&rect);
rect.DeflateRect(10, 10);
m_pMyDialog->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER);
}
```
在上述代码中,你需要使用 GetClientRect() 函数获取 FormView 的客户端区域,然后使用 SetWindowPos() 函数设置对话框的位置和大小。
通过执行上述步骤,你就可以在 FormView 中嵌入一个对话框,并设置其大小和位置。