MFC/윈도우 프로그래밍

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

꾸준함. 2018. 3. 21. 19:29

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


[3-1]

// MainFrm.cpp: CMainFrame 클래스의 구현

//

 

#include "stdafx.h"

#include "심화문제 3-1.h"

 

#include "MainFrm.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

// CMainFrame

 

IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWndEx)

 

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)

        ON_WM_DESTROY()

        ON_WM_CREATE()

END_MESSAGE_MAP()

 

// CMainFrame 생성/소멸

 

CMainFrame::CMainFrame()

{

        // TODO: 여기에 멤버 초기화 코드를 추가합니다.

}

 

CMainFrame::~CMainFrame()

{

}

 

//프로그램을 종료할 때 윈도우 크기와 위치를 보관해 두었다가 다시 실행할 때 그 크기와 위치가

//복원되도록 Simple 예제를 수정하시오. , 정보는 레지스트리에 보관한다

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

        if( !CMDIFrameWndEx::PreCreateWindow(cs) )

               return FALSE;

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

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

 

        CWinApp *pApp = AfxGetApp();

        //초기 윈도우의 크기를 불러옴, 마지막 인자는 레지스트리가 비어있을 경우 디폴트 값

        cs.x = pApp->GetProfileIntW(_T("윈도우크기"), _T("Left"), 30);

        cs.y = pApp->GetProfileIntW(_T("윈도우크기"), _T("Top"), 40);

        cs.cx = pApp->GetProfileIntW(_T("윈도우크기"), _T("Width"), 100);

        cs.cy = pApp->GetProfileIntW(_T("윈도우크기"), _T("Height"), 200);

 

        cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE

               | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU | WS_SIZEBOX; //WS_SIZEBOX 추가

 

        return TRUE;

}

// CMainFrame 진단

 

#ifdef _DEBUG

void CMainFrame::AssertValid() const

{

        CMDIFrameWndEx::AssertValid();

}

 

void CMainFrame::Dump(CDumpContext& dc) const

{

        CMDIFrameWndEx::Dump(dc);

}

#endif //_DEBUG

 

 

// CMainFrame 메시지 처리기

 

//윈도우 위치 불러옴

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

        if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)

               return -1;

 

        // TODO:  여기에 특수화된 작성 코드를 추가합니다.

        CRect rect;

        GetWindowRect(&rect);

        CWinApp *pApp = AfxGetApp();

 

        //초기 윈도우의 위치를 불러옴, 마지막 인자는 레지스트리가 비어있을 경우 디폴트 값

        rect.left = pApp->GetProfileIntW(_T("윈도우위치"), _T("Left"), rect.left);

        rect.top = pApp->GetProfileIntW(_T("윈도우위치"), _T("Top"), rect.top);

        rect.right = pApp->GetProfileIntW(_T("윈도우위치"), _T("Right"), rect.right);

        rect.bottom = pApp->GetProfileIntW(_T("윈도우위치"), _T("Bottom"), rect.bottom);

        MoveWindow(rect);

        return 0;

}

 

 

void CMainFrame::OnDestroy()

{

        CRect rect, rect2;

        GetWindowRect(&rect);

        CWinApp *pApp = AfxGetApp();

 

        //좌상단 꼭지점 정보

        pApp->WriteProfileInt(_T("윈도우크기"), _T("Left"), rect.left);

        pApp->WriteProfileInt(_T("윈도우크기"), _T("Top"), rect.top);

        //가로 세로

        pApp->WriteProfileInt(_T("윈도우크기"), _T("Width"), rect.Width());

        pApp->WriteProfileInt(_T("윈도우크기"), _T("Height"), rect.Height());;

       

        //위치(좌상단, 우하단)

        pApp->WriteProfileInt(_T("윈도우위치"), _T("Left"), rect.left);

        pApp->WriteProfileInt(_T("윈도우위치"), _T("Top"), rect.top);

        pApp->WriteProfileInt(_T("윈도우위치"), _T("Right"), rect.right);

        pApp->WriteProfileInt(_T("윈도우위치"), _T("Bottom"), rect.bottom);

        CMDIFrameWndEx::OnDestroy();

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

}

 

[3-2]

CMainFrame class에 CChildView m_wndView2; 추가


//Simple 예제를 다음과 같이 수정하시오

//CChildView m_wndView2 멤버 변수를 추가하고 CMainFrame::OnCreate() 함수를 수정하여

//뷰 윈도우 위에 다른 뷰 윈도우를 생성한다.

//, (5, 5) 좌표에 가로와 세로 크기가 100이고 m_wndView를 부모 윈도우로 처리한다

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

        if (CFrameWnd::OnCreate(lpCreateStruct) == -1)

               return -1;

 

        // 프레임의 클라이언트 영역을 차지하는 뷰를 만듭니다.

        if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,

               CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))

        {

               TRACE0("뷰 창을 만들지 못했습니다.\n");

               return -1;

        }

        //추가

        if (!m_wndView2.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,

               CRect(5, 5, 5 + 100, 5 + 100), &m_wndView, AFX_IDW_PANE_FIRST + 1))

        {

               TRACE0("뷰 창을 만들지 못했습니다.\n");

               return -1;

        }

        return 0;

}



[3-3]

//Simple 예제를 다음과 같이 수정하시오

//CSimpleApp::InitInstance() 함수에서 텍스트 파일을 읽어 파일 내 문자열을 CString 클래스 객체로 보관한다

//그리고 해당 문자열을 CChildView::OnPaint() 함수에서 화면에 출력한다.

BOOL C심화문제33App::InitInstance()

{

        CWinApp::InitInstance();

 

 

        EnableTaskbarInteraction(FALSE);

 

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

        // AfxInitRichEdit2();

 

        // 표준 초기화

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

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

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

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

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

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

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

 

        FILE *ft = fopen("뻐꾸기.txt", "r");

        if (ft == NULL)

        {

               MessageBox(NULL, _T("파일 없음"), NULL, NULL);

               return -1;

        }

        char buf[80];

        fgets(buf, 80, ft);

        text = buf;

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

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

        CMainFrame* pFrame = new CMainFrame;

        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;

}


void CChildView::OnPaint()

{

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

        CString str = ((C심화문제33App*)AfxGetApp())->text;

        MessageBox(str, NULL, NULL);

        dc.TextOut(50, 50, str);

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

       

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

}


[3-4]

이 문제는 풀지 못했습니다... 답을 아시는 분 힌트라도 주시면 감사하겠습니다!


//CFrameWnd::RecalcLayOut() 함수를 재정의하여 뷰의 가로와 세로 크기가

//프레임 윈도우의 절반이 되도록 Simple 예제를 수정하시오

void CMainFrame::RecalcLayout(BOOL bNotify)

{

        CFrameWnd::RecalcLayout(bNotify);

        // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.

        if (m_wndView.GetSafeHwnd() != NULL)

        {

               CRect rectFrame;

               CRect rectView;

               GetWindowRect(&rectFrame);

               GetClientRect(&rectView);

              

               //이후에 어떻게 해야 뷰 사이즈가 반이 될까

        }

}


개발환경:Visual Studio 2017


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


반응형