학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

중요함수    1

다이어로그박스에 글씨 쓰기

학습목표

다이어로그 박스에 글씨와 움직이는 글씨를 쓰는 방법을 공부한다.

학습주제

1.     다이어로그 박스를 만들고 폰트를 지저한다.

2.     OnPaint 함수를 수정한다.

3.     타이머 함수에 따라 글씨가 움직이고 글짜가 바뀌게 프로그램 한다.

4.     색상을 선택하여 글자의 색을 바꾼다.

예습내용

 

실습방법

   

프로젝트르 이름을 “DlgText” 하고서 시작하였다.

모두 기본 값으로 선택하고 진행한다. 여기서 “Finish” 버튼을 누른다.

폰트의 설정을 위하여 아래 빨간 글씨 부분을 추가 합니다.

 

예제1

 

 

// DlgTextDlg.h : 헤더파일

//

 

#pragma once

 

 

// CDlgTextDlg 대화상자

class CDlgTextDlg : public CDialog

{

// 생성입니다.

public:

        CDlgTextDlg(CWnd* pParent = NULL);       // 표준생성자입니다.

        // 다이어로그박스에글씨를쓰기위한정의

        BOOL m_bTransparent;

        COLORREF m_colorText;

        COLORREF m_colorBk;

        LOGFONT m_logFont;

 

// 대화상자데이터입니다.

        enum { IDD = IDD_DLGTEXT_DIALOG };

 

        protected:

        virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.

 

 

// 구현입니다.

protected:

        HICON m_hIcon;

 

        // 생성된메시지맵함수

        virtual BOOL OnInitDialog();

        afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

        afx_msg void OnPaint();

        afx_msg HCURSOR OnQueryDragIcon();

        DECLARE_MESSAGE_MAP()

};

 

 

OnInitDialog 함수에 폰트를 아래와 같이 설정하고 여기서 글씨의 형태 크기 색상등을 지정 할 수 있습니다.

 

예제2

 

 

BOOL CDlgTextDlg::OnInitDialog()

{

        CDialog::OnInitDialog();

 

        // 시스템메뉴에"정보..." 메뉴항목을추가합니다.

 

        // IDM_ABOUTBOX는시스템명령범위에있어야합니다.

        ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

        ASSERT(IDM_ABOUTBOX < 0xF000);

 

        CMenu* pSysMenu = GetSystemMenu(FALSE);

        if (pSysMenu != NULL)

        {

                CString strAboutMenu;

                strAboutMenu.LoadString(IDS_ABOUTBOX);

                if (!strAboutMenu.IsEmpty())

                {

                        pSysMenu->AppendMenu(MF_SEPARATOR);

                        pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

                }

        }

 

        // 이대화상자의아이콘을설정합니다. 응용프로그램의주창이대화상자가아닐경우에는

        //  프레임워크가이작업을자동으로수행합니다.

        SetIcon(m_hIcon, TRUE);                  // 큰아이콘을설정합니다.

        SetIcon(m_hIcon, FALSE);         // 작은아이콘을설정합니다.

 

        // TODO: 여기에추가초기화작업을추가합니다.

        //========== 폰트설정===========================

        m_bTransparent = FALSE;

        m_colorText = RGB(0, 0, 0);                  // 폰트색상

        m_colorBk = RGB(230,230,230);                // 폰트배겅색상

 

        m_logFont.lfHeight                    = -40;  //폰트크기

        m_logFont.lfWidth                        = 0;

        m_logFont.lfEscapement           = 0;

        m_logFont.lfOrientation          = 0;

        //m_logFont.lfWeight                     = FW_NORMAL;

        m_logFont.lfWeight                  = 900; // 굵은글씨

        m_logFont.lfItalic                       = FALSE;

        m_logFont.lfUnderline            = FALSE;

        m_logFont.lfStrikeOut            = FALSE;

        m_logFont.lfCharSet                      = DEFAULT_CHARSET;

        m_logFont.lfOutPrecision = OUT_CHARACTER_PRECIS;

        m_logFont.lfClipPrecision        = CLIP_CHARACTER_PRECIS;

        m_logFont.lfQuality                      = DEFAULT_QUALITY;

        m_logFont.lfPitchAndFamily       = DEFAULT_PITCH|FF_DONTCARE;

        strcpy(m_logFont.lfFaceName, "Arial");

        //========== 폰트설정===========================

 

        return TRUE;  // 포커스를컨트롤에설정하지않으면TRUE를반환합니다.

}

 

OnPaint 함수의 원래 부분을 지우고 사용자 dc를 사용하여 글씨를 쓴다. 빨간새의 고딕 글씨 부부을 수정하면 글씨의 위치와 글씨를 쓰는 박스의 크기를 변경할 수 있다. 그리고 파란색 글씨 부분에 윈하는 글씨를 넣고 다른 글씨를 더 쓰고자 할 때는 위치와 박스를 추가하여 작성하면 된다.

 

예제3

 

 

void CDlgTextDlg::OnPaint()

{

        /*

        if (IsIconic())

        {

                CPaintDC dc(this); // 그리기를위한디바이스컨텍스트

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

                // 클라이언트사각형에서아이콘을가운데에맞춥니다.

                int cxIcon = GetSystemMetrics(SM_CXICON);

                int cyIcon = GetSystemMetrics(SM_CYICON);

                CRect rect;

                GetClientRect(&rect);

                int x = (rect.Width() - cxIcon + 1) / 2;

                int y = (rect.Height() - cyIcon + 1) / 2;

 

                // 아이콘을그립니다.

                dc.DrawIcon(x, y, m_hIcon);

        }

        else

        {

                CDialog::OnPaint();

        }

        */

 

        //글씨를쓰기위해사용자dc로바꾼다.

        CPaintDC dc(this); // device context for painting

       

        // TODO: Add your message handler code here

        CRect rect;

        CString s;

        int x,y;

        GetClientRect(&rect);

 

        // LOGFONT로부터폰트를생성

        CFont newFont, *pOldFont;

        newFont.CreateFontIndirect(&m_logFont);

 

        // 생성된폰트를DC에선택

        pOldFont = (CFont *)dc.SelectObject(&newFont);

 

        // 텍스트의전경색과배경색설정

        dc.SetTextColor(m_colorText);

        dc.SetBkColor(m_colorBk);

       

        // 배경모드를설정

        if(m_bTransparent) dc.SetBkMode(TRANSPARENT);

        else dc.SetBkMode(OPAQUE);

 

        // 텍스트를그림

        x=20; y=0;     // 글씨의위치

        rect=CRect(x,y,x+500,y+50);  // 글씨를쓰는박스의크기

        dc.DrawText("다어로그박스에글씨쓰기", &rect,        DT_SINGLELINE|DT_CENTER|DT_VCENTER);

        // Do not call CDialog::OnPaint() for painting messages

}

 

아래는 위를 실행한 글씨체이다.

 

 

타이머를 설정하여 움직이는 글씨와 시간에 따라 달라지는 글씨를 만든다.

 

다이어로그박스를 선택하고 속성의 메시지 창에서 “OnTimer” 함수를 만든다.

 

DlgTextDlg.h 글씨의 위치를 표시하는 변수 x,y 선언하고 On Paint 함수에는 선언을 지웁니다.

 

예제4

 

 

class CDlgTextDlg : public CDialog

{

// 생성입니다.

public:

        int x,y;

        CDlgTextDlg(CWnd* pParent = NULL);       // 표준생성자입니다.

        // 다이어로그박스에글씨를쓰기위한정의

        BOOL m_bTransparent;

        COLORREF m_colorText;

        COLORREF m_colorBk;

        LOGFONT m_logFont;

 

OnPaint 함수를 아래와 같이 수정한다.

 

예제5

 

 

void CDlgTextDlg::OnPaint()

{

        CPaintDC dc(this); // device context for painting

}

 

초기함수에 타이머 시간을 설정하고 텍스트의 초기 좌표값을 입력한다.

 

예제6

 

 

BOOL CDlgTextDlg::OnInitDialog()

{

        CDialog::OnInitDialog();

        // ========= 생략 ==================

        m_logFont.lfClipPrecision        = CLIP_CHARACTER_PRECIS;

        m_logFont.lfQuality                      = DEFAULT_QUALITY;

        m_logFont.lfPitchAndFamily       = DEFAULT_PITCH|FF_DONTCARE;

        strcpy(m_logFont.lfFaceName, "Arial");

        //========== 폰트설정===========================

        SetTimer(1,500,NULL);

        x=150; y=0;     // 글씨의위치

        return TRUE;  // 포커스를컨트롤에설정하지않으면TRUE를반환합니다.

}

 

“DlgText” 클래스에 “Draw” 함수를 만든다.

함수의 프로그램을 아래와 같이 작성 한다. X 좌표가 타이머 함수가 실행 때마다 줄어 들며 파람 글씨 부분과 같이 x좌표가 150보다 때는 S1 기입된 글씨가 움직이며 나오고 작을 때는 s2 글씨가 나온다.

 

예제7

 

 

void CDlgTextDlg::Draw(void)

{

        //글씨를쓰기위해사용자dc로바꾼다.

        CClientDC dc(this);

       

        // TODO: Add your message handler code here

        CRect rect;

        CString s;

        //int x,y;

        GetClientRect(&rect);

 

        // LOGFONT로부터폰트를생성

        CFont newFont, *pOldFont;

        newFont.CreateFontIndirect(&m_logFont);

 

        // 생성된폰트를DC에선택

        pOldFont = (CFont *)dc.SelectObject(&newFont);

 

        // 텍스트의전경색과배경색설정

        dc.SetTextColor(m_colorText);

        dc.SetBkColor(m_colorBk);

       

        // 배경모드를설정

        if(m_bTransparent) dc.SetBkMode(TRANSPARENT);

        else dc.SetBkMode(OPAQUE);

 

        // 텍스트를그림

        rect=CRect(x,y,x+500,y+50);      // 글씨를쓰는박스의크기

        // 이전글씨의잔상을지우기위해문장끝에빈공간의글씨를쓴다.

        s1.Format("S1 x좌표%d   ",x);

        s2.Format("S2 x좌표%d   ",x);

        if(x<=100)

          dc.DrawText(s2, &rect, DT_SINGLELINE|DT_LEFT|DT_VCENTER);//박스왼쪽글씨를쓴다.

          //dc.DrawText(s2, &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);//박스가운데글씨를쓴다.

        else

          dc.DrawText(s1, &rect, DT_SINGLELINE|DT_LEFT|DT_VCENTER);//박스왼쪽글씨를쓴다.

          //dc.DrawText(s1, &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);//박스가운데글씨를쓴다.

 

OnTimer 함수에 아래와 같이 추가하면 프로그램이 동작하는 것을 볼 수 있다.

 

예제8

 

 

void CDlgTextDlg::OnTimer(UINT_PTR nIDEvent)

{

        // TODO: 여기에메시지처리기코드를추가및/또는기본값을호출합니다.

        x-=5;

        Draw();

        CDialog::OnTimer(nIDEvent);

}

 

 

색상선택 다이어로그박스에서 선택한 색상으로 글자의 바꾸기

 

색상을 선택하는 다이어로그 박스에서 선택한 색상으로 글자의 색을 바꾸어 보겠습니다.

아래와 같이 도구상자에서 버튼 만들고 속성 “Caption”에서 글자색 바꾸기 선택 합니다.

그리고 콘트롤 이벤트에서 OnBnClickedButton1 함수를 만듭니다.

 

CColorDialog colorDialog(RGB(oldColor.Red, oldColor.Green, oldColor.Blue), CC_FULLOPEN);

위 함수는 색상을 선택하는 다이어로그 박스를 화면에 표시한다.

 

예제9

 

 

void CDlgTextDlg::OnBnClickedButton1()

{

        const CNiColor oldColor;

        CNiColor newColor;

 

    CColorDialog colorDialog(RGB(oldColor.Red, oldColor.Green, oldColor.Blue), CC_FULLOPEN);

    if (colorDialog.DoModal() == IDOK)

    {

        newColor = colorDialog.GetColor();

                m_colorText = RGB(newColor.GetRed(),

                        newColor.GetGreen(),newColor.GetBlue());

    }

}

 

아래에서 색상을 선택한 후에 확인창을 누르면 if (colorDialog.DoModal() == IDOK)” 문이 실행되어 글자의 색이 바뀌는 것을 볼 수 있다.

처음

   

 

중요함수