更改MFC创建的窗口的样式
在其 WinMain 功能的版本,几个 MFC 注册标准 windows 为类别。由于您通常不编辑 MFC 的 WinMain,该函数不提供您有机会更改 MFC 默认窗口样式。本文说明如何更改这些预注册窗口类样式在现有应用程序的。
在新 MFC 应用程序的更改的样式
如果使用 Visual C++ 2.0 或更高版本,可以更改应用程序向导的默认窗口样式,当您创建应用程序时。在应用程序向导用户界面功能的页,可以将您的主框架窗口和 MDI 子窗口的样式。对于任何一个窗口类型,可以指定其帧粗细 (粗或细) 和以下几方面:
窗口是否具有最小化或多个控件。
窗口是否显示最初,最小化、最大化或关闭和/或。
对于主框架窗口,还可以指定窗口是否具有系统菜单。对于 MDI 子窗口,可以指定窗口是否支持拆分窗格。
在现有应用程序的更改的样式
如果将现有应用程序的窗口属性,请按照其余部分的命令本文。
若要更改 framework 应用程序使用的默认窗口属性创建应用程序向导,请重写窗口的 PreCreateWindow 虚拟成员函数。PreCreateWindow 允许应用程序以创建处理在内部通常由所 CDocTemplate 类的访问。框架在创建窗口之前调用 PreCreateWindow 。通过修改 CREATESTRUCT 结构传递给 PreCreateWindow,应用程序可以更改用于的属性创建一个窗口。例如,确保窗口不使用声明,请使用按位以下操作:
// cs has been declared as CREATESTRUCT& cs;
cs.style &= ~WS_CAPTION;
CTRLBARS 示例应用程序演示更改 " 窗口属性的此方法。根据您的应用程序在 PreCreateWindow更改,请调用函数的基类实现可能是必需的。
下面的讨论包括 SDI 用例和 MDI 用例。
SDI 用例
在单文档 (SDI)界面 (mdi) 应用程序,框架的默认窗口样式是 WS_OVERLAPPEDWINDOW 和 FWS_ADDTOTITLE 样式的组合。FWS_ADDTOTITLE 是指示结构将文档标题到窗口的标题的 MFC 特定样式。若要更改在 SDI 应用程序的窗口属性,请重写在从应用程序向导命名 CMainFrame) 的 CFrameWnd 派生的类中 PreCreateWindow 函数 (。例如:
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)。默认情况下,使用应用程序向导创建 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 子窗口,而无需最大化按钮。