윈도우 프로그래밍 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 클래스 객체를 사용하여 화면에 출력한 내용을 모두 하나의 메타파일로 저장하도록 예제를 수정하시오"는 풀지 못했습니다. 힌트라도 주시면 감사하겠습니다!
'MFC > 윈도우 프로그래밍' 카테고리의 다른 글
MFC 윈도우 프로그래밍 5장 연습문제(9~16) (0) | 2018.03.30 |
---|---|
MFC 윈도우 프로그래밍 5장 연습문제(1~8) (0) | 2018.03.29 |
MFC 윈도우 프로그래밍 4장 연습문제(9~16) (3) | 2018.03.25 |
MFC 윈도우 프로그래밍 4장 연습문제(1~8) (2) | 2018.03.24 |
MFC 윈도우 프로그래밍 3장 심화문제 (4) | 2018.03.21 |