📄 chap10.html
字号:
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">获得列表中包含的节点个数。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">IsEmpty()</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">检查一个列表是否不含有任何节点。</P>
<P ALIGN="JUSTIFY">下面的程序将允许用户添加和删除节点,按照以下步骤进行:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">1.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>使用</FONT><FONT SIZE=3>MFC AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>创建一个单文档应用程序</FONT><FONT SIZE=3>List</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>添加一个对话框类</FONT><FONT SIZE=3>CAddStudentDlg</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,其对应的对话框如图</FONT><FONT SIZE=3>10.4</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示。</P>
<P ALIGN="CENTER"><IMG SRC="Image295.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image295.gif" WIDTH=191 HEIGHT=133></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>10. 4 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>添加节点对话框</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">3.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为两个文本框映射两个变量</FONT><FONT SIZE=3>m_name</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>m_score</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">4.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>添加一个对话框类</FONT><FONT SIZE=3>CRemoveStudentDlg</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,其对应的对话框如图</FONT><FONT SIZE=3>10.5</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示。两个单选按钮的</FONT><FONT SIZE=3>ID</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为</FONT><FONT SIZE=3>IDC_REMOVE0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>IDC_REMOVE1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="CENTER"><IMG SRC="Image296.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image296.gif" WIDTH=183 HEIGHT=135></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图10. 5 删除节点对话框</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">5.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为对话框类添加一个</FONT><FONT SIZE=3>UINT</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类型的成员变量</FONT><FONT SIZE=3>m_radio</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">6.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在</FONT><FONT SIZE=3>OnInitDialog()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数中设置单选按钮的初始状态。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>BOOL CRemoveStudentDlg::OnInitDialog() </P>
<P>{</P>
<P>	CDialog::OnInitDialog();</P>
<P>	</P>
<P>	// TODO: Add extra initialization here</P>
<P>	((CButton*)GetDlgItem(IDC_REMOVE0))->SetCheck(1);</P>
<P>	return TRUE; // return TRUE unless you set the focus to a control</P>
<P>	 // EXCEPTION: OCX Property Pages should return FALSE</P>
<P>}</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">7.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为了知道用户选择了哪一个单选按钮,在</FONT><FONT SIZE=3>OnOk()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>函数中添加下面的代码。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>void CRemoveStudentDlg::OnOK() </P>
<P>{</P>
<P>	// TODO: Add extra validation here</P>
<P>	UINT nRadio=GetCheckedRadioButton(IDC_REMOVE0,IDC_REMOVE1);</P>
<P>	switch(nRadio)</P>
<P>	{</P>
<P>	case IDC_REMOVE0:</P>
<P>		m_radio=0;</P>
<P>		break;</P>
<P>	case IDC_REMOVE1:</P>
<P>		m_radio=1;</P>
<P>		break;</P>
<P>	default:</P>
<P>		break;</P>
<P>	}</P>
<P>	CDialog::OnOK();</P>
<P>}</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">8.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在</FONT><FONT SIZE=3>ListView.h</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中</FONT><FONT SIZE=3>CListView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>类的声明之前添加如下代码,用来定义一个结构体</FONT><FONT SIZE=3>CStudent</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,包含两个变量</FONT><FONT SIZE=3>m_name</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>m_score</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,分别用于存放学生的姓名和成绩。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>struct CStudent</P>
<P>{</P>
<P>	CString m_name;</P>
<P>	int m_score;</P>
<P>};</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">9.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为</FONT><FONT SIZE=3>ClistView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>添加一个类型为</FONT><FONT SIZE=3>CptrList</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的成员变量</FONT><FONT SIZE=3>m_list</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">10.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在</FONT><FONT SIZE=3>ListView.cpp</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中添加下列语句:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>#include "AddStudentDlg.h"</P>
<P>#include "RemoveStudentDlg.h"</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">11.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>当用户单击左键后,弹出如图</FONT><FONT SIZE=3>10.4</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的对话框,可以添加一个节点。对应的OnLButtonDown()函数代码如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>void CMyListView::OnLButtonDown(UINT nFlags, CPoint point) </P>
<P>{</P>
<P>	// TODO: Add your message handler code here and/or call default</P>
<P>	CAddStudentDlg dialog;</P>
<P> dialog.m_name = "";</P>
<P> dialog.m_score = 0 ;</P>
<P> // Display the dialog box.</P>
<P> int result = dialog.DoModal();</P>
<P> if (result == IDOK)</P>
<P> {</P>
<P> // Create and initialize the new node.</P>
<P> CStudent* m_pStudent = new CStudent;</P>
<P> m_pStudent->m_name = dialog.m_name;</P>
<P> m_pStudent->m_score = dialog.m_score;</P>
<P> // Add the node to the list.</P>
<P> m_list.AddTail(m_pStudent);</P>
<P> // Repaint the window.</P>
<P> 		Invalidate();</P>
<P> }</P>
<P>	CView::OnLButtonDown(nFlags, point);</P>
<P>}</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">12.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>当用户单击右键后,弹出如图</FONT><FONT SIZE=3>10.5</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的对话框,可以删除一个节点。对应的OnRButtonDown()函数代码如下:</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>void CMyListView::OnRButtonDown(UINT nFlags, CPoint point) </P>
<P>{</P>
<P>	// TODO: Add your message handler code here and/or call default</P>
<P>	CRemoveStudentDlg dialog;</P>
<P> dialog.m_radio = 0;</P>
<P> // Display the dialog box.</P>
<P> int result = dialog.DoModal();</P>
<P> // If the user clicked the OK button...</P>
<P> if (result == IDOK)</P>
<P> {</P>
<P> CStudent* m_pStudent=new CStudent;</P>
<P> // Make sure the list isn't empty.</P>
<P> if (m_list.IsEmpty())</P>
<P> MessageBox("节点已经全部删除!");</P>
<P> else</P>
<P> {</P>
<P> // Remove the specified node.</P>
<P> if (dialog.m_radio == 0)</P>
<P> m_pStudent = (CStudent*)m_list.RemoveHead();</P>
<P> else</P>
<P> m_pStudent = (CStudent*)m_list.RemoveTail();</P>
<P> // Delete the node object and repaint the window.</P>
<P> delete m_pStudent;</P>
<P> Invalidate();</P>
<P> 		}</P>
<P> }</P>
<P>	CView::OnRButtonDown(nFlags, point);</P>
<P>}</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">13.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>最后设置</FONT><FONT SIZE=3>OnDraw</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>()函数用来响应</FONT><FONT SIZE=3>Invalidate()</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>void CMyListView::OnDraw(CDC* pDC)</P>
<P>{</P>
<P>	CListDoc* pDoc = GetDocument();</P>
<P>	ASSERT_VALID(pDoc);</P>
<P>	// TODO: add draw code for native data here</P>
<P> TEXTMETRIC textMetric;</P>
<P> pDC->GetTextMetrics(&textMetric);</P>
<P> int fontHeight = textMetric.tmHeight;</P>
<P> // Initialize values used in the loop.</P>
<P> POSITION pos = m_list.GetHeadPosition();</P>
<P> int displayPosition = 10;</P>
<P> // Iterate over the list, displaying each node's values.</P>
<P> while (pos != NULL)</P>
<P> {</P>
<P> 	CStudent* m_pStudent = (CStudent*)m_list.GetNext(pos);</P>
<P> 	char s[81];</P>
<P> 	wsprintf(s, " 的成绩是 %d.",m_pStudent->m_score);</P>
<P>			CString m_string=m_pStudent->m_name+s;</P>
<P> 	pDC->TextOut(10, displayPosition, m_string);</P>
<P> 	displayPosition += fontHeight;</P>
<P> }</P>
<P>}</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="CENTER"><IMG SRC="Image297.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image297.gif" WIDTH=280 HEIGHT=201></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>10. 6 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>程序运行的初始窗口</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">14.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>最后在</FONT><FONT SIZE=3>CListView</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的析构函数中删除数组中所有的节点。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>CMyListView::~CMyListView()</P>
<P>{</P>
<P>	while (!m_list.IsEmpty())</P>
<P> {</P>
<P> CStudent* m_pStudent = (CStudent*)m_list.RemoveHead();</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -