[Intel AI SW 아카데미] C++ 이론 (4), MFC 기초

Jimeaning·2023년 10월 26일
0

Intel AIoT

목록 보기
9/38

23.10.26 (목) 28일차

C++ 파일 입출력

텍스트 파일, 바이너리 파일
텍스트 파일 : 문자만 있는 것
바이너리 파일 : 미디어도 포함

예외 처리와 C언어와의 링크 지정

C에는 없고 C++에만 있는 것이 예외 처리 (try - throw - catch)

MFC

비주얼 스튜디오에서 새 프로젝트 만들기


새 프로젝트 만들기 한 후 mfc 앱 선택


단일 문서 선택
MFC standard로 바꿔주기

용어 해석

LPCREATESTRUCT
LP: Long Pinter
Create struct : 구조체 만듬

코드

  • MFC1View.cpp
    기본 문자 출력하기 - pDC 주석만 풀어주고 출력하면 됨!
// MFC1View.cpp

// CMFC1View 그리기

void CMFC1View::OnDraw(CDC* pDC)
{
	CMFC1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.

	CString test = _T("Hello MFC SDI GDI interface test!!.");
	pDC->TextOut(0, 0, test);
}

가로 세로 크기 출력

void CMFC1View::OnDraw(CDC* pDC)
{
	CMFC1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.

	CString test = _T("Hello MFC SDI GDI interface test!!.");
	pDC->TextOut(0, 0, test);
    
    test.Format(_T("HORZRES(가로크기)=%d"),
	pDC->GetDeviceCaps(HORZRES));
    pDC->TextOut(0, 20, test);
    test.Format(_T("VERTRES(세로크기)=%d"),
        pDC->GetDeviceCaps(VERTRES));
    pDC->TextOut(0, 40, test);
}

글자 위치 지정

void CMFC1View::OnDraw(CDC* pDC)
{
	CMFC1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.

	CString test = _T("Hello MFC SDI GDI interface test!!.");
	pDC->TextOut(0, 0, test);
    
    test.Format(_T("HORZRES(가로크기)=%d"),
	pDC->GetDeviceCaps(HORZRES));
    pDC->TextOut(0, 20, test);
    test.Format(_T("VERTRES(세로크기)=%d"),
        pDC->GetDeviceCaps(VERTRES));
    pDC->TextOut(0, 40, test);
    
    test = _T("DrawText Example");
	CRect rect = CRect(0, 60, 400, 100);
	pDC->DrawText(test, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}

글자와 백그라운드 색깔 지정하기

void CMFC1View::OnDraw(CDC* pDC)
{
	CMFC1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.

	CString test = _T("Hello MFC SDI GDI interface test!!.");
	pDC->TextOut(0, 0, test);
    
    test.Format(_T("HORZRES(가로크기)=%d"),
	pDC->GetDeviceCaps(HORZRES));
    pDC->TextOut(0, 20, test);
    test.Format(_T("VERTRES(세로크기)=%d"),
        pDC->GetDeviceCaps(VERTRES));
    pDC->TextOut(0, 40, test);
    
    test = _T("DrawText Example");
	CRect rect = CRect(0, 60, 400, 100);
	pDC->DrawText(test, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    test = _T("ExtTextOut Example");
    pDC->SetTextColor(RGB(255, 0, 0));
    pDC->SetBkColor(RGB(255, 255, 0));
    pDC->ExtTextOut(0, 120, ETO_CLIPPED | ETO_OPAQUE, CRect(0, 120, 400, 200), test, NULL);
}

글자 폰트 바꾸기

void CMFC1View::OnDraw(CDC* pDC)
{
	CMFC1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.

	CFont cFont, * oldFont;
    //폰트를 만든다.
    cFont.CreateFont(10, 10,//v,h size
        0, 0,//angle
        FW_DONTCARE,//bold
        FALSE,//italic
        FALSE,//under line
        FALSE,//STRIKEOUT plug
        DEFAULT_CHARSET,//CHAR SET
        OUT_DEFAULT_PRECIS,
        CLIP_DEFAULT_PRECIS,
        DEFAULT_QUALITY,
        DEFAULT_PITCH, _T("돋움체"));
    //oldFont backup 
    oldFont = pDC->SelectObject(&cFont);

	CString test = _T("Hello MFC SDI GDI interface test!!.");
	pDC->TextOut(0, 0, test);
    
    test.Format(_T("HORZRES(가로크기)=%d"),
	pDC->GetDeviceCaps(HORZRES));
    pDC->TextOut(0, 20, test);
    test.Format(_T("VERTRES(세로크기)=%d"),
        pDC->GetDeviceCaps(VERTRES));
    pDC->TextOut(0, 40, test);
    
    test = _T("DrawText Example");
	CRect rect = CRect(0, 60, 400, 100);
	pDC->DrawText(test, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    test = _T("ExtTextOut Example");
    pDC->SetTextColor(RGB(255, 0, 0));
    pDC->SetBkColor(RGB(255, 255, 0));
    pDC->ExtTextOut(0, 120, ETO_CLIPPED | ETO_OPAQUE, CRect(0, 120, 400, 200), test, NULL);
}

새로운 프로젝트 SDI

메뉴 생성 - 박스 그리기 만들기

속성 창에서 수정

함수와 연결하기
클래스 마법사에서 클래스 이름을 CSDIIView로 설정하고, 만들어 놓은 ID_Drawbox를 더블 클릭해 확인을 누른다.

코드

실행 후 파일 버튼을 누르고 박스 그리기를 클릭하면 박스가 그려짐

// SDIIView.cpp

void CSDIIView::OnDrawbox()
{
	// TODO: 여기에 명령 처리기 코드를 추가합니다.
	CDC* pDC = GetDC();//DC를 얻고
	pDC->Rectangle(CRect(0, 0, 100, 100));//박스를 그린다음
	ReleaseDC(pDC);//DC해제
}

박스 색깔 바꾸기

void CSDIIView::OnDrawbox()
{
	// TODO: 여기에 명령 처리기 코드를 추가합니다.
	CPen cPen, * oldPen;
	cPen.CreatePen(PS_SOLID, 2, RGB(0, 0, 255));
	CDC* pDC = GetDC();
	oldPen = pDC->SelectObject(&cPen);
	pDC->Rectangle(CRect(0, 0, 100, 100));
	pDC->SelectObject(oldPen);
	cPen.DeleteObject();
	ReleaseDC(pDC);
}

박스 안쪽도 색깔 변경하기

void CSDIIView::OnDrawbox()
{
	// TODO: 여기에 명령 처리기 코드를 추가합니다.
	CPen cPen, * oldPen;
	cPen.CreatePen(PS_SOLID, 2, RGB(0, 0, 255));
	CBrush cBrush, * oldBrush;
	cBrush.CreateSolidBrush(RGB(255, 255, 0));
	CDC* pDC = GetDC();//DC를 얻고
	oldPen = pDC->SelectObject(&cPen);
	oldBrush = pDC->SelectObject(&cBrush);
	pDC->Rectangle(CRect(0, 0, 100, 100));//박스를 그린다음
	pDC->SelectObject(oldBrush);
	cBrush.DeleteObject();
	pDC->SelectObject(oldPen);
	cPen.DeleteObject();
	ReleaseDC(pDC);//DC해제
}

MDI

키 누르면 감지

프로젝트 생성

클래스 마법사 설정

// MsgView.cpp

void CMsgView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	AfxMessageBox(_T("Key Pressed"));

	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

아스키 키 누르면 출력하기

void CMsgView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	CString temp;
	temp.Format(_T(" %c key press!!"), nChar);
	AfxMessageBox(temp);

	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

마우스 왼쪽 클릭 감지
클래스 마법사 설정

void CMsgView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	AfxMessageBox(_T("Mouse Left Button click"));

	CView::OnLButtonDown(nFlags, point);
}

마우스 오른쪽 클릭 감지
클래스 마법사 설정

void CMsgView::OnRButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	AfxMessageBox(_T("마우스 오른쪽 클릭"));
	CView::OnRButtonDown(nFlags, point);
}

실행 취소 버튼 감지

클래스 마법사 설정

void CMsgView::OnEditUndo()
{
	// TODO: 여기에 명령 처리기 코드를 추가합니다.
	AfxMessageBox(_T("Select the Menu Undo Item"));
}
profile
I mean

0개의 댓글