更改 MFC 创建的窗口样式

MFC 在其 WinMain 函数的版本中为您注册了几个标准窗口类。由于您通常不编辑 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_OVERLAPPEDWINDOWFWS_ADDTOTITLE 样式的组合。FWS_ADDTOTITLE 是 MFC 特定的样式,指示框架将文档标题添加到窗口标题。若要在 SDI 应用程序中更改窗口属性,请在从 CFrameWnd(应用程序向导给 CMainFrame 起的名称)派生的类中重写 PreCreateWindow 函数。例如:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 
{
// 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;

// Call the base-class version
return CFrameWnd::PreCreateWindow(cs);
}

此代码创建一个没有“最小化”按钮和“最大化”按钮,也没有大小可调边框的主框架窗口。此窗口最初在屏幕上居中。

MDI 情况

更改多文档界面 (MDI) 应用程序中的子窗口样式所需的工作多一些。默认情况下,用应用程序向导创建的 MDI 应用程序使用 MFC 中定义的默认 CMDIChildWnd 类。若要更改 MDI 子窗口的窗口样式,必须从 CMDIChildWnd 派生一个新类,并用对新类的引用替换项目中所有对 CMDIChildWnd 的引用。应用程序中仅有的对 CMDIChildWnd 的引用很可能位于应用程序的 InitInstance 成员函数中。

在 MDI 应用程序中使用的默认窗口样式是 WS_CHILDWS_OVERLAPPEDWINDOWFWS_ADDTOTITLE 样式的组合。若要更改 MDI 应用程序子窗口的窗口属性,请在从 CMDIChildWnd 派生的类中重写 PreCreateWindow 函数。例如:

BOOL CMyChildWnd::PreCreateWindow(CREATESTRUCT& cs) 
{
// Create a child window without the maximize button
cs.style &= ~WS_MAXIMIZEBOX;

// Call the base-class version
return CMDIChildWnd::PreCreateWindow(cs);
}

此代码创建没有“最大化”按钮的 MDI 子窗口。

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值