CRuntimeClass結構
在CRuntimeClass結構中定義了類名、對象所佔存儲空間的大小、類的版本號等成員變量及動態創建對象、派生關係判斷等成員函數。每一個從CObject類派生的類都有一個CRuntimeClass結構同它關聯,以便完成在運行時得到對象的信息或基類的信息。
要使用CRuntimeClass結構,必須結合使用RUNTIME_CLASS()宏和其他有關運行時類型識別的MFC宏。
CCmdTarget類
(1)消息發送
MFC應用程序爲每個CCmdTarget派生類創建一個稱爲消息映射表的靜態數據結構,可將消息映射到對象所對應的消息處理函數上。
(2)設置光標
BeginWaitCursor() 將光標改爲沙漏形狀;
EndWaitCursor() 將光標改回到之前的形狀;
RestoreWaitCursor()用於將光標還原爲等待狀態。
(3)支持自動化
CCmdTarget類支持程序通過COM接口進行交互操作,自動翻譯COM接口的方法。
CWinThread類
由CCmdTarget派生,主要工作是創建和處理消息循環。
CWinApp類
從CWinThread類派生,成員函數InitApplication()、InitInstance()、Run()。
在InitInstance()函數中,創建了一個單文檔模板類或多文檔模板類(CDocTemplate)的對象,並且在文檔模板的構造函數中,系統定義的宏RUNTIME_CLASS創建了文檔類對象,框架窗口類對象和視圖類對象.
在MFC應用程序中有且僅有一個CWinApp派生類的對象,代表程序運行的主線程,代表應用程序本身。
CWnd類
由CCmdTarget類直接派生,是MFC中最基本的GUI對象。公共變量m_hWnd用於存放供API函數調用的窗口句柄。
CframeWnd類
從CWnd類派生而來,主要用來掌管一個窗口。其對象是一個框架窗口,包括邊界、標題欄、菜單、最大化按鈕、最小化按鈕和一個激活的視圖。常用成員函數:
GetActiveDocument():得到當前文檔的指針。
GetActiveView(): 得到當前視圖的指針。
SetActiveView(): 激活一個視圖。
GetTitle(): 得到框架窗口的標題。
SetTitle(): 設置框架窗口的標題。
SetMessageText(): 設置狀態欄文本。
CDocument類
從CCmdTarget派生,作爲用戶文檔的基類,代表了用戶存儲或打開一個文件。主要功能是把對數據的處理從對用戶的界面處理中分離出來,同時提供一個與視圖類交互的接口。常用的成員函數有:
OnNewDocument(): 建立新文檔。
OnOpenDocument(): 打開一個文檔。
OnCloseDocument(): 關閉文檔。
OnSaveDocument(): 保存文檔。
UpdateAllView(): 通知所有視圖文檔被修改。
SaveModified(): 設置文檔修改標誌。
CView類
從CWnd類派生而來,是MFC視圖類和用戶視圖類的基類。CWnd::Invalidate()或CWnd::InvalidateRect()可以刷新視圖。常用函數有:
GetDocument(): 視圖類對象訪問文檔類對象中的數據的.
OnDraw(): 這個函數有一個指向CDC類的指針參數,
通過它可能直接調用CDC類上顯示數據和圖形.
在應用程序窗口出現在及大小發生變化時,
系統將自動調用OnDraw函數
OnInitialUpdate(): 作一些初始化工作.
程序員的主要工作
(1) 重寫WinApp派生類的虛函數InitInstance.在這個函數中,按自己的需要創建和顯示窗口.
(2) 在CDocument的派生類中,聲明程序所需的數據和對這些數據進行必要操作的接口函數.
(3) 在CViwe類的派生類中編寫處理消息的代碼.如果在消息處理中需要文檔的數據,應該調用該類的成員函數GetDocument來獲取文檔對象,然後通過文檔對象的接口函數對文檔中的數據進行操作.
(4) 在CViwe類的派生類中的OnDraw函數中編寫窗口重繪時的代碼.
Gilbert覺得以上是很大的類, 下面介紹一些小類:
CRect類
矩形類,擁有四個成員變量:top, left, bottom, right。分別表是左上角和右下角的座標。可以通過以下的方法構造:
CRect( int l, int t, int r, int b ); 指明四個座標
CRect( const RECT& srcRect ); 由RECT結構構造
CRect( LPCRECT lpSrcRect ); 由RECT結構構造
CRect( POINT point, SIZE size ); 有左上角座標和尺寸構造
CRect( POINT topLeft, POINT bottomRight ); 有兩點座標構造
它的幾個成員函數:
int Width( ) const; 得到寬度
int Height( ) const; 得到高度
CSize Size( ) const; 得到尺寸
CPoint& TopLeft( ); 得到左上角座標
CPoint& BottomRight( ); 得到右下角座標
CPoint CenterPoint( ) const; 得當中心座標
此外矩形可以和點(CPoint)相加進行位移,和另一個矩形相加得到“並”操作後的矩形。
CPoint類
點的座標,有兩個成員變量:x, y。可以和另一個點相加。
CString類
表示可變長度的字符串。使用CString可不指明內存大小,CString會根據需要自行分配。幾個成員函數:
GetLength 得到字符串長度
operator + 相當於strcat
Compare 比較
CompareNoCase 不區分大小寫比較
MakeUpper 改爲小寫
MakeLower 改爲大寫
CTime類
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結構定義如下:
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME;
typedef struct _FILETIME {
DWORD dwLowDateTime; /* low 32 bits */
DWORD dwHighDateTime; /* high 32 bits */
} FILETIME, *PFILETIME, *LPFILETIME;
2.時間值的提取函數
(1)GetCurrentTime() 獲取系統當前時間。
原型:static CTime PASCAL GetCurrentTime( );
(2)GetTime() 由CTime對象返回一個time_t變量。
原型:time_t GetTime( ) const;
(3)GetYear() 獲取CTime對象代表的年。
原型:int GetYear( ) const;
以下(4)至(9)函數原型與GetYear()類似。
(4)GetMonth()獲取CTime對象代表的月。
(5)GetDay() 獲取CTime對象代表的日期。
(6)GetHour() 獲取CTime對象代表的小時。
(7)GetMinute()獲取CTime對象代表的分。
(8)GetSecond() 獲取CTime對象代表的秒。
(9)GetDayOfWeek() 獲取CTime對象代表的星期幾,1代表週日、2代表週一、等等。
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);
%U: 一年中的第幾個星期(00-51),星期日是一週的第一天;
%W: 一年中的第幾個星期(00-51),星期一是一週的第一天;
%w: 十進制表示的星期幾(0-6);
%Y: 十進制表示的年;
參數nFormatID 是格式字符串資源的ID號。
4
.重載運算符
operator = : 賦予新的時間。
operator + : 增加CTime和CTimeSpan對象。
operator – : 減小CTime和CTimeSpan對象。
operator += : CTime對象加一個CTimeSpan對象。
operator -= : CTime對象減一個CTimeSpan對象。
operator == : 比較兩個絕對時間是否相等。
operator != : 比較兩個絕對時間是否不相等。
operator > : 比較兩個絕對時間,是否前一個大於後一個。
operator < : 比較兩個絕對時間,是否前一個小於後一個。
operator >= : 比較兩個絕對時間,是否前一個大於等於後一個。
operator <= : 比較兩個絕對時間,是否前一個小於等於後一個。
例子代碼
例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爲 十進制表示的年。
例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("今天是週四";
break;
case 6:
MessageBox("今天是週五";
break;
case 7:
MessageBox("今天是週六";
break;
default:
break;
}
運行結果在信息框中顯示“今天是週一”,m_time.GetDayOfWeek()獲取m_time代表的周幾(1代表週日,2代表週一等等)。
CTimeSpan
類
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分別爲天數、小時數、分數和秒數。
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類對象中包含的完整的秒數。
格式化時間
Format() 將一個CTimeSpan對象轉換成格式字符串。使用方式與CTime類似,格式化字符包括以下幾個:
%D: CTimeSpan的總天數;
%H: 不足整天的小時數;
%M: 不足1小時的分數;
%S: 不足1分鐘的秒數;
%%: 百分號。
4.重載運算符
CTimeSpan類也重載了運算符“=”,“+”,“-”,“+=”,“-=”,“==”,“!=”,“<”,“>”,“<=”,“>=”,用於CTimeSpan對象的賦值、加減運算及兩個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)。