MFC常用類及其成員函數

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)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章