mfc 默认窗口大小和位置是如何设置的

mfc 默认窗口大小和位置是如何设置的

默认窗口大小和位置是如何设置的

窗口最终是由Windows API 函数::CreateWindowEx创建,::CreateWindowEx需要窗口的信息,其中就有位置和大小,这些信息从哪里来?下面就分析一下:

下面是CFrameWnd中Create函数的声明
BOOL Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle = WS_OVERLAPPEDWINDOW,
const RECT& rect = rectDefault,
CWnd* pParentWnd = NULL, // != NULL for popups
LPCTSTR lpszMenuName = NULL,
DWORD dwExStyle = 0,
CCreateContext* pContext = NULL);

从onst RECT& rect = rectDefault,这就是窗口位置和大小参数 它有一个默认值,是Windows定义好的。

我以创建的当文档应用程序Single为例说明 CFrame的Create函数的调用中间无关的函数都删掉了
CSingleApp::InitInstance() ->CWinApp::ProcessShellCommand ->CDocTemplate::CreateNewFrame ->CFrameWnd::LoadFrame ->CFrameWnd::Create ->CWnd::CreateEx ->::CreateWindowEx
这一串函数在调用CFrameWnd::Create是得到了窗口的位置和大小

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs

cs.cx=500;
cs.cy=500;//修改默认矩形窗口rect的尺寸大小

cs.x=0;
cs.y=0;//修改默认窗口的位置

‍ return TRUE;
}

方法一: 在单文档‍CDonghuaApp::InitInstance()中修改

BOOL CDonghuaApp::InitInstance()
{
AfxEnableControlContainer();

。。。。。。

// The one and only window has been initialized, so show and update it.

HWND hWnd=GetDesktopWindow();//取得桌面窗口的句柄
GetWindowRect(hWnd,&rect);//设置矩形对象参数
m_pMainWnd->MoveWindow(rect.left,rect.top,rect.Width()/2,rect.Height()/2,TRUE);//设置框架窗口的显示位置和大小

m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();

return TRUE;
}

方法二:在 ‍CMainFrame::OnCreate()中修改

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
CWnd *pWnd=GetDesktopWindow();//返回一个桌面窗口指针
pWnd->GetWindowRect(&rect);//窗口指针指向矩形对象

this->MoveWindow(rect.left+100,rect.top+100,rect.Width()/2,rect.Height()/2,TRUE);
// this->MoveWindow(rect.left,rect.top,rect.Width()/2,rect.Height()/2,TRUE);
// this->MoveWindow(0,0,600,600,TRUE);//设置窗口的位置和大小

return 0;
}

‍以一个sdi的工程举一个例子:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0(“Failed to create toolbar/n”);
return -1; // fail to create
}

if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0(“Failed to create status bar/n”);
return -1; // fail to create
}

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);

::ShowWindow(this->m_hWnd,SW_SHOWMAXIMIZED);//代码在这里

return 0;

}
对于MDI的窗口只要分别在主窗口的OnCreate函数和子窗口的PreCreateWindow函数中添加代码就可以

或者在App类的InitInstance函数中改变显示主框架的m_nCmdShow参数如下:

m_nCmdShow = SW_SHOWMAXIMIZED;
pMainFrame->ShowWindow(m_nCmdShow);

Microsoft Foundation Classes (MFC) 是一组用于 Windows 编程的标准 C++ 类库,它使得创建图形用户界面(GUI)变得更加容易。在 MFC设置窗口大小主要有两种方式:通过属性编辑器直接设置,以及在代码中动态修改。 ### 通过属性编辑器设置窗口大小 在使用 MFC 的情况下,通常在 Visual Studio 或其他 IDE 中打开 MFC 项目的属性页面(右击项目 -> 属性)。在“资源”或“项目属性”中找到“主框架”或“视图”,并进入“窗口”选项卡。 在这里,您可以看到窗口的“最小尺寸”、“最大尺寸”以及“默认尺寸”。您可以直接修改这些值来设置窗口的大小限制。此外,“初始位置和大小”部分允许指定窗口首次加载时的尺寸和位置。 ### 在代码中设置窗口大小MFC 应用中,您也可以通过编写代码动态改变窗口大小。这通常是通过修改 `CFrameWnd` 或其派生类(例如 `CDialog` 或 `CToolKit` 等)的对象的尺寸来完成的。以下是一个简的示例: ```cpp // 假设 `MyView` 是您的视图类的一个实例 void MyView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); // 当窗口大小发生变化时,根据需要调整布局或内容 AdjustLayout(); } void MyView::AdjustLayout() { // 您可以根据窗口的新大小来调整 UI 元素的位置和大小 // 例如,移动某个按钮或者重新分配文本区域的尺寸 CRect rect; // 用于存放当前控件的矩形坐标 myButton.GetWindowRect(rect); // 假设 `myButton` 是您想要调整大小的按钮 // 根据新的窗口尺寸调整按钮的位置和大小 rect.right += 50; // 增加一些额外空间 rect.bottom -= 30; // 减小底部空间以便适应新的高度需求 myButton.MoveWindow(&rect); } ``` 在这个例子中,`OnSize` 方法会在窗口大小变化时自动调用,您可以在其中加入对窗口内部布局或元素的调整逻辑。而 `AdjustLayout` 方法则演示了如何根据新的窗口尺寸重新定位和调整一个假想的按钮。 ### 相关问题: 1. MFC 是否支持响应鼠标拖动调整窗口大小的功能? - MFC 支持通过添加特定的 WM_SIZE 和 WM_NCMOVE 消息处理器来响应鼠标拖动调整窗口大小。这涉及到监听和处理窗口边角或边缘的双击或拖动动作。 2. 如何在 MFC 中动态改变窗口标题栏的颜色? - 要动态改变窗口标题栏的颜色,通常需要自定义窗口类并覆盖 `Create` 方法,然后在创建过程中使用 `SetSysColor` 或类似函数来设置颜色。然而,MFC 默认不支持直接从代码中改变标题栏的颜色,因为这通常由底层操作系统的窗口管理器控制。 3. MFC 中的窗口大小限制是如何实现的? - MFC 提供了窗口的最大尺寸限制通过在其属性页中配置“最大尺寸”选项实现。当尝试将窗口大小设置超出这个限制时,系统会自动裁剪或放大缩放至限制范围内。这种方式主要是为了防止窗口过大导致用户界面不可见或难以控制的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~晓广~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值