第 7章 MFC通用类内容摘要:
1,MFC中数组类的使用方法
2,MFC中链表类的使用方法
3,MFC中字符串类 CString的使用方法
4,MFC中日期和时间类的使用方法
5.MFC中 CPoint类,CSize类和 CRect类的使用方法返回目录
7.1 数组类学习目标
1.了解 MFC中的数组类及其常用成员函数。
2.利用 MFC中的数组类处理数据 。
7.1
返回第 7章
CByteArray:
CDWordArray:
CPtrArray:
CUIntArray:
CWordArray:
CStringArray:
7.1
MFC的数组类
1,int Add( ARG_TYPE newElement) ; throw( CMemoryException) ;
2,TYPE& ElementAt( int nIndex ) ;
3,voidFreeExtra( ) ;
4,TYPE GetAt( int nIndex ) const
5,int GetSize( ) const;
6,int GetUpperBound( ) const;
7,(1)void InsertAt( int nIndex,ARG_TYPE newElement,int nCount = 1 ) ;
throw( CMemoryException) ;
(2)void InsertAt( int nStartIndex,CArray* pNewArray ) ;
throw( CMemoryException) ;
8,voidRemoveAll( ) ;
9,voidSetAt( int nIndex,ARG_TYPE newElement) ;
10,void SetAtGrow ( int nIndex,ARG_TYPE newElement ) ; throw
( CMemoryException ) ;
11,void SetSize ( int nNewSize,int nGrowBy = -1 ) ; throw
( CMemoryException ) ;
7.1MFC数组类的常用成员函数例题 (1--2) 7.1
1.创建一个基于单文档的应用程序 (Array)
2.编辑对话框资源
(1) IDD_DIALOG_ADD
IDC_STATIC Group Box Caption:设置添加操作
IDC_RADIO_SET Radio Button Caption:设置,Group:选中
IDC_RADIO_ADD Radio Button Caption:添加
IDC_RADIO_INSERT Radio Button Caption:插入
IDC_STATIC Static Text Caption:数组元素下标
IDC_EDIT_INDEX Edit Box
IDC_STATIC Static Text Caption:设置值
IDC_EDIT_VALUE Edit Box
IDOK Button Caption:确定
IDCANCEL Button Caption:取消关联变量,
IDC_RADIO_SET int m_nRidio
IDC_EDIT_INDEX int m_nIndex
IDC_EDIT_VALUE CString m_strValue
例题 (2) 7.1
(2) IDD_DIALOG_ADD
IDC_STATIC Group Box Caption:设置添加操作
IDC_RADIO_ALL Radio Button Caption:全部元素,Group:选中
IDC_RADIO_ELEMENT Radio Button Caption:指定元素
IDC_STATIC Static Text Caption:数组下标
IDC_EDIT_VALUE Edit Box
IDOK Button Caption:确定
IDCANCEL Button Caption:取消关联变量,
IDC_RADIO_ALL int m_nRidio
IDC_EDIT_VALUE int m_nIndex
例题 (3) 7.1
3.为对话框 IDD_DIALOG_ADD添加响应函数
BOOL CDlgAdd::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO,Add extra initialization here
((CButton*)GetDlgItem(IDC_RADIO_SET))->SetCheck(1);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION,OCX Property Pages should return FALSE
}
void CDlgAdd::OnRadioSet()
{
// TODO,Add your control notification handler code here
GetDlgItem(IDC_EDIT_INDEX)->EnableWindow(true);
}
例题 (3) 7.1
void CDlgAdd::OnRadioAdd()
{
// TODO,Add your control notification handler code here
GetDlgItem(IDC_EDIT_INDEX)->EnableWindow(false);
}
void CDlgAdd::OnRadioInsert()
{
// TODO,Add your control notification handler code here
GetDlgItem(IDC_EDIT_INDEX)->EnableWindow(true);
}
void CDlgAdd::OnOK()
{
// TODO,Add extra validation here
UpdateData(true);
CDialog::OnOK();
}
例题 (4) 7.1
BOOL CDlgDelete::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO,Add extra initialization here
((CButton*)GetDlgItem(IDC_RADIO_ALL))->SetCheck(1);
GetDlgItem(IDC_EDIT_INDEX)->EnableWindow(false);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION,OCX Property Pages should return FALSE
}
void CDlgDelete::OnRadioElement()
{
// TODO,Add your control notification handler code here
GetDlgItem(IDC_EDIT_INDEX)->EnableWindow(true);
}
4.为对话框 IDD_DIALOG_DELETE添加响应函数例题 (4)
7.1
void CDlgDelete::OnRadioAll()
{
// TODO,Add your control notification handler code here
GetDlgItem(IDC_EDIT_INDEX)->EnableWindow(false);
}
void CDlgDelete::OnOK()
{
// TODO,Add extra validation here
UpdateData(true);
CDialog::OnOK();
}
例题 (5) 7.1
protected:
CStringArray m_strArray;
CArrayView::CArrayView()
{
// TODO,add construction code here
m_strArray.SetSize(5,5);
m_strArray[0] = "111111111111";
m_strArray[2] = "333333333333";
m_strArray[4] = "555555555555";
}
5.调用对话框并处理数组
( 1)在视类中添加数组对象并初始化例题 (5) 7.1
( 2)编辑菜单资源在菜单,编辑,下添加两个菜单项如下:
ID号 Caption
ID_EDIT_ADD 设置添加
ID_EDIT_DELETE 删除
( 3)添加 ID_EDIT_ADD菜单项的消息响应函数例题 (5) 7.1void CArrayView::OnEditAdd(){
CDlgAdd dlg;
dlg.m_nIndex = 0;
dlg.m_strValue = "Default";
dlg.m_nRadio = 0;
int result = dlg.DoModal();
if (result == IDOK)
{
if (dlg.m_nRadio == 0)
m_strArray.SetAtGrow(dlg.m_nIndex,dlg.m_strValue);
else if (dlg.m_nRadio == 1)
m_strArray.Add(dlg.m_strValue);
else
m_strArray.InsertAt(dlg.m_nIndex,dlg.m_strValue,1);
Invalidate();
}
}
例题 (5)
7.1
void CArrayView::OnEditDelete()
{
CDlgDeletedlg;
dlg.m_nRadio= 0;
dlg.m_nIndex= 0;
int result = dlg.DoModal();
if (result == IDOK)
{
if (dlg.m_nRadio==0)
m_strArray.RemoveAll();
else
{
if(m_strArray.GetUpperBound() < dlg.m_nIndex)
AfxMessageBox("The index is large than array upperbound!");
else
m_strArray.RemoveAt(dlg.m_nIndex);
}
Invalidate();
}
}
( 4)添加 ID_EDIT_DELETE菜单项的消息响应函数例题 (5)
7.1
void CArrayView::OnDraw(CDC* pDC)
{
CArrayDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
TEXTMETRIC textMetric;
pDC->GetTextMetrics(&textMetric);
int fontHeight = textMetric.tmHeight;
int count = m_strArray.GetSize();
int displayPos = 10;
for (int x=0; x<count; ++x)
{
CString strValue = m_strArray.GetAt(x);
pDC->TextOut(10,displayPos,strValue);
displayPos += fontHeight;
}
}
( 5)重载视类的 OnDraw()函数
7.2 链表类学习目标
1.了解 MFC中的链表类及其常用成员函数。
2.利用 MFC中的链表类处理数据 。
7.2
返回第 7章模板类
Clist
CTypedPtrList
非模板类
CObList
CPtrList
CStringList
7.2
MFC的链表类
1,CList( int nBlockSize = 10 ) ;
2,TYPE GetHead( ) const;
3,TYPE GetTail( ) const;
4,RemoveHead( )
5,RemoveTail( )
6,原型 1,POSITION AddHead( ARG_TYPE newElement ) ;
原型 2,void AddHead( CList* pNewList ) ;
7,原型 1,POSITION AddTail( ARG_TYPE newElement) ;
原型 2,void AddTail( CList* pNewList ) ;
8,RemoveAll( )
9,POSITION GetHeadPosition( ) const;
10,POSITION GetTailPosition( ) const;
11,TYPE GetNext( POSITION& rPosition) const;
12,TYPE GetPrev( POSITION& rPosition) const;
13,TYPE GetAt( POSITION position) const;
14,void SetAt( POSITION pos,ARG_TYPE newElement) ;
7.2MFC链表类的常用成员函数 ——以 Clist为例
15,void RemoveAt( POSITION position ) ;
16,POSITION InsertBefore( POSITION position,ARG_TYPE
newElement ) ;
17,POSITION InsertAfter( POSITION position,ARG_TYPE
newElement ) ;
18,POSITION Find ( ARG_TYPE searchValue,POSITION
startAfter = NULL) const;
19,POSITION FindIndex( int nIndex ) const;
20,int GetCount( ) const;
21,BOOL IsEmpty( ) const;
7.2MFC链表类的常用成员函数 ——以 Clist为例例题 (1--2) 7.2
1.创建一个基于单文档的应用程序 (List )
2.编辑对话框资源
(1) IDD_DIALOG_ADD
IDC_STATIC Group Box Caption:添加结点
IDC_STATIC Static Text Caption:姓名
IDC_STATIC Static Text Caption:成绩
IDC_EDIT_NAME Edit Box
IDC_EDIT_SCORE Edit Box
IDOK Button Caption:确定
IDCANCEL Button Caption:取消关联变量,
IDC_EDIT_NAME CString m_strName
IDC_EDIT_SCORE int m_nScore
例题 (2) 7.2
( 2) IDD_DIALOG_DELETE
IDC_STATIC Group Box Caption:删除结点
IDC_RADIO_HEAD Radio Button Caption:头结点,Group:选中
IDC_RADIO_TAIL Radio Button Caption:尾结点
IDC_RADIO_NUMBER Radio Button Caption:指定结点序号
IDC_STATIC Static Text Caption:结点序号
IDC_EDIT_NUMBER Edit Box
IDOK Button Caption:确定
IDCANCEL Button Caption:取消关联变量,
IDC_RADIO_HEAD int m_nRidio
IDC_EDIT_NUMBER int m_nNumber
例题 (3)
7.2
3.为对话框 IDD_DIALOG_ADD添加响应函数
void CDlgAdd::OnOK()
{
// TODO,Add extra validation here
UpdateData(true);
CDialog::OnOK();
}
例题 (4)
7.2
BOOL CDlgDelete::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO,Add extra initialization here
((CButton*)GetDlgItem(IDC_RADIO_HEAD))->SetCheck(1);
GetDlgItem(IDC_EDIT_NUMBER)->EnableWindow(false);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION,OCX Property Pages should return FALSE
}
4.为对话框 IDD_DIALOG_DELETE添加响应函数例题 (4) 7.2
void CDlgDelete::OnRadioHead()
{
// TODO,Add your control notification handler code here
GetDlgItem(IDC_EDIT_NUMBER)->EnableWindow(false);
}
void CDlgDelete::OnRadioTail()
{
// TODO,Add your control notification handler code here
GetDlgItem(IDC_EDIT_NUMBER)->EnableWindow(false);
}
void CDlgDelete::OnRadioNumber()
{
// TODO,Add your control notification handler code here
GetDlgItem(IDC_EDIT_NUMBER)->EnableWindow(true);
}
例题 (4--5) 7.2
void CDlgDelete::OnOK()
{
// TODO,Add extra validation here
UpdateData(true);
CDialog::OnOK();
}
5.调用对话框并处理数组
( 1)在视类头文件中定义 CStudent结构体添加链表类对象
struct CStudent
{
CString m_strName;
int m_nScore;
};
并在视类添加链表类对象
protected:
CPtrList m_List;
例题 (5) 7.2
( 2)编辑菜单资源。
在菜单,编辑,下添加两个菜单项如下:
ID号 Caption
ID_EDIT_ADD 添加结点
ID_EDIT_DELETE 删除结点
( 3)添加 ID_EDIT_ADD菜单项的消息响应函数例题 (5) 7.2void CMyListView::OnEditAdd(){
CDlgAdd dlg;
dlg.m_strName = "";
dlg.m_nScore = 0 ;
int result = dlg.DoModal();
if (result == IDOK)
{
// Create and initialize the new node.
CStudent* m_pStudent = new CStudent;
m_pStudent->m_strName = dlg.m_strName;
m_pStudent->m_nScore = dlg.m_nScore;
// Add the node to the list.
m_List.AddTail(m_pStudent);
// Repaint the window.
Invalidate();
}
}
例题 (5)
7.2
void CMyListView::OnEditDelete()
{
CDlgDelete dlg;
dlg.m_nRadio = 0;
int result = dlg.DoModal();
if (result == IDOK)
{
CStudent* m_pStudent = NULL;
if (m_List.IsEmpty())
MessageBox("结点已经全部删除 !");
else
{
if (dlg.m_nRadio == 0)
m_pStudent = (CStudent*)m_List.RemoveHead();
else if(dlg.m_nRadio == 1)
m_pStudent = (CStudent*)m_List.RemoveTail();
else
{
( 4)添加 ID_EDIT_DELETE菜单项的消息响应函数例题 (5)
7.2
void CMyListView::OnDraw(CDC* pDC)
{
CListDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
TEXTMETRIC textMetric;
pDC->GetTextMetrics(&textMetric);
int fontHeight = textMetric.tmHeight;
POSITION pos = m_List.GetHeadPosition();
int displayPosition = 10;
while (pos != NULL)
{
CStudent* m_pStudent = (CStudent*) m_List.GetNext(pos);
char s[81];
wsprintf(s," 的成绩是 %d.",m_pStudent->m_nScore);
CString m_string=m_pStudent->m_strName+s;
pDC->TextOut(10,displayPosition,m_string);
displayPosition += fontHeight;
( 5)重载视类的 OnDraw()函数
7.3 字符串类学习目标
1.了解字符串类 CString及其常用成员函数。
2.利用 CString处理字符串 。
7.3
返回第 7章
1,int GetLength( ) const;
说明:获取 CString类对象包含字符串的长度 ( 字符数 ) 。
2,BOOL IsEmpty( ) const;
说明:测试 CString类对象包含的字符串是否为空 。
3,void Empty( ) ;
说明:使 CString类对象包含的字符串为空字符串 。
4,TCHAR GetAt( int nIndex ) const;
说明:获得字符串指定位置处的字符 。
5,TCHAR operator []( int nIndex ) const;
说明:获得字符串指定位置处的字符,作用和 GetAt( ) 一样 。
6,void SetAt( int nIndex,TCHAR ch ) ;
说明:设定字符串指定位置处的字符 。
7,operator LPCTSTR ( ) const;
说明:返回指向储存在 CString类对象内的字符串指针 。
7.3CString类的常用成员函数
1,operator =
说明:将一个新的值赋予 CString对象 。
2,operator +
说明:将两个字符串合并成一个新的字符串 。 在两个参数中必须有一个是 CString类型的,而另一个参数可以是字符,字符指针或 CString类型对象 。
3,operator +=
说明:在一个字符串的后面再添加一个字符串或一个字符 。
7.3CString类的常用成员函数
1,CString类重载了,==”,,!=”,,>=”,,>”,,<=”,,<”
等比较运算符,可用于两个字符串间的各种比较运算,比较时区分大小写 。
2,Compare
原形,int Compare( LPCTSTR lpsz ) const;
说明:比较两个字符串,如果两个字符串相等,返回值等于 0;
如果本对象大于参数字符串,返回值大于 0;如果本对象小于参数字符串,返回值小于 0,比较时区分大小写 。
3,CompareNoCase
原型,int CompareNoCase( LPCTSTR lpsz ) const;
说明:与 Compare函数类似,不同的是在忽略字符大小写的情况下比较两个字符串 。
7.3CString类的常用成员函数
1,Mid
Mid函数有两个重载函数:
CString Mid( int nFirst ) const; throw( CMemoryException) ;
获取从 nFirst位置开始的子串 。
CString Mid( int nFirst,int nCount ) const; throw( CMemoryException) ;
获取从 nFirst位置开始包含 nCount个字符的子串 。
2.CString Left( int nCount ) const;throw( CMemoryException ) ;
说明:获取字符串左边 nCount长度的字符串 。
3,CString Right( int nCount ) const; throw( CMemoryException) ;
说明:获取字符串右边 nCount长度的字符串 。
4,CString SpanIncluding ( LPCTSTR lpszCharSet ) const;throw
( CMemoryException ) ;
说明:从字符串中提取包含在指定字符集 lpszCharSet中的字符的子串 。 它从字符串的第一个字符开始,直到遇到不属于 lpszCharSet中的字符为止 。
5,CString SpanExcluding ( LPCTSTR lpszCharSet ) const;throw
( CMemoryException ) ;
说明:从字符串中提取不包含在指定字符集 lpszCharSet中的字符的子串 。
7.3CString类的常用成员函数
1,MakeUpper
将字符串中所有的字符全部转化成大写形式 。
2,MakeLower
将字符串中所有的字符全部转化成小写形式 。
3,MakeReverse
将字符串倒置,即将字符的顺序颠倒,第一个字符变成最后一个字符 。
4,int Replace( TCHAR chOld,TCHAR chNew ) ;
int Replace( LPCTSTR lpszOld,LPCTSTR lpszNew ) ;
说明:将字符串中的字符 chOld或字符子串 lpszOld替换成新的字符 chNew或字符串 lpszNew。
5,void CString::TrimLeft( TCHAR chTarget) ;
void CString::TrimLeft( LPCTSTR lpszTargets) ;
说明:删除字符串左边开头的字符或字符子串,参数缺省时删除左边的空格 。
6,voidCString::TrimRight( TCHAR chTarget ) ;
void CString::TrimRight( LPCTSTR lpszTargets) ;
说明:删除字符串右边开头的字符或字符子串,参数缺省时删除右边的空格 。
7.3CString类的常用成员函数
1,Find
原型:
int Find( TCHAR ch ) const;
int Find( LPCTSTR lpszSub ) const;
int Find( TCHAR ch,int nStart ) const;
int Find( LPCTSTR pstr,int nStart ) const;
说明:在字符串中查找指定的字符或字符串 。 参数 ch为要查找的字符;
lpszSub为要查找的字符子串; nStart指定查找的起始位置,如缺省为从最左边开始; pstr指向欲查找子串的指针 。
2,ReverseFind
原型,int ReverseFind( TCHAR ch ) const;
说明:返回字符串中最后一个和指定的字符匹配的字符的下标 。
3,FindOneOf
原型,int FindOneOf( LPCTSTR lpszCharSet) const;
说明:在字符串中查找第一个和指定的字符集 lpszCharSet中任何一个字符匹配的字符的位置 。
7.3CString类的常用成员函数例题 (1--2) 7.3
例 1:连结字符串
CString m_str1="工作 ";
CString m_str2="正常 ";
CString m_str3=m_str1+m_str2;
执行第三行后,m_str3的值应该是,工作正常,。
例 2:比较字符串
CString m_str1="a";
CString m_str2="b";
int result=m_str1.Compare(m_str2);
if(result=0)
AfxMessageBox("两者相同 ");
else if(result>0)
AfxMessageBox("m_str1大于 m_str2");
else
AfxMessageBox("m_str1小于 m_str2");
运行结果在信息框中显示,m_str1小于 m_str2”。两个字符串比较大小时从第一个字母开始,按照对应的 ASCII值比较。如果第一个字母相同,再比较下一个字母。依次往下直到比较出大小为止。
例题 (3) 7.3
例 3:提取字符串
CString m_str1="abcde";
CString
m_str2=m_str1.Left(1)+m_str1.Mid(2,1)+m_str1.Right(1);
AfxMessageBox(m_str2);
运行结果在信息框中显示 m_str2的内容,ace”。 m_str1.Left
( 1) 得到 m_str1的最左边的一个字符,a”,m_str1.Mid
( 2,1) 从 m_str1中取得从索引为 2开始的一个字符,c”,
m_str1.Right( 1) 得到 m_str1的最右边的一个字符,e”。
例题 (4) 7.3
例 4:查找字符串
CString m_str1="abcdef";
CString m_str2="deq";
int index=m_str1.Find(m_str2);
if(index>=0)
{
char s[10];
wsprintf(s,"匹配字符的下标为 %d",index);
MessageBox(s);
}
else
MessageBox("没有匹配字符 ");
运行结果在信息框中显示,没有匹配字符,。 m_str1.Find
( m_str2) 在 m_str1中查找 m_str2的内容,deq”,由于未找到返回 –1。
例题 (5) 7.3
例 5:变换字符串
CString m_str=" ABCabc ";
m_str.TrimLeft();
m_str.TrimRight();
m_str.MakeUpper();
MessageBox(m_str);
运行结果在信息框中显示,ABCABC”。
m_str.TrimLeft( ) 和 m_str.TrimRight( ) 分别去掉 m_str 左边和右边的空格,
m_str.MakeUpper( ) 将 m_str中的所有字母转换成大写 。
7.4 日期和时间类学习目标
1.利用 CTime处理时间。
2.利用 CTimeSpan处理时间间隔 。
7.4
返回第 7章
1,构造和初始化 CTime类对象
CTime类有下列构造函数:
CTime( ) ;
CTime( const CTime& timeSrc) ;
CTime( time_t time) ;
CTime( int nYear,int nMonth,int nDay,int nHour,int nMin,int nSec,int nDST =
-1 ) ;
CTime( WORD wDosDate,WORD wDosTime,int nDST = -1 ) ;
CTime( const SYSTEMTIME&sysTime,int nDST = -1 ) ;
CTime( const FILETIME& fileTime,int nDST = -1 ) ;
说明:以不同的方式构造一个 CTime对象 。 可以用一个已经存在的 CTime对象或一个 time_t( 在 time.h中被定义为 long) 类型变量来构造和初始化
CTime对象,也可以用年,月,日,小时,分,秒来构造和初始化
CTime对象,还可以用 SYSTEMTIME,FILETIME结构来构造和初始化
CTime对象 。 SYSTEMTIME,FILETIME结构定义如下:
7.4CTime类的常用成员函数
2,时间值的提取函数
( 1) GetCurrentTime( ) 获取系统当前时间 。
原型,static CTime PASCAL GetCurrentTime( ) ;
( 2) GetTime( ) 由 CTime对象返回一个 time_t变量 。
原型,time_t GetTime( ) const;
( 3) GetYear( ) 获取 CTime对象代表的年 。
原型,intGetYear( ) const;
以下 ( 4) 至 ( 9) 函数原型与 GetYear( ) 类似 。
( 4) GetMonth( ) 获取 CTime对象代表的月 。
( 5) GetDay( ) 获取 CTime对象代表的日期 。
( 6) GetHour( ) 获取 CTime对象代表的小时 。
( 7) GetMinute( ) 获取 CTime对象代表的分 。
( 8) GetSecond( ) 获取 CTime对象代表的秒 。
( 9) GetDayOfWeek( ) 获取 CTime对象代表的星期几,1代表周日,2代表周一,等等 。
7.4CTime类的常用成员函数
3,格式化时间成员函数 Format( ) 将 CTime对象中的时间信息转化为一个格式化的字符串 。
其函数原型为:
CString Format( LPCTSTR pFormat) const;
CString Format( UINT nFormatID) const;
参数 pFormat是格式字符串,类似于 printf中的格式字符串,格式字符如下:
%a:周的英文缩写形式;
%A:周的英文全名形式;
%b,月的英文缩写形式;
%B:月的英文全名形式;
%c,完整的日期和时间;
%d:十进制形式的日期 ( 01-31) ;
%H,24小时制的小时 ( 00-23) ;
%I,12小时制的小时 ( 00-11) ;
%j,十进制表示的一年中的第几天 ( 001-366) ;
%m,月的十进制表示 ( 01-12) ;
%M:十进制表示的分钟 ( 00-59) ;
%p,12小时制的上下午标示 ( AM/PM) ;
%S,十进制表示的秒 ( 00-59) ;
7.4CTime类的常用成员函数
4,重载运算符
operator =,赋予新的时间 。
operator +,增加 CTime和 CTimeSpan对象 。
operator –,减小 CTime和 CTimeSpan对象 。
operator +=,CTime对象加一个 CTimeSpan对象 。
operator -=,CTime对象减一个 CTimeSpan对象 。
operator ==,比较两个绝对时间是否相等 。
operator !=,比较两个绝对时间是否不相等 。
operator >,比较两个绝对时间,是否前一个大于后一个 。
operator <,比较两个绝对时间,是否前一个小于后一个 。
operator >=,比较两个绝对时间,是否前一个大于等于后一个 。
operator <=,比较两个绝对时间,是否前一个小于等于后一个 。
7.4CTime类的常用成员函数例 1:获取当前时间
CTime m_time=CTime::GetCurrentTime();
CString s=m_time.Format("%A,%B,%d,%Y");
CString m_strTime="当前时间是,"+s;
MessageBox(m_strTime);
运 行 结 果 在 信 息 框 中 显 示,当 前 时 间 是,
Sunday,February,4,2001”,程序第一行获取系统当前时间,
并赋给 m_time。 第二行从 m_time创建一个字符串对象,将该字符串赋给变量 s,格式 %A为周的英文全名形式,%B为月的英文全名形式,%d为十进制形式的日期 ( 01-31),
%Y为 十进制表示的年 。
7.4CTime类例题例 2:由年,月,日得到对应的周日 。
CTime m_time(2001,2,5,12,0,0);
int weekday=m_time.GetDayOfWeek();
switch(weekday)
{
case 1:
MessageBox("今天是周日 ");
break;
case 2:
MessageBox("今天是周一 ");
break;
case 3:
MessageBox("今天是周二 ");
break;
case 4:
MessageBox("今天是周三 ");
break;
case 5:
MessageBox("今天是周四 ");
7.4CTime类例题例 2:由年,月,日得到对应的周日 。
CTime m_time(2001,2,5,12,0,0);
int weekday=m_time.GetDayOfWeek();
switch(weekday)
{
case 1:
MessageBox("今天是周日 ");
break;
case 2:
MessageBox("今天是周一 ");
break;
case 3:
MessageBox("今天是周二 ");
break;
case 4:
MessageBox("今天是周三 ");
break;
case 5:
MessageBox("今天是周四 ");
7.4CTime类例题
1,构造函数 。
CTimeSpan类有下列构造函数:
( 1) CTimeSpan( ) ;
( 2) CTimeSpan( const CTimeSpan& timeSpanSrc ) ;
( 3) CTimeSpan( time_t time ) ;
( 4) CTimeSpan( LONG lDays,int nHours,int nMins,int
nSecs ) ;
参数 timeSpanSrc为一个已存在的 CTimeSpan 对象,time为一个
time_t 类型的时间值,lDays,nHours,nMins,nSecs分别为天数,小时数,分数和秒数 。
7.4CTimeSpan类的常用成员函数
2,时间值的提取函数
( 1) GetDays( ) 获得 CTimeSpan类对象中包含的完整的天数 。
( 2) GetHours( ) 获得当天的小时数,值在 -23到 23之间 。
( 3) GetTotalHours( ) 获得 CTimeSpan类对象中包含的完整的小时数 。
( 4) GetMinutes( ) 获得当前小时包含的分数,值在 -59到 59
之间 。
( 5) GetTotalMinutes( ) 获得 CTimeSpan类对象中包含的完整的分数 。
( 6) GetSeconds( ) 获得当前分钟包含的秒数,值在 -59到 59
之间 。
( 7) GetTotalSeconds( ) 获得 CTimeSpan类对象中包含的完整的秒数 。
7.4CTimeSpan类的常用成员函数格式化时间
Format( ) 将一个 CTimeSpan对象转换成格式字符串 。 使用方式与 CTime类似,格式化字符包括以下几个:
%D,CTimeSpan的总天数;
%H,不足整天的小时数;
%M,不足 1小时的分数;
%S,不足 1分钟的秒数;
%%,百分号 。
7.4CTimeSpan类的常用成员函数
4,重载运算符
CTimeSpan类也重载了运算符,=”,,+”,,-”,,+=”,,-
=”,,==”,,! =”,,<”,,>”,,<=”,,>=”,用于
CTimeSpan对象的赋值,加减运算及两个 CTimeSpan对象的比较 。
7.4CTimeSpan类的常用成员函数
CTimeSpan类例题例:构造一个 CTimeSpan对象,并获取其中的完整天数,小时数,分数和秒数,将获得的信息在信息框中显示 。
CTimeSpan m_timespan(3,4,5,6); // 3天,4小时,5分,6秒
LONG m_totalDays=m_timespan.GetDays(); //获得完整天数
LONG m_totalHours=m_timespan.GetTotalHours(); //获得完整小时数
LONG m_totalMinutes=m_timespan.GetTotalMinutes(); //获得完整分数
LONG m_totalSeconds=m_timespan.GetTotalSeconds(); //获得完整秒数
char s1[8],s2[8],s3[8],s4[8];
wsprintf(s1,"%ld",m_totalDays);
wsprintf(s2,"%ld",m_totalHours);
wsprintf(s3,"%ld",m_totalMinutes);
wsprintf(s4,"%ld",m_totalSeconds);
CString m_str = "此时间范围包含,\n完整天数,"+CString(s1)+"\n完整小时数,"+CString(s2)+"\n 完 整 分 数,"+CString(s3)+"\n 完整秒数,"+CString(s4);
MessageBox(m_str);
运行结果在信息框中显示 5行,其中 s1的内容为,3”,s2的内容为,76”
( 3*24+4),s3的内容为,4565”( 76*60+5),s4的内容为,273906”
( 4565*60+6) 。
7.4
7.5 CPoint,CRect和 CSize
学习目标利用 CPoint,CRect和 CSize分别处
Windows的点、矩形和大小 。
7.5
返回第 7章
CPoint
类 CPoint是对 Windows结构 POINT的封装,凡是能用
POINT结构的地方都可以用 CPoint代替 。
结构 POINT表示屏幕上的一个二维点,其定义为:
typedef struct tagPOINT{
LONG x;
LONG y;
} POINT;
其中 x,y分别是点的横坐标和纵坐标 。
由于 CPoint提供了一些重载运算符,使得 CPoint的操作更加方便。如运算符,+”,,-”,,+=”和,-=”用于两个
CPoint对象或一个 CPoint对象与一个 CSize对象的加减运算,
运算符,==”和“! =”用于比较两个 CPoint对象是否相等。
7.5
CSize
类 CSize是对 Windows结构 SIZE的封装,凡是能用 SIZE结构的地方都可以用 CSize代替 。
结构 SIZE表示一个矩形的长度和宽度,其定义为:
typedef struct tagSIZE{
LONG cx;
LONG cy;
} SIZE;
其中 cx,cy分别是长度和宽度 。
与 CPoint类似,CSize也提供了一些重载运算符 。 如运算符,+”,
,-”,,+=”和,-=”,用于两个 CSize对象或一个 CSize对象与一个 CPoint对象的加减运算,运算符,==”和,! =”用于比较两个 CSize对象是否相等 。
由于 CPoint和 CSize都包含两个整数类型的成员变量,他们可以进行相互操作 。 CPoint对象的操作可以以 CSize对象为参数 。
同样,CSize对象的操作也可以以 CPoint对象为参数 。 如可以用一个 CPoint对象构造一个 CSize对象,也可以用一个
CSize对象构造一个 CPoint对象,允许一个 CPoint对象和一个 CSize对象进行加减运算 。
7.5
CRect
类 CRect是对 Windows结构 RECT的封装,凡是能用
RECT结构的地方都可以用 CRect代替 。
结构 RECT表示一个矩形的位置和尺寸,其定义为:
typedef struct tagRECT{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT;
其中 left,top分别表示矩形左上角顶点的横坐标和纵坐标,right,bottom分别表示矩形右下角顶点的横坐标和纵坐标 。
由于 CRect提供了一些成员函数和重载运算符,使得
CRect的操作更加方便 。
7.5
1,CRect的构造函数
CRect有如下 6个构造函数:
CRect( ) ;
CRect( int l,int t,int r,int b ) ;
CRect( const RECT& srcRect ) ;
CRect( LPCRECT lpSrcRect ) ;
CRect( POINT point,SIZE size ) ;
CRect( POINT topLeft,POINT bottomRight ) ;
说明:分别以不同的方式构造 CRect对象,参数 l,t,r,b分别指定矩形的左边,上边,右边和底边 。 SrcRect是一个 RECT结构的引用 。 LpSrcRect是一个指向 RECT结构的指针 。 Point指定矩形的左上角顶点的坐标,size指定矩形的长度和宽度 。
topLeft指定矩形的左上角顶点的坐标,bottomRight指定矩形的右下角顶点的坐标 。
7.5CRect类的常用成员函数
2,CRect重载运算符
CRect重载的运算符包括:赋值运算符,比较运算符,算术运算符,交并运算符等 。
赋值运算符,=”实现 CRect对象间的拷贝 。
比较运算符,==”和,!=”比较两个 CRect对象是否相等 ( 四个成员都相等时,
两个对象才相等 ) 。
算术运算符包括,+=”,,-=”,,+”,,-”,他们的第一个操作数是 CRect对象,第二个操作数可以是 POINT,SIZE或 RECT。 当第二个操作数是
POINT或 SIZE时,,+”和,+=”的运算结果使 CRect矩形向 x轴和 y轴的正方向移动 POINT或 SIZE指定的大小 。,-”和,-=”的运算结果则使 CRect
矩形向 x轴和 y轴的负方向移动 POINT或 SIZE指定的大小 。 当第二个操作数是 RECT时,,+”和,+=”的运算结果使 CRect矩形的左上角顶点向左上方向移动 RECT前两个成员指定的大小,而 CRect矩形的右下角顶点向右下方向移动 RECT后两个成员指定的大小 。,-”和,-=”的运算结果则使 CRect矩形的左上角顶点向右下方向移动 RECT前两个成员指定的大小,
而 CRect矩形的右下角顶点向左上方向移动 RECT后两个成员指定的大小 。
运算符,&”和,&=”得到两个矩形的交集 ( 两个矩形的公共部分 ),运算符
,|”和,|=”得到两个矩形并集 ( 包含两个矩形的最小矩形 ) 。
7.5CRect类的常用成员函数
3,Crect其他常用成员函数
( 1) Width( ),得到矩形的宽度;
( 2) Height( ),得到矩形的高度;
( 3) Size( ),得到矩形的大小 ( 高度和宽度 ) ;
( 4) TopLeft( ),得到矩形左上角顶点坐标;
( 5) BottomRight( ),得到矩形右下角顶点坐标;
( 6) PtInRect( ),判断一个点是否在矩形内,如是返回真,
否则返回假 。 原形如下:
BOOL PtInRect( POINT point ) const;
( 7) IsRectEmpty( ),判断矩形是否为空 ( 高度和宽度都是
0) ;
( 8) IsRectNull( ),判断矩形是否为 0( 左上角和右下角坐标都是 0) ;
( 9) SetRect( ),设置矩形四个成员变量的值 。
7.5CRect类的常用成员函数
4,CRect的规格化一个规格化的矩形是指他的高度和宽度都是正值,即矩形的右边大于矩形的左边,矩形的底边大于矩形的上边 。 矩形的规格化函数是 NormalizeRect( ),该函数比较矩形的的 left和
right及 top和 bottom,如果不满足规格化要求,则对换两个值 。
上面介绍的大部分运算符和成员函数,只有规格化的矩形才能得到正确结果 。
7.5CRect类的常用成员函数
1,创建应用程序利用应用向导创建一个基于单文档的应用程序 ( RectTest) 。
2,编辑对话框资源
IDD_DIALOG_POINT
IDC_STATIC Group Box Caption:选择运算符
IDC_RADIO_ADD Radio Button Caption:加法,Group:选中
IDC_RADIO_SUB Radio Button Caption:减法
IDC_STATIC Group Box Caption:输入点的坐标
IDC_STATIC Static Text Caption,X:
IDC_STATIC Static Text Caption,Y:
IDC_EDIT_X Edit Box
IDC_EDIT_Y Edit Box
IDOK Button Caption,OK
IDCANCEL Button Caption,Cancel
7.5CRect类例题
IDD_DIALOG_RECT
IDC_STATIC Group Box Caption:选择运算符
IDC_RADIO_ADD Radio Button Caption:加法 ( +),Group:选中
IDC_RADIO_SUB Radio Button Caption:减法 ( -)
IDC_RADIO_INTERSEC Radio Button Caption:交集 ( &&)
IDC_RADIO_ UNION Radio Button Caption:并集 ( |)
IDC_STATIC Group Box Caption:输入矩形数据
IDC_STATIC Static Text Caption,Left:
IDC_STATIC Static Text Caption,Top:
IDC_STATIC Static Text Caption,Right:
IDC_STATIC Static Text Caption,Bottom:
IDC_EDIT_LEFT Edit Box
IDC_EDIT_TOP Edit Box
IDC_EDIT_RIGHT Edit Box
IDC_EDIT_BOTTOM Edit Box
IDOK Button Caption,OK
IDCANCEL Button Caption,Cancel
7.5CRect类例题添加控件关联变量
IDD_DIALOG_POINT
IDC_EDIT_X int m_nX
IDC_EDIT_Y int m_nY
IDC_RADIO_ADD int m_nRadio
IDD_DIALOG_RECT
IDC_EDIT_LEFT int m_nLeft
IDC_EDIT_TOP int m_nTop
IDC_EDIT_RIGHT int m_nRight
IDC_EDIT_BOTTOM int m_nBottom
IDC_RADIO_HESD int m_nRidio
IDOK Button Caption,OK
IDCANCEL Button Caption,Cancel
7.5CRect类例题
3,为对话框 IDD_DIALOG_POINT添加响应函数
7.5CRect类例题
BOOL CDlgPoint::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO,Add extra initialization here
m_nRadio = 0;
UpdateData(false);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION,OCX Property Pages should return FALSE
}
4,为对话框 IDD_DIALOG_RECT添加响应函数
7.5CRect类例题
BOOL CDlgRect::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO,Add extra initialization here
m_nRadio = 0;
UpdateData(false);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION,OCX Property Pages should return FALSE
}
5,调用对话框并处理数组
( 1) 在视类头文件中定义成员变量 。
public:
CRect m_OldRect;
CRect m_NewRect;
CRect m_AddRect;
CPoint m_Point;
并在构造函数中初始化
7.5CRect类例题
CRectTestView::CRectTestView()
{
m_OldRect.SetRect(100,100,300,200);
m_NewRect.SetRect(0,0,0,0);
m_AddRect.SetRect(0,0,0,0);
m_Point = CPoint(0,0);
}
( 2) 编辑菜单资源 。
在菜单最后添加一个菜单,矩形操作,,并加入两个菜单项如下:
ID号 Caption
ID_RECT_POINT 矩形与点
ID_RECT_RECT 矩形与矩形
( 3) 添加 ID_RECT_POINT菜单项的消息响应函数
7.5CRect类例题
void CRectTestView::OnRectPoint()
{
if( dlg.DoModal()==IDOK)
{
m_Point = CPoint(dlg.m_nX,dlg.m_nY);
if(dlg.m_nRadio == 0)
m_NewRect = m_OldRect + m_Point;
else
m_NewRect = m_OldRect - m_Point;
}
OnUpdate(NULL,0,NULL);
}
( 4) 添加 ID_RECT_RECT菜单项的消息响应函数 7.5
void CRectTestView::OnRectRect()
{
CDlgRect dlg;
if( dlg.DoModal()==IDOK)
{
m_AddRect= CRect(dlg.m_nLeft,dlg.m_nTop,dlg.m_nRight,dlg.m_nBottom);
if(dlg.m_nRadio == 0)
{
m_NewRect = m_OldRect + m_AddRect;
}
else if(dlg.m_nRadio == 1)
{
m_NewRect = m_OldRect;
m_NewRect -= m_AddRect;
}
else if(dlg.m_nRadio == 2)
{
m_NewRect = m_OldRect & m_AddRect;
( 5) 在视中显示运算结果,重载视类的 OnDraw( ) 函数 7.5
void CRectTestView::OnDraw(CDC* pDC)
{
CRectTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO,add draw code for native data here
pDC->Rectangle(m_OldRect);
pDC->Rectangle(m_AddRect);
pDC->Rectangle(m_NewRect);
char temp[10];
CString strOldRect = "Old rect is,";
itoa(m_OldRect.left,temp,10);
strOldRect += temp;
strOldRect += " ";
itoa(m_OldRect.top,temp,10);
strOldRect += temp;
strOldRect += " ";
返回第 7章