MFC/윈도우 프로그래밍

MFC 윈도우 프로그래밍 4장 심화문제

꾸준함. 2018. 3. 26. 01:18

윈도우 프로그래밍 Visual C++ 2010 MFC Programming(김선우, 신화서 저) 4장 심화문제입니다.

https://blog.naver.com/mark1007/220988574718 참고했습니다.


[4-1]

//클라이언트 영역에 다음과 같이 표를 출력하도록 DrawLines 예제를 수정하시오

void CChildView::OnPaint()

{

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

       

        // TODO: 여기에 메시지 처리기 코드를 추가합니다.

        POINT ptArr[][8] = {

               {{10, 10}, {90, 10}, {140, 10}, {190, 10}, {240, 10}, {290, 10}, {340, 10}, {390, 10} },

               {{10, 40}, {90, 40}, {140, 40}, {190, 40}, {240, 40}, {290, 40}, {340, 40}, {390, 40} },

               {{10, 70}, {90, 70}, {140, 70}, {190, 70}, {240, 70}, {290, 70}, {340, 70}, {390, 70}},

               {{10, 100}, {90, 100}, {140, 100}, {190, 100}, {240, 100}, {290, 100}, {340, 100}, {390, 100}}

        };

        CString probability[] = { _T("확률"), _T("0.1"), _T("0.3"), _T("0.2"), _T("0.1"), _T("0.1"), _T("0.2") };

        CString accumulate[] = { _T("누적"), _T("0.1"), _T("0.4"), _T("0.6"), _T("0.7"), _T("0.8"), _T("1.0") };

 

        //회색 배경, 굵은 선

        dc.SelectStockObject(LTGRAY_BRUSH);

        CPen penThick(PS_SOLID, 2, RGB(0, 0, 0));

        dc.SelectObject(&penThick);

        dc.Rectangle(CRect(ptArr[0][0], ptArr[1][7]));

 

        //굵은 선

        dc.SelectStockObject(WHITE_BRUSH);

        dc.Rectangle(CRect(ptArr[1][0], ptArr[3][7]));

 

        //보통 선

        dc.SelectStockObject(BLACK_PEN);

        //가로 선

        dc.MoveTo(ptArr[2][0]);

        dc.LineTo(ptArr[2][7]);

 

        //세로 선

        for (int i = 1; i < 7; i++)

        {

               dc.MoveTo(ptArr[0][i]);

               dc.LineTo(ptArr[3][i]);

        }

 

        //보통 글자

        dc.SelectStockObject(SYSTEM_FONT);

        dc.SetBkMode(TRANSPARENT);

        for (int i = 0; i < 7; i++)

        {

               dc.DrawText(probability[i], probability[i].GetLength(), CRect(ptArr[1][i], ptArr[2][i + 1]), DT_CENTER | DT_VCENTER | DT_SINGLELINE);

               dc.DrawText(accumulate[i], accumulate[i].GetLength(), CRect(ptArr[2][i], ptArr[3][i + 1]), DT_CENTER | DT_VCENTER | DT_SINGLELINE);

        }

 

        //굵은 글자

        LOGFONT lf;

        CFont *pFontCurrent = dc.GetCurrentFont();

        pFontCurrent->GetLogFont(&lf);

        lf.lfWeight = FW_BOLD;

        CFont fontBold;

        fontBold.CreateFontIndirectW(&lf);

 

        dc.SelectObject(&fontBold);

        for (int i = 1; i < 7; i++)

        {

               CString str;

               str.Format(_T("%d"), i);

 

               dc.DrawText(str, str.GetLength(), CRect(ptArr[0][i], ptArr[1][i + 1]), DT_CENTER | DT_VCENTER | DT_SINGLELINE);

        }

        // 그리기 메시지에 대해서는 CWnd::OnPaint()를 호출하지 마십시오.

}


[4-2]

//클라이언트 영역에 가로 눈금자를 출력하고, 이를 통해 현재 윈도우 크기가 몇 cm인지

//확인할 수 있도록 DrawLines 예제를 수정하시오

void CChildView::OnPaint()

{

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

       

        // TODO: 여기에 메시지 처리기 코드를 추가합니다.

        dc.SetMapMode(MM_LOMETRIC); //매핑 모드 변경

        CSize size = dc.GetWindowExt();

        CRect rect(CPoint(0, 0), size);

        rect.bottom = -100;

 

        //굵은 선

        CPen penThick(PS_SOLID, 5, RGB(0, 0, 0));

        dc.SelectObject(&penThick);

        dc.Rectangle(rect); //사각형 출력

        dc.TextOutW(5, -40, _T("0"));

 

        //1cm 눈금과 글자 출력

        for (int i = 100; i < rect.right; i += 100)

        {

               dc.MoveTo(i, 0);

               dc.LineTo(i, -60);

 

               if (i % 100 == 0)

               {

                       CString str;

                       str.Format(_T("%d"), i / 100);

 

                       CRect rect(i - 100, -40, i - 5, -100);

                       dc.DrawText(str, str.GetLength(), rect, DT_RIGHT | DT_TOP | DT_SINGLELINE);

               }

        }

 

        //보통 선

        dc.SelectStockObject(BLACK_PEN);

 

        //5mm 1mm 눈금

        for (int i = 10; i < rect.right; i += 10)

        {

               if (i % 50 == 0) //5mm

               {

                       dc.MoveTo(i, 0);

                       dc.LineTo(i, -40);

               }

               else if (i % 10 == 0) //10mm

               {

                       dc.MoveTo(i, 0);

                       dc.LineTo(i, -20);

               }

        }

        // 그리기 메시지에 대해서는 CWnd::OnPaint()를 호출하지 마십시오.

}



개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


*4-3 "MetaFileDC 예제에서 별도의 CMetaFileDC 클래스 객체를 사용하여 화면에 출력한 내용을 모두 하나의 메타파일로 저장하도록 예제를 수정하시오"는 풀지 못했습니다. 힌트라도 주시면 감사하겠습니다!

반응형