如何在MFC SDI CFormView应用程序中调整窗体(对话框)的大小
How does one resize the form(dialog) in a MFC SDI CFormView application?
我试过了CMyFormView::OnInitialUpdate();
中的MoveWindow(50,50,150,200,TRUE)
此外,我在中尝试了以下代码
CWinApp::InitInstance();
RECT desktop;
const HWND hDesktop = ::GetDesktopWindow();
::GetWindowRect(hDesktop,&desktop);
MoveWindow(hDesktop,0,0,900,400,TRUE);
调整窗体(对话框)的大小时运气不佳
如果有任何建议,我将不胜感激。
在SDI程序中,对话框的大小由大型机窗口决定,以填充客户端区域。调整框架窗口的大小,随后将出现对话框。将其放入表单视图的OnInitialUpdate
AfxGetMainWnd()->MoveWindow(....);
关键事项:
-
最小尺寸-您设置-您创建的对话框模板或表单视图是绝对最小尺寸CFormview将使用
-
最大尺寸-自动尺寸-对话框模板没有最大值。CFormview动态拉伸它以适应CMainFrame窗口。
-
启动模板大小的应用程序当然,您可能希望CMainFrame窗口尽可能紧凑,这是通过在CFormView::OnInitialUpdate()中使用3行强制性代码来实现的
void CSimpleSDIView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit(); // FORCES CMainframe to be as small as the dialog template
}
- 强制CMainFrame限制最小尺寸-如有必要。使用WM_GETMINMAXINFO以下是代码:
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
lpMMI->ptMinTrackSize.x = 500; // absolute minimum width for CMainFrame
lpMMI->ptMinTrackSize.y = 500; // absolute minimum height for CMainFrame
CFrameWnd::OnGetMinMaxInfo(lpMMI);
}
设置为理想大小这可以在CFormView::OnInitialUpdate中使用以下代码实现(仍然需要步骤3):
AfxGetMainWnd()->MoveWindow(0, 0, 1024, 600, 1);
TWEAK CONTROL POSITIONS随着MFC功能区的出现,情况看起来不错,但如果不进行额外的调整,使用步骤1-5就无法工作。基本上,功能区会向主窗口发送一个额外的大小调整,所以即使您发送了一个最小的模板大小,由于额外的大小,事情也会变得有点不成比例——主要是因为功能区中的一个组可以折叠成一个图标。**在执行步骤5**之前,您可能需要添加以下代码:
if(::GetSystemMetrics(SM_CXSCREEN) > 1024)
{
RECT r;
CWnd *someControl = GetDlgItem(IDC_SOMECONTROL);
someControl->GetWindowRect(&r);
ScreenToClient(&r);
r.right += 300;//r.right += 30;
r.bottom += 150;
someControl->MoveWindow(&r)
}
解释:
简短的回答是,你没有!基本上,我也遇到了同样的问题,制作了一个对话框模板,用于CFormView派生类。当我想像任何普通窗口一样拉伸CMainFrame窗口时,我希望表单视图的内容相应地调整大小。这在某些代码中运行得很好,但当我将窗口设置得很小时,问题就出现了。当我这样做的时候,我会得到这些丑陋的滚动条。我的想法是滚动条在那里,因为它们试图尊重原始对话框模板的大小。这个想法是正确的!例如,如果您将对话框设置为500 x 500,并且您的大小小于500,您将得到滚动条,因为CFormview尊重应用程序必须至少为500 x 100。最小大小由您制作的模板决定,不能动态地使其变小。
通常,子窗口的大小和位置在子窗口的init代码中会发生变化。如果在父窗口代码中更改此项,则必须始终检查子窗口句柄值是否有效。我输入了这个代码CAboutDlg
的WM_CREATE
处理程序。
int CAboutDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
RECT desktop;
const HWND hDesktop = ::GetDesktopWindow();
::GetWindowRect(hDesktop,&desktop);
MoveWindow(&desktop,TRUE);
return 0;
}
- 如何在Qbutton的帮助下更改Q对话框的宽度
- 当对话框被接受时,如何用参数调用槽
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 如何多次询问来自QML对话框的输入?
- 选择文件对话框错误
- 自定义对话框(源自QDialog)不会关闭(Android)
- 如何在 MFC 对话框中使用 OnDraw
- 在C++中创建文件夹选取器对话框的最简单方法是什么?
- 从资源视图访问对话框时出现问题
- 如何检测窗口当前是否正在运行模式对话框?
- "最小化"按钮不会出现在 MFC 对话框中
- 如何获取QNetworkConfiguration UserChoice对话框?
- 表单显示对话框函数错误,并且不执行下面的语句
- 如何在 VC6 中的对话框中将图标设置为按钮
- 对话框窗体快速闪烁,但之后未正确绘制
- 从对话框中对窗体视图项进行mfc访问
- 如何在MFC SDI CFormView应用程序中调整窗体(对话框)的大小
- Windows窗体显示与显示对话框
- Windows 窗体 - 具有父级的 ShowDialog - 为什么在主窗口最大化时单击父级不激活对话框
- 显示未处于模式模式的对话框窗体