標籤:back 擷取 c++ bubuko plog 編輯框 string ima 類型
轉自:http://www.jizhuomi.com/software/175.html
字型對話方塊的作用是用來選擇字型。我們也經常能夠見到。MFC使用CFontDialog類封裝了字型對話方塊的所有操作。字型對話方塊也是一種模態對話方塊。
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對象了。
字型對話方塊應用執行個體
雞啄米給大家做一個字型對話方塊的執行個體。先介紹此執行個體要實現的功能,產生一個對話方塊,對話方塊中放置一個“字型選擇”按鈕和一個編輯框。點擊“字型選擇”按鈕將彈出字型對話方塊。編輯框用於顯示所選字型名,並以選定的字型來顯示字型名字串,例如,如果選擇了宋體,則在編輯框中以宋體顯示字串“宋體”。
以下是建立此執行個體的步驟:
1.建立一個基於對話方塊的MFC工程,名字為“Example18”。
2.在自動產生的主對話方塊IDD_EXAMPLE18_DIALOG的模板中,刪除“TODO: Place dialog controls here.”靜態文字框,添加一個按鈕,ID設為IDC_FONT_BUTTON,Caption設為“字型選擇”,用於顯示字型對話方塊來選擇字型,再添加一個編輯框,ID設為IDC_FONT_EDIT,用來以所選字型顯示字型名字串。
3.在Example18Dlg.h中為CExample18Dlg類添加private成員變數:CFont m_font;,用來儲存編輯框中選擇的字型。
4.為按鈕IDC_FONT_BUTTON添加點擊訊息的訊息處理函數CExample18Dlg::OnBnClickedFontButton()。
5.修改訊息處理函數CExample18Dlg::OnBnClickedFontButton()如下:
C++代碼
void CExample18Dlg::OnBnClickedFontButton() { // TODO: Add your control notification handler code here CString strFontName; // 字型名稱 LOGFONT lf; // LOGFONT變數 // 將lf所有位元組清零 memset(&lf, 0, sizeof(LOGFONT)); // 將lf中的元素字型名設為“宋體” _tcscpy_s(lf.lfFaceName, LF_FACESIZE, _T("宋體")); // 構造字型對話方塊,初始選擇字型名為“宋體” CFontDialog fontDlg(&lf); if (IDOK == fontDlg.DoModal()) // 顯示字型對話方塊 { // 如果m_font已經關聯了一個字型資源對象,則釋放它 if (m_font.m_hObject) { m_font.DeleteObject(); } // 使用選定字型的LOGFONT建立新的字型 m_font.CreateFontIndirect(fontDlg.m_cf.lpLogFont); // 擷取編輯框IDC_FONT_EDIT的CWnd指標,並設定其字型 GetDlgItem(IDC_FONT_EDIT)->SetFont(&m_font); // 如果使用者選擇了字型對話方塊的OK按鈕,則擷取被選擇字型的名稱並顯示到編輯框裡 strFontName = fontDlg.m_cf.lpLogFont->lfFaceName; SetDlgItemText(IDC_FONT_EDIT, strFontName); } }
6.最後,編譯運行程式。顯示結果對話方塊,點擊“字型選擇”按鈕,將彈出字型對話方塊,預設選擇為“宋體”,我們改而選擇“華文彩雲”字型點“確定”,編輯框中會像如下顯示:
到此,我們又學會了字型對話方塊的使用,對於以後在介面開發中控制顯示的字型很有協助。
VS2010-MFC(對話方塊:字型對話方塊)