MFC/윈도우 프로그래밍

MFC 윈도우 프로그래밍 3장 연습문제(1~8)

꾸준함. 2018. 3. 18. 03:03

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

우선 1~8번 문제까지 풀어봤습니다.


[3-1]

Simple 예제의 윈도우 타이틀을 '간단한 MFC 프로그램'으로 수정하시오.


[3-2]

마우스 커서가 다음과 같이 윈도우에서 기본으로 제공하는 정지 아이콘(IDC_NO)으로 표시되도록 Simple 예제를 수정하시오


//ChildView.cpp PreCreateWindow 함수 다음과 같이 수정

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)

{

        if (!CWnd::PreCreateWindow(cs))

               return FALSE;

 

        cs.dwExStyle |= WS_EX_CLIENTEDGE;

        cs.style &= ~WS_BORDER;

        cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,

               ::LoadCursor(NULL, IDC_NO), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);

 

        return TRUE;

}


[3-3]

Simple 예제가 무조건 윈도우 최소화 상태로 실행되도록 수정하시오


//Simple.cpp InitInstance 함수 다음과 같이 수정

BOOL C연습문제33App::InitInstance()

{

        CWinApp::InitInstance();

 

 

        EnableTaskbarInteraction(FALSE);

 

        // RichEdit 컨트롤을 사용하려면 AfxInitRichEdit2()가 있어야 합니다.

        // AfxInitRichEdit2();

 

        // 표준 초기화

        // 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면

        // 아래에서 필요 없는 특정 초기화

        // 루틴을 제거해야 합니다.

        // 해당 설정이 저장된 레지스트리 키를 변경하십시오.

        // TODO: 이 문자열을 회사 또는 조직의 이름과 같은

        // 적절한 내용으로 수정해야 합니다.

        SetRegistryKey(_T("로컬 응용 프로그램 마법사에서 생성된 응용 프로그램"));

 

 

        // 주 창을 만들기 위해 이 코드에서는 새 프레임 창 개체를

        // 만든 다음 이를 응용 프로그램의 주 창 개체로 설정합니다.

        CMainFrame* pFrame = new CMainFrame;

        if (!pFrame)

               return FALSE;

        m_pMainWnd = pFrame;

        // 프레임을 만들어 리소스와 함께 로드합니다.

        pFrame->LoadFrame(IDR_MAINFRAME,

               WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,

               NULL);

       

 

 

 

 

        // 창 하나만 초기화되었으므로 이를 표시하고 업데이트합니다.

        pFrame->ShowWindow(SW_SHOWMINIMIZED);

        pFrame->UpdateWindow();

        return TRUE;

}


[3-4]

Simple 예제가 무조건 윈도우 최대화 상태로 실행되도록 수정하시오


//Simple.cpp InitInstance 함수 다음과 같이 수정

BOOL C연습문제34App::InitInstance()

{

        CWinApp::InitInstance();

 

 

        EnableTaskbarInteraction(FALSE);

 

        // RichEdit 컨트롤을 사용하려면 AfxInitRichEdit2()가 있어야 합니다.

        // AfxInitRichEdit2();

 

        // 표준 초기화

        // 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면

        // 아래에서 필요 없는 특정 초기화

        // 루틴을 제거해야 합니다.

        // 해당 설정이 저장된 레지스트리 키를 변경하십시오.

        // TODO: 이 문자열을 회사 또는 조직의 이름과 같은

        // 적절한 내용으로 수정해야 합니다.

        SetRegistryKey(_T("로컬 응용 프로그램 마법사에서 생성된 응용 프로그램"));

 

 

        // 주 창을 만들기 위해 이 코드에서는 새 프레임 창 개체를

        // 만든 다음 이를 응용 프로그램의 주 창 개체로 설정합니다.

        CMainFrame* pFrame = new CMainFrame;

        if (!pFrame)

               return FALSE;

        m_pMainWnd = pFrame;

        // 프레임을 만들어 리소스와 함께 로드합니다.

        pFrame->LoadFrame(IDR_MAINFRAME,

               WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,

               NULL);

 

 

 

 

 

        // 창 하나만 초기화되었으므로 이를 표시하고 업데이트합니다.

        pFrame->ShowWindow(SW_SHOWMAXIMIZED);

        pFrame->UpdateWindow();

        return TRUE;

}


[3-5]

실행 파일 이름을 화면에 출력하도록 Simple 예제를 수정하시오


//ChildView.cpp OnPaint 함수 다음과 같이 수정

void CChildView::OnPaint()

{

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

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

        CString title = AfxGetApp()->m_pszExeName;

        dc.TextOutW(50, 50, title);

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

}


[3-6]

실행할 때 입력된 명령행 인자를 화면에 출력하도록 Simple 예제를 수정하시오


//ChildView.cpp OnPaint 함수 다음과 같이 수정

void CChildView::OnPaint()

{

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

        CString commandLineFactor = AfxGetApp()->m_lpCmdLine;

        if (commandLineFactor != _T('\0'))

               dc.TextOutW(50, 50, _T("명령행 처리 인자를 처리할 수 없습니다"));

        else

               dc.TextOutW(50, 50, commandLineFactor);

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

       

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

}


[3-7]

CMainFrame의 윈도우 타이틀을 가져와 출력하도록 Simple 예제를 수정하시오


//ChildView.cpp  OnPaint 함수 다음과 같이 수정

void CChildView::OnPaint()

{

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

        CString wTitle;

        //1번째 방법

        /*

        CWnd *pMainWnd = ::AfxGetMainWnd();

        pMainWnd->GetWindowTextW(wTitle);

        */

        //2번째 방법

        CWnd *pMainWnd = this->GetParent();

        pMainWnd->GetWindowTextW(wTitle);

        dc.TextOutW(50, 50, wTitle);

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

       

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

}


[3-8]

윈도우에 시스템 메뉴와 크기 조절 버튼이 나타나지 않도록 Simple 예제를 수정하시오


//MainFrm.cpp PreCreateWindow 다음과 같이 수정

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

        if( !CFrameWnd::PreCreateWindow(cs) )

               return FALSE;

        // TODO: CREATESTRUCT cs를 수정하여 여기에서

        //  Window 클래스 또는 스타일을 수정합니다.

 

        cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU;

        cs.style &= ~WS_SYSMENU; //추가

        cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

        cs.lpszClass = AfxRegisterWndClass(0);

        return TRUE;

}



개발환경:Visual Studio 2017


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

반응형