MFC框架快速入門(二)
訊息對話方塊CWnd::MessageBox()函式和AfxMessageBox()函式的用法
1.CWnd::MessageBox()函式
CWnd::MessageBox()的函式原型如下:
int MessageBox(
LPCTSTR lpszText,
LPCTSTR lpszCaption = NULL,
UINT nType = MB_OK
);
引數說明:
lpszText:需要顯示的訊息字串。
lpszCaption:訊息對話方塊的標題字串。預設值為NULL。取值為NULL時使用預設標題。
nType:訊息對話方塊的風格和屬性。預設為MB_OK風格,即只有“確定”按鈕。
nType的取值可以是下面兩個表中任取一個值,也可以是各取一個值的任意組合。即可以指定一個對話方塊型別,也可以指定一個對話方塊圖示,還可以兩者都設定。
nType 取值 | 引數說明 |
MB_ABORTRETRY | 有“終止”、“重試”和“忽略”按鈕 |
MB_OK | 有“確定”按鈕 |
MB_OKCANCEL | 有“確定”和“取消”按鈕 |
MB_RETRYCANCEL | 有“重試”和“取消”按鈕 |
MB_YESNO | 有“是”和“否”按鈕 |
MB_YESNOCANCEL | 有“是”、“否”和“取消”按鈕 |
對話方塊型別表
nType 取值 | 顯示圖示 |
MB_ICONEXCLAMTION MB_ICONWARNING | |
MB_ICONASTERISK MB_ICONINFORMATION |
|
MB_ICONQUESTION | |
MB_ICONHAND MB_ICONSTOP MB_ICONERROR |
對話方塊圖標表
如果想要設定nType的值為型別和圖示的組合,可以像這樣取值:MB_OKCANCEL | MB_ICONQUESTION。按位取或就可以了。
2.AfxMessageBox()函式
AfxMessageBox()的函式原型為:
int AfxMessageBox(
LPCTSTR lpszText,
UINT nType = MB_OK,
UINT nIDHelp = 0
);
引數說明:
lpszText:同CWnd::MessageBox()函式
nType:CWnd::MessageBox()函式
nIDHelp:此訊息的幫助的上下文ID。預設值為0,取0時表示要使用應用程式的預設幫助上下文。
3.CWnd::MessageBox()和AfxMessageBox()的返回值
我們在呼叫了上面兩個函式後,都可以彈出模態訊息對話方塊。訊息對話方塊關閉後,我們也都可以得到它們的返回值。兩者的返回值就是使用者在訊息對話方塊上單擊的按鈕的ID,可以是以下值:
IDABORT:單擊“終止”按鈕。
IDCANCEL:單擊“取消”按鈕。
IDIGNORE:單擊“忽略”按鈕。
IDNO:單擊“否”按鈕。
IDOK:單擊“確定”按鈕。
IDRETRY:單擊“重試”按鈕。
IDYES:單擊“是”按鈕。
檔案對話方塊類CFileDialog
MFC使用檔案對話方塊類CFileDialog封裝了對檔案對話方塊的操作。CFileDialog類的建構函式原型如下:
explicit CFileDialog(
BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL,
DWORD dwSize = 0,
BOOL bVistaStyle = TRUE
);
引數說明:
bOpenFileDialog:指定要建立的檔案對話方塊的型別。設為TRUE將建立開啟檔案對話方塊,否則將建立儲存檔案對話方塊。
lpszDefExt:預設的副檔名。如果使用者在檔名編輯框中沒有輸入副檔名,則由lpszDefExt指定的副檔名將被自動新增到檔名後。預設為NULL。
lpszFileName:檔名編輯框中顯示的初始檔名。如果為NULL,則不顯示初始檔名。
dwFlags:檔案對話方塊的屬性,可以是一個值也可以是多個值的組合。關於屬性值的定義,可以在MSDN中查詢結構體OPENFILENAME,元素Flags的說明中包含了所有屬性值。預設為OFN_HIDEREADONLY和OFN_OVERWRITEPROMPT的組合,OFN_HIDEREADONLY表示隱藏檔案對話方塊上的“Read Only”複選框,OFN_OVERWRITEPROMPT表示在儲存檔案對話方塊中如果你選擇的檔案存在了,就彈出一個訊息對話方塊,要求確定是否要覆蓋此檔案。
lpszFilter:檔案過濾器,它是由若干字串對組成的一個字串序列。如果指定了檔案過濾器,則檔案對話方塊中只有符合過濾條件的檔案顯示在檔案列表中待選擇。給大家看看VS2010 MSDN中給出的一個例子:
static TCHAR BASED_CODE szFilter[] = _T("Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||");
這樣設定過濾器以後,檔案對話方塊的副檔名組合框中將有四個選項:Chart Files (*.xlc)、Worksheet Files (*.xls)、Data Files(*.xlc;*.xls)和All Files (*.*),大家可以看到每種檔案的副檔名規定都是一個字串對,例如Chart Files的過濾字串是Chart Files(*.xlc)和*.xlc成對出現的。
pParentWnd:檔案對話方塊的父視窗的指標。
dwSize:OPENFILENAME結構體的大小。不同的作業系統對應不同的dwSize值。MFC通過此引數決定檔案對話方塊的適當型別(例如,建立Windows 2000檔案對話方塊還是XP檔案對話方塊)。預設為0,表示MFC將根據程式執行的作業系統版本來決定使用哪種檔案對話方塊。
bVistaStyle:指定檔案對話方塊的風格,設為TRUE則使用Vista風格的檔案對話方塊,否則使用舊版本的檔案對話方塊。此引數僅在Windows Vista中編譯時適用。
檔案對話方塊也是模態對話方塊,所以在開啟時也需要呼叫CFileDialog類的DoModal()成員函式。在開啟檔案對話方塊中點了“開啟”或者在儲存檔案對話方塊中點了“儲存”以後,我們可以使用CFileDialog類的成員函式GetPathName()獲取選擇的檔案路徑。
下面列出幾個CFileDialog類的成員函式,我們可以使用它們獲得檔案對話方塊中的各種選擇。
GetFileExt():獲得選定檔案的字尾名。
GetFileName():獲得選定檔案的名稱,包括字尾名。
GetFileTitle():獲得選定檔案的標題,即不包括字尾名。
GetFolderPath():獲得選定檔案的目錄。
GetNextPathName():獲得下一個選定的檔案的路徑全名。
GetPathName():獲得選定檔案的路徑全名。
GetReadOnlyPref():獲得是否“以只讀方式開啟”。
GetStartPosition():獲得檔名列表中的第一個元素的位置。
構造一個開啟對話方塊例項 CFileDialogfileDlg(TRUE,_T("txt"),NULL,0,szFilter,this);
構造一個儲存對話方塊例項CFileDialogfileDlg(FALSE,_T("doc"),_T("my"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter,this);
字型對話方塊CFontDialog類
字型對話方塊的作用是用來選擇字型。我們也經常能夠見到。MFC使用CFontDialog類封裝了字型對話方塊的所有操作。
我們先來了解CFontDialog類。它的常用建構函式原型如下:
CFontDialog(
LPLOGFONT lplfInitial = NULL,
DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,
CDC* pdcPrinter = NULL,
CWnd* pParentWnd = NULL
);
引數說明:
lplfInitial:指向LOGFONT結構體資料的指標,可以通過它設定字型的一些特徵。
dwFlags:指定選擇字型的一個或多個屬性,詳情可在MSDN中查閱。
pdcPrinter:指向一個列印裝置上下文的指標。
pParentWnd:指向字型對話方塊父視窗的指標。
上面的建構函式中第一個引數為LOGFONT指標,LOGFONT結構體中包含了字型的大部分特徵,包括字型高度、寬度、方向、名稱等等。下面是此結構體的定義:
typedef struct tagLOGFONT {
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;
獲取字型對話方塊中所選字型
我們在字型對話方塊中選擇了字型後,如何獲取選定的字型呢?我們可以通過CFontDialog類的成員變數m_cf間接獲得選定字型的CFont物件。m_cf是CHOOSEFONT型別的變數,CHOOSEFONT結構體定義如下:
typedef struct {
DWORD lStructSize;
HWND hwndOwner;
HDC hDC;
LPLOGFONT lpLogFont;
INT iPointSize;
DWORD Flags;
COLORREF rgbColors;
LPARAM lCustData;
LPCFHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
HINSTANCE hInstance;
LPTSTR lpszStyle;
WORD nFontType;
INT nSizeMin;
INT nSizeMax;
} CHOOSEFONT, *LPCHOOSEFONT;
CHOOSEFON結構體中有個成員lpLogFont,它是指向LOGFONT結構體變數的指標,就像上面所說,LOGFONT中包含了字型特徵,例如,我們可以通過LOGFONT的lfFaceName得知字型名。
我們最終要獲得的是所選擇字型的CFont物件,有了字型的LOGFONT怎樣獲得對應的CFont物件呢?使用CFont類的成員函式CreateFontIndirect可以達到此目的。函式原型如下:
BOOL CreateFontIndirect(const LOGFONT* lpLogFont );
引數是LOGFONT指標型別,我們可以傳入CFontDialog類成員變數m_cf的lpLogFont成員,就可以得到所選字型的CFont物件了。
顏色對話方塊CColorDialog類
MFC中提供了CColorDialog類封裝了顏色對話方塊的所有操作,我們可以通過它顯示顏色對話方塊,並獲取顏色對話方塊中選擇的顏色。
CColorDialog(
COLORREF clrInit = 0,
DWORD dwFlags = 0,
CWnd* pParentWnd = NULL
);
引數說明:
clrInit:預設選擇顏色的顏色值,型別為COLORREF,實際上就是unsigned long型別。如果沒有設定它的值,則預設為RGB(0,0,0),即黑色。
注:RGB(r,g,b)是巨集,可以計算顏色值。括號中的三個值分別為紅、綠、藍分量的值。
dwFlags:自定義顏色對話方塊功能和外觀的屬性值。詳情可在MSDN中查閱。
pParentWnd:顏色對話方塊的父視窗的指標。
獲取顏色對話方塊中所選顏色值
我們使用顏色對話方塊的最終目的還是要獲得在顏色對話方塊中選擇的顏色值。為此CColorDialog類的成員函式GetColor()能夠很好的實現我們的要求。GetColor()函式的原型為:
COLORREF GetColor( ) const;
它返回所選顏色的COLORREF值。
如果我們想獲得R、G、B各分量的值呢?可以根據GetColor得到的COLORREF顏色值,通過使用GetRValue、GetGValue和GetBValue三個巨集獲得。GetRValue的語法形式為:
BYTE GetRValue(DWORD rgb);
引數rgb就是COLORREF顏色值,返回值即是R分量值。其他兩個巨集的形式與之類似。例如,GetColor()函式返回的COLORREF為10000,則R分量值就是GetRValue(10000)。