관리 메뉴

ComputerVision Jack

[MFC - Chapter3 연습 문제] 본문

Image Processing/MFC Programming

[MFC - Chapter3 연습 문제]

JackYoon 2020. 8. 17. 21:56
반응형

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

Simple 예제
String Table표 관리
문제1 결과 화면

Resource에 접근하여 IDR_MAINFRAME 캡션을 문제에서 정의한 값으로 변경하면 완료된다.

 

2. 마우스 커서가 다음과 같이 윈도우에서 기본으로 제공하는 손 아이콘(IDC_HAND)으로 변경되도록 Simple예제를 수정하시오.

마우스 커서 변경

마우스 자체는 캡쳐가 되지 않기에 직접 구현해본다면 마우스 커서가 변경되는 것을 확인할 수 있다.

우선 View 영역에 대한 출력과 관련되기 때문에 ChildView.cpp에서 처리해야합니다.

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) { } 에 접근하여

cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW | CS VREDRAW | CS_DBLCLKS,

        ::LoadCursor(nullptr, IDC_HAND), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), nullptr);

LoadCursor() 인자를 IDC_HAND로 변경하면 된다.

 

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

스크롤바 추가하기

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) { } 에 접근하여 CREATESTRUCT::style 변수를 조작하면 된다. cs.style |= WS_HSCROLL | WS_VSCROLL;

( &= 제거와 관련된 연산을 수행하는 연산자이고 |= 추가와 관련된 연산을 수행하는 연산자입니다.) - 논리로 생각

 

4. Simple 예제를 수정하여, 다음과 같은 위도우 타이틀 내 시스템 메뉴가 나타나지 않도록 하시오.

시스템 메뉴 나타나지 않게 하기

프레임과 관련되어 스타일을 조작해야하기 때문에 CMainFrame()에 접근해야합니다.

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { } 에 접근하여 CREATESTRUCT::style 변수를 조작하면 된다. cs.style &= ~WS_SYSMENU;

 

5. Simple 예제에서, 다음과 같이 윈도우 타이틀 내 최소화 버튼과 최대화 버튼이 없이 종료 버튼만 남아있도록 수정하시오.

문제 5번 결과

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { } 에 접근하여 CREATESTRUCT::style 변수를 조작하면 된다. cs.style &= ~WS_MINIMIZEBOX & ~WS_MAXIMIZEBOX;

 

6. 윈도우 왼쪽 상단 위치가 (100, 200) 화면 좌표에서 실행되도록 Simple 예제를 수정하시오.

윈도우 좌표 

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { } 에 접근하여 CREATESTRUCT 구조체 변수를 이용하면 쉽게 해결할 수 있다. cs.x = 100; cs.y = 200; 

 

7. 폭이 1024, 너비가 768인 윈도우로 실행되도록 Simple 예제를 수정하시오.

윈도우 크기로

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { } 에 접근하여 CREATESTRUCT 구조체 변수를 이용하면 쉽게 해결할 수 있다. cs.cx = 100; cs.cy = 200;

 

8. 기존 윈도우 대신 다음과 같은 타이틀바가 있는 팝업 윈도우를 생성하도록 Simple예제를 수정하시오.

팝업 윈도우

우선 팝업 윈도우를 생성할 땐, 위치와 크기 지정이 필요하다.

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { } 에 접근하여 위치와 크기를 설정하고 CREATESTRUCT style을 설정하여 해결한다.

cs.cx = 100; cs.cy = 200;

cs.style |= WS_POPUPWINDOW | WS_CATION | WS_OVERLAPPEDWINDOW;

 

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

최상위 윈도우로 실행하기

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { } 에 접근하여 CREATESTRUCT::dwExStyle 변수를 설정하면 된다. cs.dwExStyle |= WS_EX_TOPMOST;

 

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

최소화 모드 실행

응용어플리케이션 관점에서 설장하기 때문에 CSimpleApp::InitInstance() 함수내에서 CWnd::ShowWindow() 함수 인자를 설정한다. CFrameWnd* pFrame = new CMainFrame;

m_pMainWnd = pFrame; // 프로임을 만들어 리소스와 함께 로드합니다.

pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, nullptr, nullptr);

pFrame->ShowWindow(SW_SHOWMINIMIZED);

 

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

최대화 실행

pFrame->ShowWindow(SW_SHOWMAXIMIZED);

 

12. Simple 예제에서, '안녕하세요' 문구 대신 실행 파일 이름을 화면에 출력하도록 수정하시오.

문제 12번 답

화면 출력과 관련된 View 작업이기 때문에 ChildView.cpp에서 작업을 실행한다.

void CChildView::OnPaint(){

    CPaintDC dc(this);

    CWinApp* cwa = AfxGetApp(); //앱 정보를 받아온다.

    dc.TextOutW(50, 50, cwa->m_pszExeName);

}

 

13. Simple 예제에서 '안녕하세요' 문구 대신 실행할 때 입력된 명령행 인자를 화면에 출력하도록 수정하시오.

문제 13번 답

void CChildView::OnPaint(){

    CPaintDC dc(this);

    CWinApp* cwa = AfxGetApp(); //앱 정보를 받아온다.

    dc.TextOutW(50, 50, cwa->m_lpCmdLine);

}

 

14. Simple 예제에서 '안녕하세요' 문구 대신 CMainFrame 윈도우 타이틀을 화면에 출력하도록 수정하시오.

문제 14번 답

void CChildView::OnPaint(){

    CPaintDC dc(this);

    CWnd * cw = AfxGetMainWnd(); //프레임 정보를 받아온다.

    CString titile;

    cw -> GetWindowTextW(title);

    dc.TextOutW(50, 50, title);

}

 

15. CSimpleApp::InitInstance() 함수에서 CMainFrame 객체를 생성할 때, new 연산자 대신 CRuntimeClass::CreateObject() 함수로 생성하도록 Simple 예제를 수정하시오.

우선 MainFrame.h 에서 DECLARE_DYNCREATE(CMainFrame) 으로 변경시킨다.

그 다음 MainFrame.cpp 에서 IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd); 로 변경시킨다.

객체 생성

Simple.cpp의 CSimpleApp::InitInstance() 에서 CRuntimeClass::CreateObject() 함수로 생성한다.

 

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

문제 16번 정답

프로그램이 종료할 때, Simple.cpp에서 CSimpleApp::ExitInstance 부분에 메시지 박스를 처리해주면 된다.

int CSimpleApp::ExitInstance() {

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

    return CWinApp::ExitInstance();

}

 

17. 프로그램을 종료할 때 윈도우 크기와 위치 정보를 보관해 두었다가 다시 실행할 때 그 크기와 위치가 복원 되도록 Simple 예제를 수정하시오. 단 정보는 레지스트에 보관한다.

정보 복원

CMainFrame::PreCreateWindow(CREATESTRUCT& cs)에 CWinApp::GetProfileInt() 함수를 통해 레지스트 값을 가져온다.

정보 저장

윈도우를 종료하면 그 당시 윈도우의 위치에 관한 정보를 레지스터에 저장한다.

반응형

'Image Processing > MFC Programming' 카테고리의 다른 글

[MFC - Chapter4 연습문제]  (1) 2020.09.14
[MFC - 화면 출력]  (0) 2020.08.18
[MFC - MFC 프로그램 구조]  (0) 2020.08.17
[MFC - Chater2 연습 문제]  (2) 2020.08.06
[MFC - MFC 기초 클래스]  (0) 2020.08.05
Comments