728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 폰트 대화상자(CFontDialog)

 

안녕하세요. 지난 시간에 파일 대화상자에 대해서 열심히 학습하시고 오셨을 거라고 믿어 의심치 않습니다. 

이번 시간에는 아래의 창과 같은 폰트 대화상자를 만드는 방법에 대해 소개하겠습니다.

 


1. 결과물

 

 


2. 실습

 

 

2-1. CFontDialog 생성자(Construtors)

 


 CFontDialog(LPLOGFONT lplfInitial = NULL,
  DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,
  CDC* pdcPrinter = NULL,
  CWnd* pParentWnd = NULL);
 (Overloading)

 

  CFontDialog(const CHARFORMAT& charformat,
  DWORD dwFlags = CF_SCREENFONTS,
  CDC* pdcPrinter = NULL,
  CWnd* pParentWnd = NULL); 

 (Overloading)

 

a. lplfnitial
LOGFONT는 폰트 정보를 담기 위한 구조체로 WinGDI.h 파일에 정의되어 있습니다.

 

typedef struct tagLOGFONTA
{
    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;                           // 문자간격
    CHAR      lfFaceName[LF_FACESIZE];          // 폰트 이름

 

b. dwFlags

 

 플래그 값

 설명

 CF_EFFECTS

 폰트 대화상자에 효과들을 표시

 CF_SCREENFONTS

 시스템에 설치되어 있는 폰트들의 리스트를 출력

 

c. pdcPrinter

  -> CDC*

d. pParentWnd

  -> 폰트 대화상자의 부모 윈도우로 지정할 윈도우의 포인터

 


2-2. CFontDialog 멤버 함수

폰트 대화상자 클래스인 CFontDialog 클래스는 폰트와 관련한 멤버 함수

 

 

 void GetCharFormat(CHARFORMAT& cf) const;

 // Helpers for parsing information after successful return

 // 현재 설정되어 있는 폰트의 정보를 획득하여 LOGFONT 구조체의 포인터를 Parameter로 전달?

 CString GetFaceName() const;  // return the face name of the font


 CString GetStyleName() const; // return the style name of the font


 int GetSize() const;          // return the pt size of the font


 COLORREF GetColor() const;    // return the color of the font


 int GetWeight() const;        // return the chosen font weight


 BOOL IsStrikeOut() const;     // return TRUE if strikeout


 BOOL IsUnderline() const;     // return TRUE if underline


 BOOL IsBold() const;          // return TRUE if bold font


 BOOL IsItalic() const;        // return TRUE if italic font


 void GetCharFormat(CHARFORMAT& cf) const; 

 

 


2-3. CFontDialog 완성물

여러분이 완성해야할 결과물입니다.

 

 

 

 완성 결과물

 

 

 

 

 

 

 버튼 1번 - 문자열 출력 클릭시

  버튼 2번 - 문자열 정보 클릭시

 

 

 

 

 출력 결과 - 문자열 출력에 대한 결과

 출력 결과 - 문자열 정보에 대한 결과

 


2-4. 레이아웃 디자인

 

최종 결과물하고 동일하게 해오시면 되겠습니다.

 


2-5. 코드

 

 
void CTestDlg::OnBnClickedButton1()
{
       HFONT hFont, OldFont;

      

       CFontDialog dlg;

     

       CString strText = _T("한글 english 11222334324");

 

 if (dlg.DoModal() == IDOK)
 {

         HDC hdc;
         hdc = ::GetDC(this->m_hWnd);
         LOGFONT lf;

 

         dlg.GetCurrentFont(&lf);       // LOGFONT 획득

         hFont = CreateFontIndirect(&lf);     // 폰트 생성
         OldFont = (HFONT)SelectObject(hdc, hFont);   // 폰트 선택
         SetTextColor(hdc, dlg.GetColor() );    // 폰트 색상 적용

    TextOut(hdc, 0, 0, strText, strText.GetLength()); // 문자열 그리기

 

         SelectObject(hdc, OldFont);       // 기존 폰트 선택
         DeleteObject(hFont);        // 폰트 삭제

 }


}

 
void CTestDlg::OnBnClickedButton2()
{
          CFontDialog dlg;

          if (dlg.DoModal() == IDOK)
         {
               CString strMsg;

               strMsg.Format(

        _T( "폰트명:%s, 크기:%d \n 색상RGB(%d, %d, %d)" ) ,
        dlg.GetFaceName(), dlg.GetSize() / 10, 
        GetRValue(dlg.GetColor()),
        GetGValue(dlg.GetColor()),
        GetBValue(dlg.GetColor()) );

 

       AfxMessageBox(strMsg);

     

        }

}

 버튼 1 - 문자열 출력

 버튼 2 - 문자열 정보

 

직접 돌려봐야 뭔 느낌인지 알 수 있습니다.

반응형

+ Recent posts