OnCreate()和PreCreateWindow()函数的区别

本文详细解释了MFC中窗口创建过程中的预处理步骤PreCreateWindow()及其在自定义窗口属性中的作用,包括如何在SDI和MDI环境中调整窗口样式。

    在窗口的CWnd::Create()/CreateEx()调用返回前,要调用PreCreateWindow(),对Create()/CreateEx()中的风格参数进行预处理设置.之后调用OnCreate进行实际的窗口创建,返回后,Create()/CreateEx()也返回,窗口创建结束.

参看:MFC的窗口创建函数源代码:


    PreCreateWindow()顾名思义就是在窗口创建之前执行的,它的主要任务是对所要创建的窗口进行一些风格或者其他方面的初始化或者说是设置,可以这么说,如果说窗口好比一栋建筑,那么PreCreateWindow()要做的就是在还没有建筑的时候将建筑的图纸画出来,而OnCreate()要做的就是根据图纸将建筑构建起来.

     若要更改框架应用程序(用应用程序向导创建的)所使用的默认窗口属性,请重写窗口的 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(应用程序向导给 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_CHILD、WS_OVERLAPPEDWINDOW 和 FWS_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 子窗口。
在读取图片的框架搭建中使用了MFC(Microsoft Foundation Classes)框架中 CMainFrame 类的实现代码。 MFC(Microsoft Foundation Classes),是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows的API。其中包含的类包含大量Windows句柄封装类很多Windows的内建控件组件的封装类。MFC实际上就是由微软提供的,用于在C++环境下编写应用程序的一个框架引擎。 界面算法流程概述: 1. 使用了MFC 框架下的主窗口类 CMainFrame的构造函数创建窗口的函数。在构造函数中并没有做什么特别的事情,只有一个 TODO 注释。在 OnCreate 函数中,创建了一个工具栏一个状态栏,并加载了资源文件中的工具栏状态栏的图标文本。如果创建失败,则会返回 -1。 2. 实现MFC 框架中主窗口类 CMainFrame。其中,OnCreate函数在主窗口被创建后被调用,OnCreate函数启用了主窗口的 docking 功能,并将工具栏固定到窗口顶部。而 PreCreateWindow() 函数则是在主窗口被创建前被调用,它可以修改主窗口的样式属性。在这段代码中,PreCreateWindow() 函数并没有做任何修改,只是简单地返回 TRUE,表示主窗口可以被创建。 3. 运用了MFC 框架中 CImageProcessingApp 类的消息映射表,其中定义了两个命令的消息处理函数:OnAppAbout OnFileOpen。同时也继承了 CWinApp 中定义的三个命令:OnFileNew、OnFileOpen OnFilePrintSetup 的消息处理函数。这些消息处理函数将在相应的命令被触发时被调用,可以在其中编写相应的处理代码。 4. 在 MFC 应用程序中启用 3D 控件。在 MFC 应用程序中,如果使用共享 DLL,则应调用 Enable3dControls()。但如果使用静态链接,则应调用 Enable3dControlsStatic()。_AFXDLL是一个预处理器宏,用于指示 MFC 应用程序是使用共享 DLL 还是静态链接 MFC 库。如果定义了 _AFXDLL,则表示使用共享 DLL。如果未定义 _AFXDLL,则表
05-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值