MFC/윈도우 프로그래밍

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

꾸준함. 2018. 4. 6. 02:26

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

우선 1~5번 문제까지 풀었습니다.(2018년 4월 6일 02:17)

확실히 챕터를 진행할수록 난이도가 엄청 올라가네요. 진짜 1을 가리키고 100을 요구하는 책입니다.


*6~8번 문제 업로드(2018년 4월 7일 01:03)


[6-1]

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

//수학 함수(&M) 메뉴 옆에 메뉴를 추가하는데,

//메뉴 이름은 IDR_MAINFRAME 문자열 리소스를 읽어 사용하고,

//'ID' ID_APP_ABOUT을 사용한다

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_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||

               !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

        {

               TRACE0("도구 모음을 만들지 못했습니다.\n");

               return -1;      // 만들지 못했습니다.

        }

 

        if (!m_wndStatusBar.Create(this))

        {

               TRACE0("상태 표시줄을 만들지 못했습니다.\n");

               return -1;      // 만들지 못했습니다.

        }

        m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));

 

        // TODO: 도구 모음을 도킹할 수 없게 하려면 이 세 줄을 삭제하십시오.

        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

        EnableDocking(CBRS_ALIGN_ANY);

        DockControlBar(&m_wndToolBar);

 

        CString str;

        str.LoadStringW(IDR_MAINFRAME); //메뉴 이름

 

        CMenu *pTopLevel = GetMenu(); //최상위 메뉴의 포인터를 얻는다

        pTopLevel->AppendMenu(MF_POPUP, (int)ID_APP_ABOUT, str); //ID_APP_ABOUT

        return 0;

}

 

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

        if( !CFrameWnd::PreCreateWindow(cs) )

               return FALSE;

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

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

 

        cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

        cs.lpszClass = AfxRegisterWndClass(0);

        return TRUE;

}


[6-2]

CColorSelectApp 클래스가 Visual Studio 2017에는 없는 듯 합니다.


[6-3]

 

// MainFrm.h: CMainFrame 클래스의 인터페이스

//

 

#pragma once

#include "ChildView.h"

 

class CMainFrame : public CFrameWnd

{

       

public:

        CMainFrame();

protected:

        DECLARE_DYNAMIC(CMainFrame)

 

// 특성입니다.

public:

 

// 작업입니다.

public:

 

// 재정의입니다.

public:

        virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

        virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);

 

// 구현입니다.

public:

        virtual ~CMainFrame();

#ifdef _DEBUG

        virtual void AssertValid() const;

        virtual void Dump(CDumpContext& dc) const;

#endif

 

protected// 컨트롤 모음이 포함된 멤버입니다.

        CToolBar          m_wndToolBar;

        CStatusBar        m_wndStatusBar;

        CChildView    m_wndView;

 

// 생성된 메시지 맵 함수

protected:

        afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

        afx_msg void OnSetFocus(CWnd *pOldWnd);

        afx_msg void OnApplicationLook(UINT id);

        afx_msg void OnUpdateApplicationLook(CCmdUI* pCmdUI);

        DECLARE_MESSAGE_MAP()

 

public:

        afx_msg void OnColorBlue();

        afx_msg void OnColorGreen();

        afx_msg void OnColorRed();

//      afx_msg void OnPaint();

};

 

 

  

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

//ColorSelect 예제의 CChildView 클래스에서 처리하던 메뉴 명령 처리를

//CMainFrame 클래스에서 처리하도록 예제를 수정하시오.

//, m_color 멤버 변수는 이동하지 않고 CChildView 클래스에 위치

 

#include "stdafx.h"

#include "연습문제 6-3.h"

#include "ChildView.h"

#include "MainFrm.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

// CMainFrame

 

IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)

 

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

        ON_WM_CREATE()

        ON_WM_SETFOCUS()

        ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)

        ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook)

        ON_COMMAND(ID_COLOR_BLUE, &CMainFrame::OnColorBlue)

        ON_COMMAND(ID_COLOR_GREEN, &CMainFrame::OnColorGreen)

        ON_COMMAND(ID_COLOR_RED, &CMainFrame::OnColorRed)

END_MESSAGE_MAP()

 

static UINT indicators[] =

{

        ID_SEPARATOR,           // 상태 줄 표시기

        ID_INDICATOR_CAPS,

        ID_INDICATOR_NUM,

        ID_INDICATOR_SCRL,

};

 

// CMainFrame 생성/소멸

 

CMainFrame::CMainFrame()

{

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

        ((CChildView*)AfxGetApp())->m_color = RGB(255, 0, 0);

}

 

CMainFrame::~CMainFrame()

{

}

 

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_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||

               !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

        {

               TRACE0("도구 모음을 만들지 못했습니다.\n");

               return -1;      // 만들지 못했습니다.

        }

 

        if (!m_wndStatusBar.Create(this))

        {

               TRACE0("상태 표시줄을 만들지 못했습니다.\n");

               return -1;      // 만들지 못했습니다.

        }

        m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));

 

        // TODO: 도구 모음을 도킹할 수 없게 하려면 이 세 줄을 삭제하십시오.

        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

        EnableDocking(CBRS_ALIGN_ANY);

        DockControlBar(&m_wndToolBar);

 

 

        return 0;

}

 

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

        if( !CFrameWnd::PreCreateWindow(cs) )

               return FALSE;

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

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

 

        cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

        cs.lpszClass = AfxRegisterWndClass(0);

        return TRUE;

}

 

// CMainFrame 진단

 

#ifdef _DEBUG

void CMainFrame::AssertValid() const

{

        CFrameWnd::AssertValid();

}

 

void CMainFrame::Dump(CDumpContext& dc) const

{

        CFrameWnd::Dump(dc);

}

#endif //_DEBUG

 

 

// CMainFrame 메시지 처리기

 

void CMainFrame::OnSetFocus(CWnd* /*pOldWnd*/)

{

        // 뷰 창으로 포커스를 이동합니다.

        m_wndView.SetFocus();

}

 

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)

{

        // 뷰에서 첫째 크랙이 해당 명령에 나타나도록 합니다.

        if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))

               return TRUE;

 

        // 그렇지 않으면 기본 처리합니다.

        return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);

}

 

void CMainFrame::OnApplicationLook(UINT id)

{

        CWaitCursor wait;

 

        theApp.m_nAppLook = id;

 

        switch (theApp.m_nAppLook)

        {

        case ID_VIEW_APPLOOK_WIN_2000:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager));

               break;

 

        case ID_VIEW_APPLOOK_OFF_XP:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP));

               break;

 

        case ID_VIEW_APPLOOK_WIN_XP:

               CMFCVisualManagerWindows::m_b3DTabsXPTheme = TRUE;

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

               break;

 

        case ID_VIEW_APPLOOK_OFF_2003:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003));

               CDockingManager::SetDockingMode(DT_SMART);

               break;

 

        case ID_VIEW_APPLOOK_VS_2005:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005));

               CDockingManager::SetDockingMode(DT_SMART);

               break;

 

        case ID_VIEW_APPLOOK_VS_2008:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008));

               CDockingManager::SetDockingMode(DT_SMART);

               break;

 

        case ID_VIEW_APPLOOK_WINDOWS_7:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows7));

               CDockingManager::SetDockingMode(DT_SMART);

               break;

 

        default:

               switch (theApp.m_nAppLook)

               {

               case ID_VIEW_APPLOOK_OFF_2007_BLUE:

                       CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);

                       break;

 

               case ID_VIEW_APPLOOK_OFF_2007_BLACK:

                       CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);

                       break;

 

               case ID_VIEW_APPLOOK_OFF_2007_SILVER:

                       CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);

                       break;

 

               case ID_VIEW_APPLOOK_OFF_2007_AQUA:

                       CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);

                       break;

               }

 

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));

               CDockingManager::SetDockingMode(DT_SMART);

        }

 

        RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);

 

}

 

void CMainFrame::OnUpdateApplicationLook(CCmdUI* pCmdUI)

{

        pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID);

}

 

 

 

void CMainFrame::OnColorBlue()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        ((CChildView*)AfxGetApp())->m_color = RGB(0, 0, 255);

        Invalidate();

}

 

 

void CMainFrame::OnColorGreen()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        ((CChildView*)AfxGetApp())->m_color = RGB(0, 255, 0);

        Invalidate();

}

 

 

void CMainFrame::OnColorRed()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        ((CChildView*)AfxGetApp())->m_color = RGB(255, 0, 0);

        Invalidate();

}

 

 


[6-4]

 

// MainFrm.h: CMainFrame 클래스의 인터페이스

//

 

#pragma once

#include "ChildView.h"

 

class CMainFrame : public CFrameWnd

{

       

public:

        CMainFrame();

protected:

        DECLARE_DYNAMIC(CMainFrame)

 

// 특성입니다.

public:

 

// 작업입니다.

public:

        afx_msg void OnRed();

        afx_msg void OnGreen();

        afx_msg void OnBlue();

// 재정의입니다.

public:

        virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

        virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);

 

// 구현입니다.

public:

        virtual ~CMainFrame();

#ifdef _DEBUG

        virtual void AssertValid() const;

        virtual void Dump(CDumpContext& dc) const;

#endif

 

protected// 컨트롤 모음이 포함된 멤버입니다.

        CToolBar          m_wndToolBar;

        CStatusBar        m_wndStatusBar;

        CChildView    m_wndView;

 

// 생성된 메시지 맵 함수

protected:

        afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

        afx_msg void OnSetFocus(CWnd *pOldWnd);

        afx_msg void OnApplicationLook(UINT id);

        afx_msg void OnUpdateApplicationLook(CCmdUI* pCmdUI);

        DECLARE_MESSAGE_MAP()

 

};

 

 

  

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

//IDR_MAINFRAME 메뉴 리소스를 읽어들여 메뉴를 처리하는 방식 대신

//메인 메뉴에서 서브메뉴를 분리하여 컨텍스트 메뉴를 띄우도록 ColorSelect 예제를 수정하시오

 

#include "stdafx.h"

#include "연습문제 6-4.h"

#include "ChildView.h"

#include "MainFrm.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

// CMainFrame

 

IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)

 

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

        ON_COMMAND(301, &CMainFrame::OnRed)

        ON_COMMAND(302, &CMainFrame::OnGreen)

        ON_COMMAND(303, &CMainFrame::OnBlue)

        ON_WM_CREATE()

        ON_WM_SETFOCUS()

        ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)

        ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook)

END_MESSAGE_MAP()

 

static UINT indicators[] =

{

        ID_SEPARATOR,           // 상태 줄 표시기

        ID_INDICATOR_CAPS,

        ID_INDICATOR_NUM,

        ID_INDICATOR_SCRL,

};

 

// CMainFrame 생성/소멸

 

CMainFrame::CMainFrame()

{

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

        ((CChildView*)AfxGetApp())->m_color = RGB(255, 0, 0);

}

 

CMainFrame::~CMainFrame()

{

}

 

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_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||

               !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

        {

               TRACE0("도구 모음을 만들지 못했습니다.\n");

               return -1;      // 만들지 못했습니다.

        }

 

        if (!m_wndStatusBar.Create(this))

        {

               TRACE0("상태 표시줄을 만들지 못했습니다.\n");

               return -1;      // 만들지 못했습니다.

        }

        m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));

 

        // TODO: 도구 모음을 도킹할 수 없게 하려면 이 세 줄을 삭제하십시오.

        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

        EnableDocking(CBRS_ALIGN_ANY);

        DockControlBar(&m_wndToolBar);

 

        CMenu Popup; //메뉴 객체 생성

        Popup.CreatePopupMenu(); //팝업 메뉴 생성

        Popup.AppendMenuW(MF_STRING, 301, _T("빨간색(&R)"));

        Popup.AppendMenuW(MF_STRING, 302, _T("초록색(&G)"));

        Popup.AppendMenuW(MF_STRING, 303, _T("파란색(&B)"));

       

        CMenu *pTopLevel = GetMenu(); //최상위 메뉴의 포인터를 얻는다

        pTopLevel->AppendMenuW(MF_POPUP, (UINT)Popup.Detach(), _T("색상(&C)"));

        return 0;

}

 

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

        if( !CFrameWnd::PreCreateWindow(cs) )

               return FALSE;

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

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

 

        cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

        cs.lpszClass = AfxRegisterWndClass(0);

        return TRUE;

}

 

// CMainFrame 진단

 

#ifdef _DEBUG

void CMainFrame::AssertValid() const

{

        CFrameWnd::AssertValid();

}

 

void CMainFrame::Dump(CDumpContext& dc) const

{

        CFrameWnd::Dump(dc);

}

#endif //_DEBUG

 

 

// CMainFrame 메시지 처리기

 

void CMainFrame::OnSetFocus(CWnd* /*pOldWnd*/)

{

        // 뷰 창으로 포커스를 이동합니다.

        m_wndView.SetFocus();

}

 

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)

{

        // 뷰에서 첫째 크랙이 해당 명령에 나타나도록 합니다.

        if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))

               return TRUE;

 

        // 그렇지 않으면 기본 처리합니다.

        return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);

}

 

void CMainFrame::OnApplicationLook(UINT id)

{

        CWaitCursor wait;

 

        theApp.m_nAppLook = id;

 

        switch (theApp.m_nAppLook)

        {

        case ID_VIEW_APPLOOK_WIN_2000:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager));

               break;

 

        case ID_VIEW_APPLOOK_OFF_XP:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP));

               break;

 

        case ID_VIEW_APPLOOK_WIN_XP:

               CMFCVisualManagerWindows::m_b3DTabsXPTheme = TRUE;

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

               break;

 

        case ID_VIEW_APPLOOK_OFF_2003:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003));

               CDockingManager::SetDockingMode(DT_SMART);

               break;

 

        case ID_VIEW_APPLOOK_VS_2005:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005));

               CDockingManager::SetDockingMode(DT_SMART);

               break;

 

        case ID_VIEW_APPLOOK_VS_2008:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008));

               CDockingManager::SetDockingMode(DT_SMART);

               break;

 

        case ID_VIEW_APPLOOK_WINDOWS_7:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows7));

               CDockingManager::SetDockingMode(DT_SMART);

               break;

 

        default:

               switch (theApp.m_nAppLook)

               {

               case ID_VIEW_APPLOOK_OFF_2007_BLUE:

                       CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);

                       break;

 

               case ID_VIEW_APPLOOK_OFF_2007_BLACK:

                       CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);

                       break;

 

               case ID_VIEW_APPLOOK_OFF_2007_SILVER:

                       CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);

                       break;

 

               case ID_VIEW_APPLOOK_OFF_2007_AQUA:

                       CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);

                       break;

               }

 

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));

               CDockingManager::SetDockingMode(DT_SMART);

        }

 

        RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);

 

}

 

void CMainFrame::OnUpdateApplicationLook(CCmdUI* pCmdUI)

{

        pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID);

}

 

void CMainFrame::OnRed()

{

        ((CChildView*)AfxGetApp())->m_color = RGB(255, 0, 0);

        Invalidate();

}

 

void CMainFrame::OnGreen()

{

        ((CChildView*)AfxGetApp())->m_color = RGB(0, 255, 0);

        Invalidate();

}

 

void CMainFrame::OnBlue()

{

        ((CChildView*)AfxGetApp())->m_color = RGB(0, 0, 255);

        Invalidate();

}


[6-5]


 

// ChildView.h: CChildView 클래스의 인터페이스

//

 

 

#pragma once

 

 

// CChildView

 

class CChildView : public CWnd

{

// 생성입니다.

public:

        CChildView();

 

// 특성입니다.

public:

// 작업입니다.

public:

// 재정의입니다.

        protected:

               BOOL On; //전원

        virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

 

// 구현입니다.

public:

        virtual ~CChildView();

 

        // 생성된 메시지 맵 함수

protected:

        afx_msg void OnPaint();

        DECLARE_MESSAGE_MAP()

public:

        afx_msg BOOL OnEraseBkgnd(CDC* pDC);

        afx_msg void OnOnoff();

};

 

// ChildView.cpp: CChildView 클래스의 구현

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

//전원 끄기 메뉴를 추가하고 이 메뉴를 누르면 클라이언트 영역이 회색으로 바뀌고

//전원 끄기 메뉴가 전원 켜기로 이름이 변경된다

//그리고 전원 켜기 메뉴를 다시 누르면 클라이언트 영역이 흰색으로 바뀌고

//전원 켜기 메뉴가 전원끄기로 이름이 변경된다.

 

#include "stdafx.h"

#include "연습문제 6-5.h"

#include "ChildView.h"

#include "MainFrm.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

 

// CChildView

 

CChildView::CChildView()

{

        On = TRUE; //전원 버튼

}

 

CChildView::~CChildView()

{

}

 

 

BEGIN_MESSAGE_MAP(CChildView, CWnd)

        ON_WM_PAINT()

        ON_WM_ERASEBKGND()

        ON_COMMAND(ID_ONOFF, &CChildView::OnOnoff)

END_MESSAGE_MAP()

 

 

 

// CChildView 메시지 처리기

 

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_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);

 

        return TRUE;

}

 

void CChildView::OnPaint()

{

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

       

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

        CFont font;

        font.CreatePointFont(300, _T("궁서"));

        dc.SelectObject(&font);

 

        CRect rect;

        GetClientRect(&rect);

        CString str = _T("메뉴 테스트");

        dc.DrawText(str, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

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

}

 

void CChildView::OnOnoff()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        CMainFrame *pFrame = (CMainFrame*)GetParent();

        if (pFrame == NULL)

               return;

 

        CMenu *pMenu = pFrame->GetMenu();

        if (pMenu == NULL)

               return;

 

        CString str;

        pMenu->GetMenuStringW(4, str, MF_BYPOSITION);

 

        if (str == _T("전원 끄기"))

        {

               pMenu->ModifyMenuW(4, MF_BYPOSITION, ID_ONOFF, _T("전원 켜기"));

               pFrame->DrawMenuBar();

 

               On = FALSE;

               Invalidate();

        }

        else

        {

               pMenu->ModifyMenuW(4, MF_BYPOSITION, ID_ONOFF, _T("전원 끄기"));

               pFrame->DrawMenuBar();

 

               On = TRUE;

               Invalidate();

        }

}

 

BOOL CChildView::OnEraseBkgnd(CDC* pDC)

{

        // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

        CRect rect;

        GetClientRect(&rect);

 

        pDC->FillSolidRect(&rect, On ? RGB(255, 255, 255) : RGB(200, 200, 200));

        return CWnd::OnEraseBkgnd(pDC);

}

 


개발환경:Visual Studio 2017


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


[6-6]

 

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

//ColorSelect 예제의 시스템 메뉴 끝에 [색상(&C)] 메뉴를 추가하고 CMainFrame 클래스에서

//WM_SYSCOMMAND 메시지를 처리하여 동작하도록 예제를 수정하시오

 

#include "stdafx.h"

#include "연습문제 6-6.h"

 

#include "MainFrm.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

// CMainFrame

 

IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)

 

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

        ON_WM_CREATE()

        ON_WM_SETFOCUS()

        ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)

        ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook)

        ON_WM_SYSCOMMAND()

END_MESSAGE_MAP()

 

static UINT indicators[] =

{

        ID_SEPARATOR,           // 상태 줄 표시기

        ID_INDICATOR_CAPS,

        ID_INDICATOR_NUM,

        ID_INDICATOR_SCRL,

};

 

// CMainFrame 생성/소멸

 

CMainFrame::CMainFrame()

{

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

}

 

CMainFrame::~CMainFrame()

{

}

 

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_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||

               !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

        {

               TRACE0("도구 모음을 만들지 못했습니다.\n");

               return -1;      // 만들지 못했습니다.

        }

 

        if (!m_wndStatusBar.Create(this))

        {

               TRACE0("상태 표시줄을 만들지 못했습니다.\n");

               return -1;      // 만들지 못했습니다.

        }

        m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));

 

        // TODO: 도구 모음을 도킹할 수 없게 하려면 이 세 줄을 삭제하십시오.

        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

        EnableDocking(CBRS_ALIGN_ANY);

        DockControlBar(&m_wndToolBar);

 

        CMenu *pSystemMenu = GetSystemMenu(FALSE);

        if (pSystemMenu != NULL)

        {

               CMenu menu;

               menu.LoadMenuW(IDR_MAINFRAME);

               CMenu *pMenu = menu.GetSubMenu(4);

 

               if (pMenu)

                       pSystemMenu->AppendMenuW(MF_STRING | MF_POPUP, (UINT)pMenu->Detach(), _T("색상(&C"));

        }

        return 0;

}

 

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

        if( !CFrameWnd::PreCreateWindow(cs) )

               return FALSE;

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

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

 

        cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

        cs.lpszClass = AfxRegisterWndClass(0);

        return TRUE;

}

 

// CMainFrame 진단

 

#ifdef _DEBUG

void CMainFrame::AssertValid() const

{

        CFrameWnd::AssertValid();

}

 

void CMainFrame::Dump(CDumpContext& dc) const

{

        CFrameWnd::Dump(dc);

}

#endif //_DEBUG

 

 

// CMainFrame 메시지 처리기

 

void CMainFrame::OnSetFocus(CWnd* /*pOldWnd*/)

{

        // 뷰 창으로 포커스를 이동합니다.

        m_wndView.SetFocus();

}

 

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)

{

        // 뷰에서 첫째 크랙이 해당 명령에 나타나도록 합니다.

        if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))

               return TRUE;

 

        // 그렇지 않으면 기본 처리합니다.

        return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);

}

 

void CMainFrame::OnApplicationLook(UINT id)

{

        CWaitCursor wait;

 

        theApp.m_nAppLook = id;

 

        switch (theApp.m_nAppLook)

        {

        case ID_VIEW_APPLOOK_WIN_2000:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager));

               break;

 

        case ID_VIEW_APPLOOK_OFF_XP:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP));

               break;

 

        case ID_VIEW_APPLOOK_WIN_XP:

               CMFCVisualManagerWindows::m_b3DTabsXPTheme = TRUE;

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

               break;

 

        case ID_VIEW_APPLOOK_OFF_2003:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003));

               CDockingManager::SetDockingMode(DT_SMART);

               break;

 

        case ID_VIEW_APPLOOK_VS_2005:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005));

               CDockingManager::SetDockingMode(DT_SMART);

               break;

 

        case ID_VIEW_APPLOOK_VS_2008:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008));

               CDockingManager::SetDockingMode(DT_SMART);

               break;

 

        case ID_VIEW_APPLOOK_WINDOWS_7:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows7));

               CDockingManager::SetDockingMode(DT_SMART);

               break;

 

        default:

               switch (theApp.m_nAppLook)

               {

               case ID_VIEW_APPLOOK_OFF_2007_BLUE:

                       CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);

                       break;

 

               case ID_VIEW_APPLOOK_OFF_2007_BLACK:

                       CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);

                       break;

 

               case ID_VIEW_APPLOOK_OFF_2007_SILVER:

                       CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);

                       break;

 

               case ID_VIEW_APPLOOK_OFF_2007_AQUA:

                       CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);

                       break;

               }

 

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));

               CDockingManager::SetDockingMode(DT_SMART);

        }

 

        RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);

 

}

 

void CMainFrame::OnUpdateApplicationLook(CCmdUI* pCmdUI)

{

        pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID);

}

 

 

 

void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)

{

        // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

        switch (nID)

        {

        case ID_COLOR_RED:

        case ID_COLOR_GREEN:

        case ID_COLOR_BLUE:

               m_wndView.OnCmdMsg(nID, 0, NULL, NULL); //시스템 메뉴로 전달된 색상 메뉴 처리

               return;

        }

        CFrameWnd::OnSysCommand(nID, lParam);

}

 


[6-7]

 


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

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

//IDR_MENU_COLOR 메뉴 리소스를 생성하고 IDR_MAINFRAME 메뉴 리소스의 [색상(&C)] 팝업 메뉴를

//IDR_MENU_COLOR(2017 버전에서는 리소스 이름 수정이 안되는 것 같아 IDR_MENU1으로 했습니다)

//메뉴 리소스를 이용하여 메인 메뉴에 [색상(&C)] 메뉴를 동적으로 추가하고, 컨텍스트 메뉴도 IDR_MENU1

//메뉴 리소스를 사용한다

 

#include "stdafx.h"

#include "연습문제 6-7.h"

 

#include "MainFrm.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

// CMainFrame

 

IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)

 

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

        ON_WM_CREATE()

        ON_WM_SETFOCUS()

        ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)

        ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook)

END_MESSAGE_MAP()

 

static UINT indicators[] =

{

        ID_SEPARATOR,           // 상태 줄 표시기

        ID_INDICATOR_CAPS,

        ID_INDICATOR_NUM,

        ID_INDICATOR_SCRL,

};

 

// CMainFrame 생성/소멸

 

CMainFrame::CMainFrame()

{

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

}

 

CMainFrame::~CMainFrame()

{

}

 

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_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||

               !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

        {

               TRACE0("도구 모음을 만들지 못했습니다.\n");

               return -1;      // 만들지 못했습니다.

        }

 

        if (!m_wndStatusBar.Create(this))

        {

               TRACE0("상태 표시줄을 만들지 못했습니다.\n");

               return -1;      // 만들지 못했습니다.

        }

        m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));

 

        // TODO: 도구 모음을 도킹할 수 없게 하려면 이 세 줄을 삭제하십시오.

        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

        EnableDocking(CBRS_ALIGN_ANY);

        DockControlBar(&m_wndToolBar);

 

        CMenu *pMenu = GetMenu();

        if (pMenu)

        {

               menu.LoadMenuW(IDR_MENU1);

               CMenu *pSubMenu = menu.GetSubMenu(0);

 

               if (pSubMenu)

                       pMenu->AppendMenuW(MF_STRING | MF_POPUP, (UINT)pSubMenu->Detach(), _T("색상(&C)"));

        }

        return 0;

}

 

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

        if( !CFrameWnd::PreCreateWindow(cs) )

               return FALSE;

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

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

 

        cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

        cs.lpszClass = AfxRegisterWndClass(0);

        return TRUE;

}

 

// CMainFrame 진단

 

#ifdef _DEBUG

void CMainFrame::AssertValid() const

{

        CFrameWnd::AssertValid();

}

 

void CMainFrame::Dump(CDumpContext& dc) const

{

        CFrameWnd::Dump(dc);

}

#endif //_DEBUG

 

 

// CMainFrame 메시지 처리기

 

void CMainFrame::OnSetFocus(CWnd* /*pOldWnd*/)

{

        // 뷰 창으로 포커스를 이동합니다.

        m_wndView.SetFocus();

}

 

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)

{

        // 뷰에서 첫째 크랙이 해당 명령에 나타나도록 합니다.

        if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))

               return TRUE;

 

        // 그렇지 않으면 기본 처리합니다.

        return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);

}

 

void CMainFrame::OnApplicationLook(UINT id)

{

        CWaitCursor wait;

 

        theApp.m_nAppLook = id;

 

        switch (theApp.m_nAppLook)

        {

        case ID_VIEW_APPLOOK_WIN_2000:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager));

               break;

 

        case ID_VIEW_APPLOOK_OFF_XP:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP));

               break;

 

        case ID_VIEW_APPLOOK_WIN_XP:

               CMFCVisualManagerWindows::m_b3DTabsXPTheme = TRUE;

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));

               break;

 

        case ID_VIEW_APPLOOK_OFF_2003:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003));

               CDockingManager::SetDockingMode(DT_SMART);

               break;

 

        case ID_VIEW_APPLOOK_VS_2005:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005));

               CDockingManager::SetDockingMode(DT_SMART);

               break;

 

        case ID_VIEW_APPLOOK_VS_2008:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008));

               CDockingManager::SetDockingMode(DT_SMART);

               break;

 

        case ID_VIEW_APPLOOK_WINDOWS_7:

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows7));

               CDockingManager::SetDockingMode(DT_SMART);

               break;

 

        default:

               switch (theApp.m_nAppLook)

               {

               case ID_VIEW_APPLOOK_OFF_2007_BLUE:

                       CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);

                       break;

 

               case ID_VIEW_APPLOOK_OFF_2007_BLACK:

                       CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);

                       break;

 

               case ID_VIEW_APPLOOK_OFF_2007_SILVER:

                       CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);

                       break;

 

               case ID_VIEW_APPLOOK_OFF_2007_AQUA:

                       CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);

                       break;

               }

 

               CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));

               CDockingManager::SetDockingMode(DT_SMART);

        }

 

        RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);

 

}

 

void CMainFrame::OnUpdateApplicationLook(CCmdUI* pCmdUI)

{

        pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID);

}

 

  

// ChildView.cpp: CChildView 클래스의 구현

//

 

#include "stdafx.h"

#include "연습문제 6-7.h"

#include "ChildView.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

 

// CChildView

 

CChildView::CChildView()

{

        m_color = RGB(255, 0, 0);

}

 

CChildView::~CChildView()

{

}

 

 

BEGIN_MESSAGE_MAP(CChildView, CWnd)

        ON_WM_PAINT()

        ON_COMMAND(ID_COLOR_RED, &CChildView::OnColorRed)

        ON_UPDATE_COMMAND_UI(ID_COLOR_RED, &CChildView::OnUpdateColorRed)

        ON_COMMAND(ID_COLOR_GREEN, &CChildView::OnColorGreen)

        ON_UPDATE_COMMAND_UI(ID_COLOR_GREEN, &CChildView::OnUpdateColorGreen)

        ON_COMMAND(ID_COLOR_BLUE, &CChildView::OnColorBlue)

        ON_UPDATE_COMMAND_UI(ID_COLOR_BLUE, &CChildView::OnUpdateColorBlue)

        ON_WM_CONTEXTMENU()

END_MESSAGE_MAP()

 

 

 

// CChildView 메시지 처리기

 

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_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);

 

        return TRUE;

}

 

void CChildView::OnPaint()

{

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

       

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

        CFont font;

        font.CreatePointFont(300, _T("궁서"));

        dc.SelectObject(&font);

        dc.SetTextColor(m_color);

       

        CRect rect;

        GetClientRect(&rect);

        CString str = _T("메뉴 테스트");

        dc.DrawText(str, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

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

}

 

 

 

void CChildView::OnColorRed()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_color = RGB(255, 0, 0);

        Invalidate();

}

 

 

void CChildView::OnUpdateColorRed(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_color == RGB(255, 0, 0));

}

 

 

void CChildView::OnColorGreen()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_color = RGB(0, 255, 0);

        Invalidate();

}

 

 

void CChildView::OnUpdateColorGreen(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_color == RGB(0, 255, 0));

}

 

 

void CChildView::OnColorBlue()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_color = RGB(0, 0, 255);

        Invalidate();

}

 

 

void CChildView::OnUpdateColorBlue(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetCheck(m_color == RGB(0, 0, 255));

}

 

 

void CChildView::OnContextMenu(CWnd* /*pWnd*/, CPoint point)

{

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

        CMenu menu;

        menu.LoadMenuW(IDR_MENU1);

        CMenu *pMenu = menu.GetSubMenu(0);

        pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, AfxGetMainWnd());

}

 


[6-8]

 

// ChildView.cpp: CChildView 클래스의 구현

//

 

#include "stdafx.h"

#include "연습문제 6-8.h"

#include "ChildView.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

 

// CChildView

 

CChildView::CChildView()

{

        m_color = RGB(255, 0, 0);

}

 

CChildView::~CChildView()

{

}

 

 

BEGIN_MESSAGE_MAP(CChildView, CWnd)

        ON_WM_PAINT()

        ON_COMMAND(ID_COLOR_RED, &CChildView::OnColorRed)

        ON_UPDATE_COMMAND_UI(ID_COLOR_RED, &CChildView::OnUpdateColorRed)

        ON_COMMAND(ID_COLOR_GREEN, &CChildView::OnColorGreen)

        ON_UPDATE_COMMAND_UI(ID_COLOR_GREEN, &CChildView::OnUpdateColorGreen)

        ON_COMMAND(ID_COLOR_BLUE, &CChildView::OnColorBlue)

        ON_UPDATE_COMMAND_UI(ID_COLOR_BLUE, &CChildView::OnUpdateColorBlue)

        ON_WM_CONTEXTMENU()

END_MESSAGE_MAP()

 

 

 

// CChildView 메시지 처리기

 

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_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);

 

        return TRUE;

}

 

void CChildView::OnPaint()

{

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

       

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

        CFont font;

        font.CreatePointFont(300, _T("궁서"));

        dc.SelectObject(&font);

        dc.SetTextColor(m_color);

 

        CRect rect;

        GetClientRect(&rect);

        CString str = _T("메뉴 테스트");

        dc.DrawText(str, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

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

}

 

 

 

void CChildView::OnColorRed()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_color = RGB(255, 0, 0);

        Invalidate();

}

 

 

void CChildView::OnUpdateColorRed(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetRadio(m_color == RGB(255, 0, 0));

        pCmdUI->Enable(m_color != RGB(255, 0, 0));

}

 

 

void CChildView::OnColorGreen()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_color = RGB(0, 255, 0);

        Invalidate();

}

 

 

void CChildView::OnUpdateColorGreen(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetRadio(m_color == RGB(0, 255, 0));

        pCmdUI->Enable(m_color != RGB(0, 255, 0));

}

 

 

void CChildView::OnColorBlue()

{

        // TODO: 여기에 명령 처리기 코드를 추가합니다.

        m_color = RGB(0, 0, 255);

        Invalidate();

}

 

 

void CChildView::OnUpdateColorBlue(CCmdUI *pCmdUI)

{

        // TODO: 여기에 명령 업데이트 UI 처리기 코드를 추가합니다.

        pCmdUI->SetRadio(m_color == RGB(0, 0, 255));

        pCmdUI->Enable(m_color != RGB(0, 0, 255));

}

 

 

void CChildView::OnContextMenu(CWnd* /*pWnd*/, CPoint point)

{

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

        CMenu menu;

        menu.LoadMenuW(IDR_MAINFRAME);

        CMenu *pMenu = menu.GetSubMenu(4);

        pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, AfxGetMainWnd());

}

 


개발환경:Visual Studio 2017


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


*5번 문제 같은 경우 클라이언트 전체가 색깔이 변해야하는데 텍스트 배경만 변합니다. 이유를 아시는 분은 댓글 남겨주시면 감사하겠습니다!


반응형