在函数的 WinMain
版本中,MFC 会为你注册多个标准窗口类。 由于通常不编辑 MFC, WinMain
因此该函数没有机会更改 MFC 默认窗口样式。 本文介绍如何在现有应用程序中更改此类预注册窗口类的样式。
更改新 MFC 应用程序中的样式
如果使用 Visual C++ 2.0 或更高版本,可以在创建应用程序时更改应用程序向导中的默认窗口样式。 在“应用程序向导的用户界面功能”页中,可以更改主框架窗口和 MDI 子窗口的样式。 对于任一窗口类型,可以指定其框架粗细(粗或薄),以及以下任一类型:
窗口是否具有“最小化”或“最大化”控件。
窗口最初是最小化、最大化还是两者均未显示。
对于主框架窗口,还可以指定窗口是否具有系统菜单。 对于 MDI 子窗口,可以指定窗口是否支持拆分器窗格。
更改现有应用程序中的样式
如果要更改现有应用程序中的窗口属性,请改为按照本文其余部分中的说明进行作。
若要更改使用应用程序向导创建的框架应用程序使用的默认窗口属性,请重写窗口的 PreCreateWindow 虚拟成员函数。
PreCreateWindow
允许应用程序访问通常由 CDocTemplate 类在内部管理的创建过程。 框架在创建窗口之前调用 PreCreateWindow
。 通过修改传递给PreCreateWindow
的 CREATESTRUCT 结构,应用程序可以更改用于创建窗口的属性。 例如,若要确保窗口不使用标题,请使用以下按位作:
// cs has been declared as CREATESTRUCT& cs;
cs.style &= ~WS_CAPTION;
CTRLBARS 示例应用程序演示了用于更改窗口属性的此方法。 根据应用程序的变化 PreCreateWindow
,可能需要调用函数的基类实现。
以下讨论介绍了 SDI 案例和 MDI 案例。
SDI 案例
在单个文档界面(SDI)应用程序中,框架中的默认窗口样式是 WS_OVERLAPPEDWINDOW 和 FWS_ADDTOTITLE 样式的组合。
FWS_ADDTOTITLE 是一种特定于 MFC 的样式,指示框架将文档标题添加到窗口的标题。 若要更改 SDI 应用程序中的窗口属性,请重写 PreCreateWindow
派生自 CFrameWnd
的类中的函数(应用程序向导名称 CMainFrame
)。 例如:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT &cs)
{
// Call the base-class version
if (!CFrameWnd::PreCreateWindow(cs))
return FALSE;
// Create a window without min/max buttons or sizable border
cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_BORDER;
// Size the window to 1/3 screen size and center it
cs.cy = ::GetSystemMetrics(SM_CYSCREEN) / 3;
cs.cx = ::GetSystemMetrics(SM_CXSCREEN) / 3;
cs.y = ((cs.cy * 3) - cs.cy) / 2;
cs.x = ((cs.cx * 3) - cs.cx) / 2;
return TRUE;
}
此代码创建一个没有最小化和最大化按钮的主框架窗口,并且没有相当大的边框。 窗口最初居中位于屏幕上。
MDI 案例
在多个文档界面(MDI)应用程序中更改子窗口的窗口样式需要做更多的工作。 默认情况下,使用应用程序向导创建的 MDI 应用程序使用 MFC 中定义的默认 CMDIChildWnd 类。 若要更改 MDI 子窗口的窗口样式,必须派 CMDIChildWnd
生新类,并将项目中的所有引用 CMDIChildWnd
替换为对新类的引用。 最有可能的是,应用程序中唯一的 CMDIChildWnd
引用位于应用程序 InitInstance
的成员函数中。
MDI 应用程序中使用的默认窗口样式是 WS_CHILD、 WS_OVERLAPPEDWINDOW和 FWS_ADDTOTITLE 样式的组合。 若要更改 MDI 应用程序的子窗口的窗口属性,请重写派生自CMDIChildWnd
的类中的 PreCreateWindow 函数。 例如:
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT &cs)
{
// Create a child window without the maximize button
cs.style &= ~WS_MAXIMIZEBOX;
return CMDIChildWnd::PreCreateWindow(cs);
}
此代码创建没有最大化按钮的 MDI 子窗口。