📄 chap3_5.htm
字号:
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 在MainFrm.cpp中,我们还看到CMainFrame类有一个OnCreate方法。OnCreate成员函数定义如清单3.3。当调用Create或CreateEx时,操作系统会向窗口发送一条WM_CREATE消息。这一函数就是用来响应WM_CREATE消息的。</span><b></p>
<p><span style="font-size: 9pt">清单3.3 OnCreate成员函数定义</span></b></p>
<p><span style="font-size: 9pt">int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">if (CFrameWnd::OnCreate(lpCreateStruct) == -1)</span></p>
<p><span style="font-size: 9pt">return -1;</span></p>
<p><span style="font-size: 9pt"> </span></p>
<p><span style="font-size: 9pt">if (!m_wndToolBar.Create(this) ||</span></p>
<p><span style="font-size: 9pt">!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">TRACE0("Failed to create toolbar\n");</span></p>
<p><span style="font-size: 9pt">return -1; // fail to create</span></p>
<p><span style="font-size: 9pt">}</span></p>
<p><span style="font-size: 9pt">if (!m_wndStatusBar.Create(this) ||</span></p>
<p><span style="font-size: 9pt">!m_wndStatusBar.SetIndicators(indicators,</span></p>
<p><span style="font-size: 9pt">sizeof(indicators)/sizeof(UINT)))</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">TRACE0("Failed to create status bar\n");</span></p>
<p><span style="font-size: 9pt">return -1; // fail to create</span></p>
<p><span style="font-size: 9pt">}</span></p>
<p><span style="font-size: 9pt">// TODO: Remove this if you don't want tool tips or a
resizeable toolbar</span></p>
<p><span style="font-size: 9pt">m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |</span></p>
<p><span style="font-size: 9pt">CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);</span></p>
<p><span style="font-size: 9pt">// TODO: Delete these three lines if you don't want the
toolbar to</span></p>
<p><span style="font-size: 9pt">// be dockable</span></p>
<p><span style="font-size: 9pt">m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);</span></p>
<p><span style="font-size: 9pt">EnableDocking(CBRS_ALIGN_ANY);</span></p>
<p><span style="font-size: 9pt">DockControlBar(&m_wndToolBar);</span></p>
<p><span style="font-size: 9pt">return 0;</span></p>
<p><span style="font-size: 9pt">}</span></p>
<p><span style="font-size: 9pt"> 在OnCreate函数中,首先调用CFrameWnd的缺省处理方法OnCreate完成窗口创建工作。后面是应用程序主窗口的特定工作,在上面程序中,创建了工具条和状态栏(有关工具条和状态栏编程参见下一章有关内容)。可以在此处加入一些初始化工作,如从INI文件中载入设置,显示Splash
Window(启动画面)等。 </span></p>
<b><p></b><span style="font-size: 9pt"><font color="#3973DE">3.5.3 注册窗口</font></span></p>
<p><span style="font-size: 9pt"> 在传统的Windows C程序中,送给一个窗口的所有消息是在它的窗口函数中处理的。把一个窗口同它的窗口函数联系起来的过程称为注册窗口类。注册窗口包括对窗口指定一个窗口函数(给出窗口函数的指针)以及设定窗口的光标、背景刷子等内容。一个注册窗口类可以被多个窗口共享。注册窗口通过调用API函数RegisterClass来完成。<br>
在MFC下,框架提供了缺省的自动窗口注册过程。框架仍然使用传统的注册类,而且提供了几个标准的注册类,它们在标准的应用程序初始化函数中注册。调用AfxRegisterWndClass全局函数就可以注册附加的窗口类,然后把已经注册的类传给CWnd的Create成员函数。用户可以定制自己的注册过程,以提供一些附加的特性。比如设置窗口的图标、背景、光标等。下面是注册窗口的例子。</span></p>
<p><span style="font-size: 9pt">BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">// TODO: Modify the Window class or styles here by
modifying</span></p>
<p><span style="font-size: 9pt">// the CREATESTRUCT cs</span></p>
<p><span style="font-size: 9pt">UINT ClassStyle=CS_VREDRAW|CS_HREDRAW;</span></p>
<p><span style="font-size: 9pt">cs.style=cs.style&(~FWS_ADDTOTITLE);</span></p>
<p><span style="font-size: 9pt">cs.lpszClass = AfxRegisterWndClass(ClassStyle,</span></p>
<p><span style="font-size: 9pt">AfxGetApp()->LoadStandardCursor(IDC_ARROW), </span></p>
<p><span style="font-size: 9pt">(HBRUSH)(COLOR_WINDOW+1),//for brush</span></p>
<p><span style="font-size: 9pt">AfxGetApp()->LoadIcon(IDR_MAINFRAME));</span></p>
<p><span style="font-size: 9pt">return TRUE;</span></p>
<p><span style="font-size: 9pt">}</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> 注册窗口在CFrameWnd的PreCreateWnd方法中完成。从成员函数名字PreCreateWindow中就可以看出来,注册窗口的工作必须在调用Create函数创建窗口之前完成。其中cs.style=cs.style&(~FWS_ADDTOTITLE)指定窗口标题风格,关闭自动添加文档标题的功能。AfxRegisterWndClass指定窗口使用箭头光标、背景刷子使用比窗口颜色标号大一的颜色、图标使用IDR_MAINFRAME标识符指定的图标(当然也可以使用其它图标)。用上面的程序段替换Hello程序MainFrm.cpp中的PreCreateWindow成员函数定义,并重新编译和运行程序。此时,窗口标题变成了Hello,原来令人讨厌的“Untitled-”没有了,因为窗口风格中关闭自动添加当前文件名的风格。</span><b></p>
<p></b><span style="font-size: 9pt"><font color="#3973DE">3.5.4 关闭和销毁窗口</font></span></p>
<p><span style="font-size: 9pt"> 框架窗口不仅维护窗口的创建,还管理着窗口的关闭和销毁过程。关闭窗口时,操作系统依次向被关闭的窗口发送WM_CLOSE和WM_DESTROY消息。WM_CLOSE消息的缺省处理函数OnClose将调用DestroyWindow,来销毁窗口;最后,框架调用窗口的析构函数作清理工作并删除C++窗口对象。<br>
不要使用C++的delete操作符来销毁框架窗口,而应当采用CWnd的DestroyWindow成员函数来销毁。DestroyWindow首先删除子窗口,再删除窗口本身。若窗口以变量方式产生(即在堆栈上分配内存),该窗口对象会被自动清除。若对象是用new操作符创建的(也就是在堆上分配内存的),则需要用户自己处理。有关DestroyWindow问题在第五章对话框技术中还要作进一步解释。</span></p>
<p><span style="font-size: 9pt">OnClose()常用功能:保存窗口的一些状态、工具条状态,提示保存未保存的数据等等。</span></p>
<p><span style="font-size: 9pt">void CMainFrame::OnClose()</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">SaveBarState( "MyDockState" );//保存工具条状态</span></p>
<p><span style="font-size: 9pt">CFrameWnd::OnClose();</span></p>
<p><span style="font-size: 9pt">}</span></p>
<b><p></b><span style="font-size: 9pt"><font color="#3973DE">3.5.5 窗口激活</font></span></p>
<p><span style="font-size: 9pt"> 活动窗口必定是一个没有父窗口的顶层窗口,包括框架窗口和对话框。当顶层窗口被激活时,Windows向窗口发送WM_ACTIVATE消息,对此消息的缺省处理是将活动窗口设为有输入焦点。<br>
输入焦点用于表示哪个窗口有资格接收键盘输入消息。带有输入焦点的窗口或是一个活动窗口,或者是该活动窗口的子窗口。当一个顶层窗口获得输入焦点时,Windows向该窗口发送WM_SETFOCUS消息,此窗口可将输入焦点重定位到它的子窗口上。子窗口不会自动获得输入焦点。失去输入焦点的窗口会收到WM_KILLFOCUS消息。当子窗口拥有输入焦点时,父窗口就不会处理键盘输入了。</span></p>
<div align="center"><center><table border="0" cellpadding="0" cellspacing="0" width="615">
<tr>
<td><span style="font-size: 9pt"><a href="chap3_4.htm">上一页</a></span></td>
<td><p align="right"><span style="font-size: 9pt"><a href="chap3_6.htm">下一页</a></span></td>
</tr>
</table>
</center></div><font SIZE="5"><hr noshade color="#3973DE" size="1">
<p align="center"></font><font size="2" color="#000000">本教程由<a
href="http://vcdynasty.yeah.net">Visual C++王朝(Where programmers come together)</a>协助制作<br>
未经许可,请勿以任何形式复制</font></td>
<b>
</tr>
</table>
</center></div></b>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -