VS2010-MFC(對話方塊:字型對話方塊)

來源:互聯網
上載者:User

標籤: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(對話方塊:字型對話方塊)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.