MFC/윈도우 프로그래밍

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

꾸준함. 2018. 3. 18. 15:06

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

저번에 이어 나머지 연습문제를 풀어봤습니다.


[3-9]

//뷰 윈도우에 가로와 세로 스크롤바가 나타나도록 Simple 예제를 수정하시오

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)

{

        if (!CWnd::PreCreateWindow(cs))

               return FALSE;

 

        cs.dwExStyle |= WS_EX_CLIENTEDGE;

        cs.style |= WS_HSCROLL | WS_VSCROLL; //스크롤바 추가

        cs.style &= ~WS_BORDER;

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

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

 

        return TRUE;

}


[3-10]

//폭이 800 너비가 600인 윈도우로 실행되도록 Simple 예제를 수정하시오

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

        if( !CFrameWnd::PreCreateWindow(cs) )

               return FALSE;

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

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

       

        cs.cx = 800, cs.cy = 600; //크기 제어

        cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE

                | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU;

 

        cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

        cs.lpszClass = AfxRegisterWndClass(0);

        return TRUE;

}

[3-11]

//Simple 예제가 최상위 윈도우로 실행되도록 수정하시오

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.dwExStyle = WS_EX_TOPMOST; //최상위 윈도우

        cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

        cs.lpszClass = AfxRegisterWndClass(0);

        return TRUE;

}


[3-12]

//기존 윈도우 대신 타이틀바가 있는 팝업 윈도우를 생성하도록 Simple 예제를 수정하시오

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

        if( !CFrameWnd::PreCreateWindow(cs) )

               return FALSE;

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

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

 

        cs.style = WS_POPUPWINDOW; //팝업 윈도우

        cs.cx = 800, cs.cy = 600; //크기 지정

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

 

        cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

        cs.lpszClass = AfxRegisterWndClass(0);

        return TRUE;

}


[3-13]

이 문제를 풀기 위해서는 우선 MainFrm.h에 가서 아래와 같이 수정해야합니다

class CMainFrame : public CFrameWnd

{

       

public:

        CMainFrame();

protected:

        //DECLARE_DYNAMIC(CMainFrame)

        DECLARE_DYNCREATE(CMainFrame)

// 특성입니다.


그 다음에는 MainFrm.cpp에 가서 아래와 같이 수정합니다.

//IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd);


//CSimpleApp::InitInstance() 함수에서 CMainFrame 객체를 new 연산자가 아닌

//CRuntimeClass::CreateObject() 함수로 생성하도록 Simple 예제를 수정하시오

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

{

        CWinApp::InitInstance();

 

 

        EnableTaskbarInteraction(FALSE);

 

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

        // AfxInitRichEdit2();

 

        // 표준 초기화

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

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

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

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

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

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

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

 

 

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

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

        //CMainFrame* pFrame = new CMainFrame;

        CRuntimeClass *pClass = RUNTIME_CLASS(CMainFrame);

        CMainFrame *pFrame = (CMainFrame*)pClass->CreateObject();

        if (!pFrame)

               return FALSE;

        m_pMainWnd = pFrame;

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

        pFrame->LoadFrame(IDR_MAINFRAME,

               WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,

               NULL);

 

 

 

 

 

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

        pFrame->ShowWindow(SW_SHOW);

        pFrame->UpdateWindow();

        return TRUE;

}

 

[3-14]

//윈도우 타이틀바 아이콘이 다음과 같이 윈도우에서 기본으로 제공하는 느낌표 아이콘

//으로 표시되도록 Simple 예제를 수정하시오

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.dwExStyle &= ~WS_EX_CLIENTEDGE;

        cs.lpszClass = AfxRegisterWndClass(NULL, NULL, NULL, LoadIcon(NULL, IDI_EXCLAMATION)); //느낌표 아이콘

        return TRUE;

}


[3-15]

// CChildView 메시지 처리기

//뷰 윈도우에 WM_LBUTTONDBLCLK 메시지가 발생하지 않게

//윈도우 클래스 특성을 변경하도록 Simple 예제를 수정하시오

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|WM_LBUTTONDBLCLK,

               ::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL); //WM_LBUTTONDBLCLK 추가

 

        return TRUE;

}

 

[3-16]

//프로그램을 종료할 때 다음과 같은 메시지 상자를 띄우도록 Simple 예제를 수정하시오

int C연습문제316App::ExitInstance()

{

        //TODO: 추가한 추가 리소스를 처리합니다.

        MessageBox(NULL, _T("프로그램을 종료합니다."), _T("종료"), NULL);

        return CWinApp::ExitInstance();

}



개발환경:Visual Studio 2017


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

반응형