본문 바로가기

Language/MFC

MDI 분할 스크롤뷰, 스크롤 동기화

엄청난 검색을 한 결과...약간의 실마리만 잡아서 하다하다.... 매우 심플한 방법을...


MDI에서 Child 를 스크롤 뷰로 한뒤 두개의 스크롤 뷰를 분할 하였다. 

영상처리에서 Before, After 를 좀 멋지게 보려고 시도해본 짓거리가 이렇게 힘들줄은...(아니 내가 이렇게 못할 줄...은 알았지만;;)





보통 분할 후 머 위 그림과 같이 나오게 된다. 

문제는 스크롤 바가 따로따로 구성이 되어 있기 때문에 각각의 스크롤을 사용자가 직접 해줄 수 있다는 장점이 있지만 영상처리에서 이런 뷰를 구성하는 이유는 같은 이미지를 비교하기 위해서 이므로 스크롤바가 동일하게 동작하는 것을 원한다. 


winapi 홈페이지 (http://www.winapi.co.kr/project/dangeun/dg2/22-1.htm) 에서 스크롤 사용금지 속성을 주는 부분이 있는데 어떻게 하면 컨트롤에 있는 스크롤이 아닌 스크롤 속성을 받은 뷰의 속성을 변경할지 몰라서 매우 고민은 했다. 


역시 내가 멍청했지만;;; 매우 간단하게 


스크롤을 고정 하고 싶은 View의 OnInitialUpdate() 함수에 EnableScrollBar 함수를 이용하여 속성을 정의 한다.

  EnableScrollBar(SB_HORZ, SB_CTL | ESB_DISABLE_BOTH );

  EnableScrollBar(SB_VERT, SB_CTL | ESB_DISABLE_BOTH );


이 코드를 작성 한 후 실행하게 되면 다음과 같은 모양으로 나온다. 




이렇게 되면 잠기기만 하지 이동 자체가 되지 않는데...winapi 에서 참고한 내용은 스크롤 속성을 직접 주어 매인 스크롤을 이용하여 컨트롤 하는 방법이였다. 하지만 이건 winapi가 아닌 MFC 이다....ㅡㅡ 한참을 고민하고 스크롤에 관련된 함수를 찾다가 문득 드는 생각이 (직접 실험 해보니...) 스크롤을 움직일때 OnScroll 함수가 호출되니 이 속성을 그대로 가져가면?


맞다. 그대로 가져가면 된다. 


예전에 MFC 함수를 강제로 호출하려다 에러가 나는 경험이 있어서 왠만하면 오버라이딩 된 함수 즉, API 함수는 내가 직접 하지 않고 내부적으로 돌려서 호출하는 것이 올바른거라 생각하고 사용했는데 그냥 해볼까? 하는 맘에 컴파일 하니 에러 0


스슬 짜증 나기 시작하면서 실행 하니 된다....


CClassDoc* pDoc = GetDocument();



POSITION pos = pDoc->GetFirstViewPosition();

pDoc->GetNextView(pos);

//CScrollView2 는 임의로 만든 이름이다. 분할을 하였기 때문에 두번 째 View이다. 

CScrollView2* pSubView = (CScrollView2*)pDoc->GetNextView(pos);


pSubView->OnScroll(nScrollCode, nPos, bDoScroll);


두 번째 핸들을 얻어와서 OnScroll 해주니 깔끔하게 해결...몇 시간동안 고민하고 대가리 밖았네...


물론 원하는게 다 해결된 것은 아니다. 


여기서 문제점은 두 View 의 크기가 동일하지 않기 때문에 한쪽이 영상이 너무 크면 한쪽 특히 두번 째 뷰(사진에서 좌측)에서는 영상이 끝까지 나오지 못하는 문제가 생긴다. 


때문에 영상을 로드하면서 크기를 동일한 창에 출력하도록 해야 하는데 


왜인지 모르게 Child 의 크기를 내가 원하는 대로 조절을 못하고 있다. 


해결하면 또 포스팅 해야지..ㅡㅠ 나중에 꼭 이거 보고 빨리 해결해야지