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