관리 메뉴

ComputerVision Jack

[MFC - Chapter5 연습 문제] 본문

Image Processing/MFC Programming

[MFC - Chapter5 연습 문제]

JackYoon 2020. 9. 22. 16:04
반응형

1. DrawCircles 예제를 윈도우가 크기 변경이나 최소화 상태에서 복원되어 다시 그려져도 타원이 모두 나타나도록 수정하시오. 단, 정보는 CList 클래스를 이용하여 보관한다.

연습 문제 1번

CList<CRect, RECT&> 클래스를 이용하여 원을 그린 후, 해당 정보를 list.AddTail(rect); 를 이용해 추가한 후,

CPaintDC에서 POSITION pos를 이용하여 출력하면 된다.

 

2. DrawCircles 예제를 수정하여, 마우스 왼쪽 버튼을 사용하면 빨간색, 마우스 오른쪽 버튼을 사용하면 파란색으로 원을 그리도록 수정하시오. 단, 마우스 오른쪽 버튼에도 마우스 캡처를 적용한다.

연습 문제 2번

COLORREF 클래스를 이용하여 RGB 값을 보관한 후, CPen pen(PS_SOLID, 2, color); 를 이용하여 각각 마우스 이벤트가 발생했을 때, color 값을 변경하여 출력하면 된다.

 

3. DrawCircles 예제를 R 을 누르면 빨간색, G를 누르면 초록색, B 를 누르면 파란색으로 원을 그리도록 수정하시오. 단, WM_KEYDOWN 메시지를 처리하여 색상 모드를 전환하고, 기본 색상은 빨간색으로 설정한다.

연습 문제 3번

void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 이벤트 처리기 안에

nChar 값을 통해 color 값을 각각 RGB(255, 0, 0), RGB(0, 255, 0), RGB(0, 0, 255)로 변경하면 된다.

그리고 CPen을 이용해 그리면 완료된다.

 

4. DrawCircles 예제를 클릭한 마우스 왼쪽 버튼을 놓을 때 Shift 를 누른 상태이면 타원이 아닌 원을 그리도록 수정하시오. 단, 원을 그릴 영역에서 가로, 세로 길이 중 짧은 길이를 원 지름으로 하고, 마우스가 움직일 때 그렸던 타원은 지워야한다.

연습 문제 4번

void CChildView::OnLButtonUp(UINT nFlags, CPoint point)

이벤트 처리함수에서 GetKeyState(VK_SHIFT) 함수를 이용해 키 상태를 받아온다.

다음 (m_x2 - m_x1 < m_y2 - my1) 을 비교하여 짧은 쪽을 지름으로 하는 원을 그리면된다.

dc.Ellipse(m_x1, m_Y1, m_x2, m_y1 + (m_x2 - m_x1));

 

5. DrawCircle 예제를 클릭한 마우스 왼쪽 버튼을 놓을 때 Ctrl 을 누른 상태이면 파란색으로 채워진 타원을 그리도록 수정하시오.

연습 문제 5번

void CChildView::OnLButtonUp(UINT nFlags, CPoint point)

이벤트 처리함수 안에 마찬가지로 GetKeyState(VK_CONTROL) 함수를 이용해 키 상태를 받아온다.

다음 CBrush brush(RGB(0, 0, 255))를 통해 브러쉬를 선택하고 그리면 된다.

 

6. DrawCircle 예제에 Delete를 누르면 먼저 그려진 타원부터 하나씩 제거하는 기능을 구현하시오. 단, 윈도우가 크기 변경이나 최소화 상태에서 복원되어 다시 그려져도 타원은 사라지지 않고, 정보는 CList 클래스를 이용해 보관한다.

연습 문제 6번 제거 전
연습 문제 6번 제거 후

void CChildView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 이벤트 처리함수에서 

if (nChar == VK_BACK) 이면 pos = list.GetTailPosition() 함수를 이용하여 마지막 원의 정보를 가져온 후,

list.RemoveAt(pos)를 통해 지워주면 된다.

 

7. DrawCircles 예제에 Insert를 누르면 최종적으로 그려진 타원과 켭치지 않는 새로운 타원이 하나 추가되도록 구현하시오. 단, 윈도우가 크기 변경이나 최소화 상태에서 복원되어 다시 그려져도 타원은 사라지지 않고, 정보는 CList 클래스를 이용해 보관한다.

연습 문제 7번

void CChildView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 이벤트 처리함수에서 

if (nChar == VK_INSERT) 이면 pos = list.AddTail(rect)을 이용하여 복사해서 추가한다.

 

8. DrawCircle 예제를 마우스로 자유 곡선을 그리는 기능으로 수정하시오. 마우스 왼쪽 버튼을 누르고 드래그하면 마우스 커서 움직임에 따라 선이 그려지고, 눌렸던 버튼을 놓으면 선이 끝난다. 단, 자유 곡선은 하나만 그릴 수 있고, 윈도우가 크기 변경이나 최소화 상태에서 복원되어 다시 그려져도 곡선은 사라지지 않고, 정보는 CList 클래스를 이용해 보관한다.

연습 문제 8번

void CChildView::OnLButtonUp(UINT nFlags, CPoint point) 이벤트 처리 함수에서 point 정보를 따로 CPoint 클래스에 저장한다.

void CChildView::OnMouseMove(UINT nFlags, CPoint point)에서 dc.MoveTo(ptr); dc.LineTo(point);를 이용하고 그 정보를 list.AddHead(ptr); 통해 리스트에 저장하고 해당 point 값을 다시 ptr에 대입한다.

 

9. DrawCircles 예제를 다음과 같이 수정하시오. 클라이언트 영역에 출력된 타원 크기가 Ctrl + space bar + 마우스 왼쪽 버튼 클릭이면 단계적으로 확대하고, Alt + space bar + 마우스 왼쪽 버튼 클릭이면 단계적으로 축소한다. 단, 윈도우가 크기 변경이나 최소화 상태에서 복원되어 다시 그려져도 타원은 사라지지 않고, 정보는 CList 클래스를 이용해 보관한다. -> 해당 문제는 다시 푸는데로 업로드 하겠습니다..

 

10. DisableCloseButton 예제를 수정하여, 다음 그림처럼 타이틀바 <종료> 버튼에 마우스 커서를 가져가면 마우스 커서를 윈도우에서 기본으로 제공하는 금지 모양(IDC_NO)으로 변경하시오.

연습 문제 10번

void CMainFrame::OnNcMouseMove(UINT nFlags, CPoint point) 이벤트 처리 함수에서 nHitTest == HTCLOSE

SetCursor(AfxGetApp() -> LoadStandardCursor(IDC_NO)); 적용한다.

 

11. DisableCloseButton 예제를 타이틀바를 더블 클릭하면 윈도우가 최소화 되도록 수정하시오.

연습 문제 11번

voidCMainFrame::OnNcLButtonDblClk(UINTnFlags,CPointpoint) 이벤트 처리 함수에서 nHitTest == HTCAPTION이면 ShowWindow(SW_MINIMIZE); 를 적용한다.

 

12. DisableCloseButton 예제를 수정하여, 타이틀 바를 더블 클릭하면 다음 그림과 같이 '윈도우를 최대화 하시겠습니까?'를 묻는 메시지 박스가 나타나도록 하시오. 여기서<확인> 버튼을 클릭하면 보통대로 윈도우가 최대화되고<취소>버튼을 클릭하면 아무 변화도 없도록 하시오.

연습 문제 12번

voidCMainFrame::OnNcLButtonDblClk(UINTnFlags,CPointpoint) 이벤트 처리 함수에서 

if(MessageBox(_T("윈도우를 최대화 하시겠습니까?"), _T("테스트"), MB_OKCANCEL) == IDOK)에 따라

ShowWindow(SW_MAXIMIZE);를 적용하면 된다.

 

13. ChangeCursor 예제를 마우스 커서가 클라이언트 영역에 진입하면 타원이 마우스 커서를 따라 다니도록 수정하시오.

연습 문제 13번

OnSetCursor() 이벤트처리 함수를 통해 처리 flag를 변경하고

void CChildView::OnMouseMove(UINT nFlags, CPoint point) 이벤트 처리 함수에서 flag 정보를 토대로 (PtInRegion(point)를 통해 flag 변경) 그 값을 리스트에 저장한다.

 

14. ChangeCursor 예제를 수정하여, 마우스 커서가 타원 위에 올라갔을 때, 그림처럼 마우스 커서를 윈도우에서 기본으로 제공하는 손 모양(IDC_HAND)으로 변경하시오.

연습 문제 14번

BOOL CChildView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 이벤트 처리 함수에서 

CRgn 클래스를 이용하여 지역을 설정하고 rgn.PtInRegion(point) 함수를 이용해 영역 내에 존재하는지 파악하여

::SetCursor(AfxGetApp() ->LoadStandardCursor(IDC_HAND)를 적용하면 된다.

 

15. ChangeCursor 예제를 수정하여, 마우스 커서가 타원 위에 올라갔을 때 마우스 왼쪽 버튼을 누르고 드래그 하면 타원이 이동하고 버튼을 놓으면 멈추도록 하시오.

연습 문제 15번

DrawFlag를 이용하여 문제를 해결할 수 있다.

void CChildView::OnLButtonUp(UINT nFlags, CPoint point) 이벤트 처리 함수에서 버튼이 올라오면

CPoint 클래스내에 해당 point 값을 저장한다.

다음 OnPaint() 함수에서 DrawFlag를 체크해 해당 내용을 출력하면 된다.

 

16. ChangeCursor 예제를 다음과 같이 수정하시오. 마우스 커서가 타원 위에 올라갔을 때 마우스 왼쪽 버튼을 누르면 점선으로 된 타원이 새롭게 그려진다. 이 타원은 마우스 드래그에 따라 이동하다가 버튼을 놓으면 이동을 끝낸다. 마우스 버튼을 놓을 때 Ctrl 을 누른 상태면 복사를 수행하고, 그렇지 않은 상태에서는 이동을 수행한다. 단, 윈도우 크긱 변경이나 최소화 상태에서 복원 되어 다시 그려져도 타원이 모두 나타나고, CList 클래스를 이용하여 정보를 보관한다. 또한 마우스 커서가 임의 타원 위에 올라갔을 때 마우스 커서 변경도 반영되어야 한다.

연습 문제 16번

이 문제의 핵심은 BOOL contorl_flag에 있다. OnKeyDown을 통해 VK_CONTROL 이면 FLAG를 TRUE로 변경한다.

OnLButtonUp에서 FLAGTRUE면 그냥 list.AddTail(CRect(m_x1, m_y1, m_x2, m_y2));를 실행하고

FALSE이면 list.RemoveAll();을 통해 리스트를 비우고 다시 추가한다.

 

17. TrackMouse 예제를 수정하여, 마우스가 클라이언트 영역에 있으면 클라이언트 배경을 노란색으로 출력하고, 클라이언트 영역 밖에 있으면 흰색으로 출력하시오. 단, 윈도우 크기를 640 X 480으로 고정한다.

연습 문제 17번

void CChildView::OnMouseMove(UINT nFlags, CPoint point) 이벤트 처리 함수에서 m_bMouseIn flag에 의해 

CClientDC를 생성하고 dc.FillSolidRect(&rect, RGB(255, 255, 0));을 적용한다.

void CChildView::OnMouseLeave() 이벤트에선 dc.FillSolidRect(&rect, RGB(255, 255, 255));를 적용하면 된다.

 

18. TrackMouse 예제를 마우스 커서가 비클라이언트 영역에 있으면 640 x 480, 외부에 있으면 1020 x 768 크기로 조절하시오.

연습 문제 18번

void CChildView::OnMouseMove(UINT nFlags, CPoint point) 이벤트 처리 함수에서 TRACKMOUSEEVENT tme; 객체를 선언하고, CWnd* pMainWnd = AfxGetMainWnd() 메인 프레임 정보를 받아온다.

pMainWnd->GetWindowRect(&rect); 클라이언트 사각형 영역의 값을 받아오고, rect.right = rect.left + 640;

rect.bottom = rect.top + 480을 적용하고 나머지는 void CChildView::OnMouseLeave() 이벤트 처리기에 적용한다.

 

19. ShowCaret 예제를 수정하여 방향키를 사용하여 캐럿이 상하좌우로 이동할 수 있도록 수정하시오. 단, 클라이언트 영역 안에서만 이동을 할 수 있도록 하되 캐럿 크기가 20임을 감안한다. 아울러 포커스를 잃었다가 다시 가질 때도 캐럿 본래 위치를 유지하도록 한다.

연습 문제 19번

CPoint 클래스를 통해 캐럿의 위치를 선언하고 

void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 이벤트 처리에서 switch문을 사용하여

nChar 값에 따라 캐럿의 위치를 수정하면 된다.

 

20. InputKeyStroke 예제를 Ctrol이 누른 상태로 방향키를 누르면 도형이 2배 느리게 이동하도록 수정하시오.

연습 문제 20번

void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 이벤트 처리에서

GetKeyState(VK_CONTROL) 통해 키상태를 우선 받아온다. 그다음 CTime 클래스를 이용하여

SetTimer(0, 20000, NULL);통해 타이머를 설정한다.

 

21. InputKeyStrok 예제를 Shift를 누른 상태로 방향키를 누르면 도형이 방향키와 반대 방향으로 이동하도록 수정하시오.

연습 문제 21번

void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 이벤트 처리에서

GetKeyState(VK_SHIFT) 통해 switch문 내에서 if문 처리를 하면 해결할 수 있다.

 

22. InputKeyStroke 예제를 수정하여, 방향키를 눌러 도형이 이동한 중심 궤적을 화면에 회색 점선(PS_DOT, RGB(128, 128, 128)) 으로 출력하시오. 단, 윈도우가 크기 변경이나 최소화 상태에서 복원되어 다시 그려져도 점선은 모드 나타나고, CList 클래스를 이용하여 정보를 보관한다. 아울러 보관한 궤적은 space를 누를 때 마다 초기화 한다.

 

연습 문제 22번

OnkeyDown에서 해당 pos 값을 리스트에 추가한다. 그 다음 OnPaint() 함수에서 CPen pen을 문제에서 같이 생성하고 

POSITION pos = clist.GetHeadPosition();

while(pos != NULL){

    CPoint point = clist.GetNext(pos);

    dc.LineTo(point.x, point.y);

}를 통해 그려준다.

 

23. InputCharacter 예제를 수정하여 TAB을 입력할 때 공백이 4칸 입력되도록 수정하시오. 단, Back space를 누르면 공백 4칸은 한꺼번에 삭제되도록 한다.

연습 문제 23번

void CChildView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 이벤트 처리함수 내에서 

nChar == _T('\t') 면 m_str.Add('\0') 공백 문자를 추가한다. 지울 땐, flag과 \0문자를 체크해서

m_str.GetSize() -4 통해 지우면 된다.

 

24. InputCharacter 예제를 클라이언트 영역에 글자를 입력하는 부분에 캐럿을 표시하도록 수정하시오.

단, 글자는 한줄만 입력할 수 있고, 클자를 입력할 때마다 캐럿이 따라간다.

연습 문제 24번

void CChildView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 이벤트 처리함수 내에서 

문자열이 증가 할때 마다 SetCaretPos(CPoint)를 통해 caret의 위치를 조정하여 문제를 해결할 수 있다

반응형

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

[MFC - 사용자 인터페이스]  (0) 2020.10.28
[MFC - 마우스와 키보드]  (1) 2020.09.15
[MFC - Chapter4 연습문제]  (1) 2020.09.14
[MFC - 화면 출력]  (0) 2020.08.18
[MFC - Chapter3 연습 문제]  (0) 2020.08.17
Comments