友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
C语言实例教程(PDF格式)-第51部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_INDEX)…》EnableWindow(false);
}
为了确定用户选择了哪一个单选按钮,重载CDialog::OnOK()。
void CArrayAddDlg::OnOK()
{
…………………………………………………………Page 600……………………………………………………………
// TODO: Add extra validation here
UINT nRadio=GetCheckedRadioButton(IDC_ADD0;IDC_ADD2);
switch(nRadio)
{
case IDC_ADD0:
m_radio=0;
break;
case IDC_ADD1:
m_radio=1;
break;
case IDC_ADD2:
m_radio=2;
break;
default:
break;
}
CDialog::OnOK();
}
按照下面的步骤创建另一个对话框类CRemoveDlg。
1。 创建如图10。2所示的对话框,两个单选按钮的ID分别是
IDC_REMOVE0和IDC_REMOVE1。
图10。 2 删除数组元素对话框
…………………………………………………………Page 601……………………………………………………………
2。 在ClassWizard中为文本框映射一个UINT类型的变量m_index。
3。 给该对话框添加一个UINT类型的成员变量m_radio。
4。 为WM_INITDIALOG添加函数OnInitDialog(),在其中设置单选按钮
的初始状态。
BOOL CArrayRemoveDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
((CButton*)GetDlgItem(IDC_REMOVE1))…》SetCheck(1);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
5.添加两个函数用以响应用户单击单选按钮。
void CArrayRemoveDlg::OnRemove0()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_INDEX)…》EnableWindow(false);
}
void CArrayRemoveDlg::OnRemove1()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_INDEX)…》EnableWindow(true);
}
6。 为了确定用户选择了哪一个单选按钮,重载CDialog::OnOK()。
void CArrayRemoveDlg::OnOK()
{
…………………………………………………………Page 602……………………………………………………………
// TODO: Add extra validation here
UINT nRadio=GetCheckedRadioButton(IDC_REMOVE0;IDC_REMOVE1);
switch(nRadio)
{
case IDC_REMOVE0:
m_radio=0;
break;
case IDC_REMOVE1:
m_radio=1;
break;
default:
break;
}
CDialog::OnOK();
}
现在编译并运行这个程序,首先在窗口中显示一个有十个元素的数
组,如图10。3所示。单击左键弹出如图10。1所示的对话框,你可以选
择三种数组操作:设置、插入和添加。单击右键弹出如图10。2所示的
对话框,你可以选择两种删除操作:删除全部元素和删除指定元素。
图10。 3 程序运行初始窗口
…………………………………………………………Page 603……………………………………………………………
第二节 列表类
列表类象是有特殊功能的数组。列表的元素被称为节点。列表使用指
针来连结它的节点。如果你希望快速的插入和删除数组元素,列表类
是一个比较好的选择。但是在列表中查找一个元素要比在数组中慢,
因为列表需要按照指针顺序从一个节点到另外一个节点。
通常我们称列表中第一个节点为列表的头,列表中最后一个节点是列
表的尾。
列表类有以下成员函数:
Clist
Clist类的构造函数,其中的参数指定分配内存的基本单元。
GetHead( )
获得列表的第一个元素的值。
GetTail( )
获得列表的最后一个元素的值。
RemoveHead( )
删除列表中第一个元素
RemoveTail( )
删除列表中最后一个元素。
AddHead
在列表的头部添加一个节点,使这个节点成为列表的新的头。
AddTail
在列表的尾部添加一个节点,使这个节点成为列表的新的尾。
RemoveAll()
删除节点中所有的元素。
…………………………………………………………Page 604……………………………………………………………
GetHeadPosition( )
获得列表的头节点的位置。
GetTailPosition( )
获得列表中尾节点的位置。
GetNext()
获得指定位置下一个节点处的值。
GetPrev()
获得指定位置上一个节点处的值。
GetAt()
获得指定位置处节点的值。
SetAt()
设置指定位置处节点的值。
RemoveAt()
删除指定位置处的节点。
InsertBefore()
在指定位置的前面插入一个节点。
InsertAfter()
在指定位置的后面插入一个节点。
Find()
按照列表顺序搜索给定的对象指针,返回一个POSITION类型的量。
FindIndex()
按照列表顺序搜索指定的下标。
GetCount()
…………………………………………………………Page 605……………………………………………………………
获得列表中包含的节点个数。
IsEmpty()
检查一个列表是否不含有任何节点。
下面的程序将允许用户添加和删除节点,按照以下步骤进行:
1。 使用MFC AppWizard创建一个单文档应用程序List。
2。 添加一个对话框类CAddStudentDlg,其对应的对话框如图10。4所
示。
图10。 4 添加节点对话框
3。 为两个文本框映射两个变量m_name,m_score。
4。 添加一个对话框类CRemoveStudentDlg,其对应的对话框如图10。5
所示。两个单选按钮的ID为IDC_REMOVE0和IDC_REMOVE1。
图10。 5 删除节点对话框
5。 为对话框类添加一个UINT类型的成员变量m_radio。
6。 在OnInitDialog()函数中设置单选按钮的初始状态。
BOOL CRemoveStudentDlg::OnInitDialog()
{
CDialog::OnInitDialog();
…………………………………………………………Page 606……………………………………………………………
// TODO: Add extra initialization here
((CButton*)GetDlgItem(IDC_REMOVE0))…》SetCheck(1);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
7。 为了知道用户选择了哪一个单选按钮,在OnOk()函数中添加下面
的代码。
void CRemoveStudentDlg::OnOK()
{
// TODO: Add extra validation here
UINT nRadio=GetCheckedRadioButton(IDC_REMOVE0;IDC_REMOVE1);
switch(nRadio)
{
case IDC_REMOVE0:
m_radio=0;
break;
case IDC_REMOVE1:
m_radio=1;
break;
default:
break;
}
CDialog::OnOK();
}
8。 在ListView。h中CListView类的声明之前添加如下代码,用来定义
一个结构体CStudent,包含两个变量m_name和m_score,分别用于存
放学生的姓名和成绩。
…………………………………………………………Page 607……………………………………………………………
struct CStudent
{
CString m_name;
int m_score;
};
9。 为ClistView添加一个类型为CptrList的成员变量m_list。
10。 在ListView。cpp中添加下列语句:
#include 〃AddStudentDlg。h〃
#include 〃RemoveStudentDlg。h〃
11。 当用户单击左键后,弹出如图10。4所示的对话框,可以添加一个
节点。对应的OnLButtonDown 函数代码如下:
void CMyListView::OnLButtonDown(UINT nFlags; CPoint point)
{
// TODO: Add your message handler code here and/or call default
CAddStudentDlg dialog;
dialog。m_name = 〃〃;
dialog。m_score = 0 ;
// Display the dialog box。
int result = dialog。DoModal();
if (result == IDOK)
{
// Create and initialize the new node。
CStudent* m_pStudent = new CStudent;
m_pStudent…》m_name = dialog。m_name;
m_pStudent…》m_score = dialog。m_score;
// Add the node to the list。
…………………………………………………………Page 608……………………………………………………………
m_list。AddTail(m_pStudent);
// Repaint the window。
Invalidate();
}
CView::OnLButtonDown(nFlags; point);
}
12。 当用户单击右键后,弹出如图10。5所示的对话框,可以删除一个
节点。对应的OnRButtonDown 函数代码如下:
void CMyListView::OnRButtonDown(UINT nFlags; CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRemoveStudentDlg dialog;
dialog。m_radio = 0;
// Display the dialog box。
int result = dialog。DoModal();
// If the user clicked the OK button。。。
if (result == IDOK)
{
CStudent* m_pStudent=new CStudent;
// Make sure the list isn't empty。
if (m_list。IsEmpty())
MessageBox(〃节点已经全部删除!〃);
else
{
// Remove the specified node。
if (dialog。m_radio == 0)
…………………………………………………………Page 609……………………………………………………………
m_pStudent = (CStudent*)m_list。RemoveHead();
else
m_pStudent = (CStudent*)m_list。RemoveTail();
// Delete the node object and repaint the window。
delete m_pStudent;
Invalidate();
}
}
CView::OnRButtonDown(nFlags; point);
}
13。 最后设置OnDraw 函数用来响应Invalidate()。
void CMyListView::OnDraw(CDC* pDC)
{
CListDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
TEXTMETRIC textMetric;
pDC…》GetTextMetrics(&textMetric);
int fontHeight = textMetric。tmHeight;
// Initialize values used in the loop。
POSITION pos = m_list。GetHeadPosition();
int displayPosition = 10;
// Iterate over the list; displaying each node's values。
while (pos != NULL)
{
CStudent* m_pStudent = (CStudent*)m_list。GetNext(pos);
…………………………………………………………Page 610……………………………………………………………
char s'81';
wsprintf(s; 〃 的成绩是 %d。〃;m_pStudent…》m_score);
CString m_string=m_pStudent…》m_name+s;
pDC…》TextOut(10; displayPosition; m_string);
displayPosition += fontHeight;
}
}
图10。 6 程序运行的初始窗口
14。 最后在CListView的析构函数中删除数组中所有的节点。
CMyListView::~CMyListView()
{
while (!m_list。IsEmpty())
{
CStudent* m_pStudent = (CStudent*)m_list。RemoveHead();
delete m_pStudent;
}
}
现在编译并运行这个程序,当程序运行后,弹出如图10。6所示的窗
口。单击左键,弹出如图10。4所示的对话框来添加节点。单击右键,
弹出如图10。5所示的对话框来删除节点。如果在没有节点删除节点,
将弹出如图10。7所示的对话框提示用户节点已经全部删除。
…………………………………………………………Page 611……………………………………………………………
图10。 7 没有节点时删除节点弹出的消息框
第三节 映射类
这个类用于创建关键对象和数值对象联系的集合。你可以使用MFC的
映射类创建查询表格。MFC的映射类包含CMapPtrToPtr;
CMapPtrToWord; CMapStringToOb; CMapStringToPtr;
CMapStringToString; CMapWordToOb; and CmapWordToPtr。在类的名
称中第一个数据类型是关键字的数据类型,第二个数据类型是对应的
数值的数据类型。
映射类有下列成员函数:
Lookup()
查询映射到指定关键字的值。
SetAt()
向映射中插入一个元素,如果指定的关键字存在,替换掉原来的元
素。
operator ' '
向映射中插入一个元素,其作用和SetAt()相同。
RemoveKey
查询符合关键字的映射。如果发现,则删除这个元素。
RemoveAll( )
删除映射中所有的元素。
GetStartPosition( )
获得映射中第一个元素的位置。映射中第一个元素是不预知的,所以
映射的第一个元素实际上没有特定的意义。一般将这个值传递给
GetNextAssoc 函数。
…………………………………………………………Page 612……………………………………………………………
GetNextAssoc
获得映射中指定位置处下一个元素。
GetCount( )
获得映射中元素的个数。
IsEmpty( )
测试这个数组元素是否为空。
现在用一个查询程序来使你对映射类有一个更深入的了解。按照下面
的步骤创建这个程序。
1。 创建一个单文档的应用程序Map。
2。 添加如图10。8所示的对话框,并生成基于这个对话框的类
CLookUpMapDlg;并为文本框添加一个变量m_key。
图10。 8 查询表格
3。 为CMapView添加一个CMapStringToString类型的成员变量m_map。
4。 在CMapView的构造函数中添加下列代码初始化映射。
CMapView::CMapView()
{
// TODO: add construction code here
m_map。SetAt(〃red〃; 〃红色〃);
m_map。SetAt(〃yellow〃; 〃黄色〃);
m_map。SetAt(〃green〃; 〃绿色〃);
m_map。SetAt(〃blue〃; 〃蓝色〃);
m_map。SetAt(〃white〃; 〃 白色〃);
…………………………………………………………Page 613……………………………………………………………
m_map。SetAt(〃black〃; 〃黑色〃);
}
5。 在MapView。cpp中添加下列语句:
#include 〃LookUpMapDlg。h〃
6。 为WM_LbuttonDown消息添加消息处理函数OnLButtonDown();代码
如下:
void CMapView::OnLButtonDown(UINT nFlags; CPoint point)
{
// TODO: Add your message handler code here and/or call default
CLookUpMapDlg dialog(this);
dialog。m_key = 〃〃;
// Display the dialog box。
int result = dialog。DoModal();
if (result == IDOK)
{
// Look for the requested value。
CString m_value;
BOOL m_bFound = m_map。Lookup(dialog。m_key; m_value);
if (m_bFound)
MessageBox(m_value);
else
MessageBox(〃未发现匹配字符串〃);
}
CView::OnLButtonDown(nFlags; point);
}
7。 在OnDraw()函数中添加下列代码,在视图中显示映射中所有的元
…………………………………………………………Page 614……………………………………………………………
素。
void CMapView::OnDraw(CDC* pDC)
{
CMapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
TEXTMETRIC textMetric;
pDC…》GetTextMetrics(&textMetric);
int fontHeight = textMetric。tmHeight;
int displayPosition = 10;
POSITION pos =m_map。GetStartPosition();
CString m_key;
CString m_value;
int m_index=m_map。GetCount();
for(int i=0;iTextOut(10; displayPosition;m_str);
displayPosition += fontHeight;
}
}
现在编译并运行程序,首先出现如图10。9所示的主窗口,映射中每一
个元素都显示在
…………………………………………………………Page 615……………………………………………………………
图10。 9 程序运行初始窗口
其中。单击左键弹出如图10。8所示的对话框,用户在其中输入要查询
的关键字,选择 “确定”按钮,如果映射中存在此关键字,将弹出如
图10。10所示的对话框告知用户关键字对应的中文意思。如果映射中
不存在此关键字,弹出如图10。11所示的对话框告知用户未发现匹配
字符串。
图10。 10 查询结果显示对话框
图10。 11 未发现匹配字符串
第四节 字符串类
MFC中的CString类使用C++操作字符串和使用Basic或Pascal一样便
捷。CString类没有基类。一个CString类的对象由一个长度可变的字
符序列组成。CString包含很多成员函数用来操作字符串。
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!