📄 chap5_5.htm
字号:
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p><b><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">void CRegisterSheet::OnApplyNow()</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CFrameWnd* pFrameWnd = (CFrameWnd*)
AfxGetMainWnd();</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">//获取指向视图的指针</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CView* pView =
pFrameWnd->GetActiveFrame()->GetActiveView();</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">//发送用户定义消息,在视图中输出信息</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">pView->SendMessage(WM_USER_OUTPUT,
(WPARAM)this);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">m_PersonalPage.SetModified(FALSE);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">m_UnitPage.SetModified(FALSE); //使Apply按钮禁止</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></b></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">在CRegisterSheet类内嵌入了CPersonalPage和CUnitPage对象,在该类的构造函数中调用CPropertySheet::AddPage将两个页添加到对话框中。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">标签式对话框的OK、Cancel和Apply按钮的ID分别是IDOK、IDCANCEL和ID_APPLY_NOW。在按下Apply按钮后,CRegisterSheet对象应该作出响应,由于ClassWizard不能为CRegisterSheet类提供Apply按钮的BN_CLICKED消息处理函数,故必须手工声明和定义消息处理函数OnApplyNow,并在消息映射表中手工加入ID_APPLY_NOW的BN_CLICKED消息映射,该映射是通过ON_BN_CLICKED宏实现的。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">函数OnApplyNow用CWnd::SendMessage向视图发送用户定义消息WM_USER_OUTPUT,并调用CPropertyPage::SetModified(FALSE)来禁止Apply按钮。在发送消息时,将this指针作为wParam参数一并发送,这是因为视图对象需要指向CRegisterSheet对象的指针来访问该对象。该函数演示了如何在程序的任意地方获得当前活动视图的方法:首先,调用AfxGetMainWnd()返回程序主窗口的CWnd类指针,然后将该指针强制转换成CFrameWnd类型,接着调用CFrameWnd::GetActiveFrame返回当前活动的框架窗口的一个CFrameWnd型指针,最后调用CFrameWnd::GetActiveView返回当前活动视图的一个Cview型指针。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">在函数OnApplyNow中主要调用了下列函数:</span></p>
<blockquote>
<blockquote>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CWnd* AfxGetMainWnd( );<br>
该函数返回一个指向程序的主窗口CWnd指针。程序的主窗口可以是一个框架窗口,也可以是一个对话框。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">virtual CFrameWnd* GetActiveFrame( );<br>
函数返回一个CFrameWnd型的指针。如果是MDI(多文档界面)程序,则该函数将返回当前活动的子框架窗口,如果是SDI(单文档界面)程序,该函数将返回主框架窗口本身。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CView* GetActiveView( ) const;<br>
返回一个指向当前活动视图的Cview型指针。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">LRESULT SendMessage( UINT message, WPARAM
wParam = 0, LPARAM lParam = 0 );<br>
用于向本窗口发送消息。SendMessage会直接调用发送消息的处理函数,直到发送消息被处理完后该函数才返回。参数message说明了要发送的消息,wParam和lParam则提供了消息的附加信息。</span></p>
</blockquote>
</blockquote>
<p><b><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">清单5.15 CRegisterView类的部分代码</span></b></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">//文件RegisterView.h</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">class CRegisterView : public CEditView</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>
<p><b><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">. . . . . .</span></b></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// Generated message map functions</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">protected:</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">//{{AFX_MSG(CRegisterView)</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">afx_msg void OnEditRegister();</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">afx_msg void OnEditPropdlg();</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">//}}AFX_MSG</span></p>
<p><b><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">afx_msg LRESULT OnOutput(WPARAM wParam,
LPARAM lParam);</span></b></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">DECLARE_MESSAGE_MAP()</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">};</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">//文件RegisterView.cpp</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">#include "stdafx.h"</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">#include "Register.h"</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">#include "RegisterDoc.h"</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">#include "RegisterView.h"</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">#include "RegisterDialog.h"</span></p>
<p><b><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">#include "PersonalPage.h"</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">#include "UnitPage.h"</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">#include "RegisterSheet.h"</span></b></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">BEGIN_MESSAGE_MAP(CRegisterView,
CEditView)</span></p>
<p><b><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">. . . . . .</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">ON_MESSAGE(WM_USER_OUTPUT, OnOutput)</span></b></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">END_MESSAGE_MAP()</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">void CRegisterView::OnEditPropdlg() </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">// TODO: Add your command handler code
here</span></p>
<p><b><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CRegisterSheet RegisterSheet("登录");
</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">RegisterSheet.m_PersonalPage.m_strName="张颖峰";</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">RegisterSheet.m_UnitPage.m_strUnit="南京邮电学院";</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">if(RegisterSheet.DoModal()==IDOK)</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">OnOutput((WPARAM)&RegisterSheet,0);</span></b></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p><b><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">//用户定义消息WM_USER_OUTPUT的处理函数</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">LRESULT CRegisterView::OnOutput(WPARAM
wParam, LPARAM lParam)</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">{</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CRegisterSheet
*pSheet=(CRegisterSheet*)wParam;</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CString str;</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">GetWindowText(str);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+="\r\n";</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+="姓名:";</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=pSheet->m_PersonalPage.m_strName;</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+="\r\n";</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+="工作单位:";</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+=pSheet->m_UnitPage.m_strUnit;</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">str+="\r\n";</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">SetWindowText(str);</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">return 0;</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">}</span></b></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">OnEditPropdlg函数负责初始化和创建标签式对话框,这一过程与创建普通对话框差不多。如果用户是按OK按钮返回的,则调用OnOutput函数输出数据。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">CRegisterView类的OnOutput函数负责处理标签对话框发来的用户定义消息WM_USER_OUTPUT。用户定义消息的处理函数只能用手工的方法加入。用户定义消息的消息映射是用ON_MESSAGE宏来完成的。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">函数OnOutput的两个参数wParam和lParam分别对应消息的wParam和lParam值。该函数从wParam参数中获得指向CRegisterSheet对象的指针,然后将该对象中的数据输出到视图中。</span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt"> </span></p>
<p ALIGN="JUSTIFY"><span style="font-size: 9pt">编译并运行Register,试一试自己设计的标签式对话框。</span></p>
<div align="center"><center><table border="0" cellpadding="0" cellspacing="0" width="615">
<tr>
<td><span style="font-size: 9pt"><a href="chap5_4.htm">上一页</a></span></td>
<td><p align="right"><span style="font-size: 9pt"><a href="chap5_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 + -