更改 MFC 创建的窗口的样式
在其 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 应用程序中的窗口属性,请重写派生自 CFrameWnd
的类中的 PreCreateWindow
函数(应用程序向导将其命名为 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 子窗口。