GSI

기본 소스는 아래 주소의 포스트를 사용했어요.. ^^
[MFC] Ruler 소스.. 메모리 DC 사용한 자연스러운 효과구현..


중점 :
  1. 줌인 줌아웃 처리를 위한 float 변수를 하나 추가 했습니다.
  2. ScrollView의 페이지 크기를 저장하는 CSize 변수를 하나 추가 했습니다.
  3. 방향키 UP, DOWN 을 사용해서 줌인, 줌아웃 처리를 보여 줍니다.

이제 설명을 시작하겠습니다.

Ruler 보완

Ruler의 기존 소스를 보게 되면 마우스로 스크롤 할때 Ruler가 따라 가지 않습니다.
기존 코드를 볼가요?
 // 기본 Ruler
 CRect rulerRect;
 rulerRect.left = scrollPosition.x;
 rulerRect.right = rulerRect.left + curArea.Width();
 rulerRect.top = scrollPosition.y;
 rulerRect.bottom = rulerRect.top + 20;
 m_RulerHorz.Draw( pDC, rulerRect.left, rulerRect.top, rulerRect.Width(), rulerRect.Height(), scrollPosition.x );

분명히 scrollPosition.y를 해줬는데도 안됩니다.
이걸 해결 하기 위해서는 휠을 움직여서 화면을 업데이트 한 것이기 때문에
아래의 OnMouseWheel함수를 오버라이드(?) 해서 Invalidate()를 해줘야 됩니다.

BOOL CRulerSampleView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
 Invalidate();
 return CScrollView::OnMouseWheel(nFlags, zDelta, pt);
}

그리고 Scroll의 Bar를 움직여도 화면이 업데이트 되어야 하기 때문에 아래의 함수들도 같이 처리

void CRulerSampleView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
 Invalidate( true );
 CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CRulerSampleView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
 Invalidate( true );
 CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}

이렇게 하고 나면 휠 또는 스크롤바를 움직여도 Ruler가 자연스럽게 화면에 보이는걸 알 수 있습니다.

자자..
이제 줌인 줌아웃 처리를 해볼까요..


줌인 줌아웃 처리를 위해서 아래의 코드를 RulerSampleView.h 에 추가 합니다.
 CSize     m_PageSize;
 float     m_Zoom;

그리고 RulerSampleView.cpp 에는 아래와 같이 해봅시다.

> 우선 줌 성분 초기화를 생성자 함수에 추가
m_Zoom = 1.f;

> ScrollVew이기 때문에 페이지의 크기를 추가
void CRulerSampleView::OnInitialUpdate()
{
 CScrollView::OnInitialUpdate();

 m_PageSize = CSize( 1000, 1000 );
 SetScrollSizes(MM_TEXT, m_PageSize);
}

> 드로잉 코드에 m_Zoom을 적절하게 수정해 줍니다.
테스트를 위한 위치값을 10개를 생성했습니다. 이건 코드 보시면 알수 있어요..
드로잉 할때 아래와 같이 처리 합니다.
 vector< CPoint >::iterator iter;
 for( iter = m_TestData.begin(); iter != m_TestData.end(); iter++ )
 {
  CRect rect;
  rect.left  = (*iter).x;
  rect.top  = (*iter).y;
  rect.right  = rect.left + 50;
  rect.bottom  = rect.top + 50;

  rect.left  *= m_Zoom;
  rect.top  *= m_Zoom;
  rect.right  *= m_Zoom;
  rect.bottom  *= m_Zoom;

  pDC->FillRect( &rect, &redbrush );
 }
위의 붉은 부분을 m_Zoom으로 곱해줍니다.

> 이렇게 하고 나서 이제 이벤트를 추가해줘야 겠죠.
방향키를 통해서 줌인 줌아웃 성분을 증가 감소 합니다.

void CRulerSampleView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
 if( nChar == VK_UP )
 {
  m_Zoom -= 0.1f;

  CClientDC dc(this);
  m_RulerHorz.CreateDC( &dc, 10000, 20, m_Zoom );

  m_PageSize = CSize( 1000*m_Zoom, 1000*m_Zoom );
  SetScrollSizes(MM_TEXT, m_PageSize);

  Invalidate();
 }

 if( nChar == VK_DOWN )
 {
  m_Zoom += 0.1f;

  CClientDC dc(this);
  m_RulerHorz.CreateDC( &dc, 10000, 20, m_Zoom );

  m_PageSize = CSize( 1000*m_Zoom, 1000*m_Zoom );
  SetScrollSizes(MM_TEXT, m_PageSize);

  Invalidate();
 }

 CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
}

위의 코드에서 보듯이 Ruler도 줌 성분이 달라지면, Ruler의 줌 성분을 보정해서 메모리 DC를 생성합니다.
그리고 ScrollView의 페이지도 m_Zoom에 따라서 사이즈를 제조정 해줍니다.

이렇게 하면 아래와 같은 프로그램을 만들 수 있습니다.

사용자 삽입 이미지
사용자 삽입 이미지

관련샘플 :


.


.


Posted by gsi
:

Google
 


마우스를 통한 개발툴을 만들다 보면 대부분 스크롤 기능을 포함하는 경우가 많습니다.

CScrollView 화면을 통한 마우스 기반의 툴을 제작 하게 되면 불가피 하게 OnLButtonDown(), OnLButtonUp(), OnMouseMove()를 제어 하게 되어 있습니다.
여기서 부터 작업이 시작 되지요.
스크롤 뷰의 화면을 좀 크게 잡는다 싶으면, 스크롤 바를 움직여 보면 아시겠지만, 제대로 되지 않습니다. 16bit 형태의 값이였나, 아뭍턴 값의 한계로 인해서 스크롤 바의 위치가 제대로 처리 되지 않습니다.
그 경우 아래의 코드를 추가 해야 합니다.

BOOL CScrollTest2View::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll)
{
// When you drag the scroll box, the nPos value send from WM_HSCROLL/WM_VSCROLL is 16bit value.
// Therefore retrieve the 32bit scroll box position value.
if(SB_THUMBTRACK == LOBYTE(nScrollCode)) // WM_HSCROLL
{
SCROLLINFO info;
if(GetScrollInfo(SB_HORZ, &info, SIF_TRACKPOS))
{
nPos = info.nTrackPos; // 32bit position value.
}
}
else if(SB_THUMBTRACK == HIBYTE(nScrollCode)) // WM_VSCROLL
{
SCROLLINFO info;
if(GetScrollInfo(SB_VERT, &info, SIF_TRACKPOS))
{
nPos = info.nTrackPos; // 32bit position value.
}
}

return CScrollView::OnScroll(nScrollCode, nPos, bDoScroll);
}

위의 코드를 추가 하고 나면 넓은 영역의 뷰도 스크롤이 제대로 표현되는 것을 확인하실 수 있을겁니다.

이제 확인해야 될 부분이 마우스 이벤트에 들어 오는 CPoint point 부분입니다.
스크롤 뷰에서 제일 맘에 안드는 부분이 이 부분인데요. point가 왜 스크롤 되고 나면 현재 위치를
구해 주지 않는지 모르겠습니다.
사용자 삽입 이미지
위의 화면에서와 같이 마우스 위치의 지점을 클릭해 보겠습니다. 클릭하고 나면 대략 값이 x:188, y:49 가 나오게 됩니다.
하지만 아래의 스크롤 바를 보면 우측으로 많이 가 있는 것을 볼 수 있습니다.
즉, 스크롤이 움직여도 마우스의 위치 값은 화면에 보이는 영역에 대한 상대 값임을 알 수 있습니다.

그렇다면 여기서 스크롤 되는 정보를 얻어 와서 처리 해주어야 한다는 사실을 알게 될겁니다.
스크롤 정보를 알기 위해서 GetScrollPosition() 를 사용합니다.

이제 스크롤 된 후의 현재 마우스 위치 정보를 아래와 같이 구합니다.
CPoint scrollpos = point + GetScrollPosition();

※예로 제가 작업했던 코드 일부 여기에 포스트...
void CScrollTest2View::OnMouseMove(UINT nFlags, CPoint point) { if( m_oldPoint == point ) return; CPoint scrollpos = GetScrollPosition(); TRACE2("현재 스크롤값:%d, %d\n", scrollpos.x, scrollpos.y); int x = scrollpos.x % GridSize.cx; int y = scrollpos.y % GridSize.cy; m_ptGrid = CPoint( ((int)((point.x+x) / GridSize.cx)) * GridSize.cx, ((int)((point.y+y) / GridSize.cy)) * GridSize.cy ); TRACE2("현재 그리드 위치:%d, %d\n", m_ptGrid.x, m_ptGrid.y); m_ptGrid.x -= x; m_ptGrid.y -= y; TRACE2("현재 그리드 위치:%d, %d\n", m_ptGrid.x, m_ptGrid.y); XORPen(); m_oldPoint = point; CScrollView::OnMouseMove(nFlags, point); } void CScrollTest2View::OnLButtonDown(UINT nFlags, CPoint point) { CPoint pos = CPoint(0, 0); GetCursorPos( &pos ); this->ScreenToClient( &pos ); CScrollView::OnLButtonDown(nFlags, point); } void CScrollTest2View::OnLButtonUp(UINT nFlags, CPoint point) { TRACE2("MousePos:%d, %d\n", point.x, point.y); CPoint scrollpos = point + GetScrollPosition(); TRACE2("ScrollPosition:%d, %d\n", scrollpos.x, scrollpos.y); m_ptGrid = CPoint( ((int)(scrollpos.x / GridSize.cx)) * GridSize.cx, ((int)(scrollpos.y / GridSize.cy)) * GridSize.cy ); m_vPos.push_back( m_ptGrid ); OutCursorDCxRop(); Invalidate(); CScrollView::OnLButtonUp(nFlags, point); }

이 값을 사용해서 여러가지 동작들을 추가 하시면 됩니다.
하지만 이것저것 하다 보면 GetScrollPosition()의 값을 보정해서 해줘야 하는 경우가 많이 발생을 하게 됩니다. 그때 마다 너무 많은 작업량이 좀 힘들더라구요.

팁을 드리면 CScrollView에 CView를 추가한 후에 CScrollView의 Create(), OnSize() 부분에 코드를 적당히 넣어서 CView를 내부에 크기 만큼 심어 놓습니다.
그렇게 한후에 마우스 픽킹을 해보시면 마우스 이벤트가 CScrollView로 가지 않고 CView로 가는 것을
확인할 수 있을겁니다.
더욱더 놀라운건 ^^.. 스크롤로 해서 화면을 움직여도 현재 찍힌 화면의 좌표는 스크롤로 이동한 좌표 즉, 화면이 스크롤 만큼 이동한 후에 CView의 이동된 좌표값을 바로 리턴해 준다는 겁니다.

이상.. 가볍게 적었지만 CView 추가 하는 부분은 생략하도록 하겠습니다. (귀찮네요 ^^)
모르거나 필요하시면 제가 바로 답변 드릴테니 뎃글 달아 주세요..
Posted by gsi
:

Google
 

몇달 전부터 Scroll View 페이지를 응용한 개발툴을 몇개 작성을 하게 되었네요.
CView 보다 더 복잡하고, 스크롤이 들어 가면서 포지션 정보를 무시할 수 없더군요.

가장 귀찮게 여겨 지는 것은 Client Area 부분의 마우스가 Down, Up Move 등의 행위를 할때
항상 ScrollToPosition()을 달고 다녀야 한다는게 너무나 맘에 안들었습니다.

마우스의 위치 좌표가 왜 스크롤된 위치가 나오지 않고 현재 보이는 화면 영역의 상대 값이 나오는지.
정말 귀찮습니다.

그래서 CScrollView 클래스에 CView를 삽입 하고,
TotalSize 만큼 CView를 확장해서 처리를 하게 되었습니다.

스크롤 정보는 CSCrollView로 보내야 되고,
화면의 마우스 처리는 CView가 담당하게 처리 하였죠.

근데 .. 이렇게 하니 마우스의 좌표가 스크롤된후의 CView의 위치 정보가 보이게 되더군요.
참으로 편합니다. ^^ 그 위치가 스크롤된 화면 위치니까요.

조금더 나아지는 MFC 방법들이 재미나게 느껴 집니다.

요즘은 애매한 컨트롤은 CWnd, CStatic, CView, CDialog 등과 같은 컨트롤을
여러개 겹치면서 다양한 효과를 구현하고 있네요 ^^..

이번에 테스트뷰로 만들고 있는 화면입니다.
사용자 삽입 이미지

이 프로그램의 기능은 휠을 통한 좌우 스크롤 기능과 화면의 픽킹 처리가 CView에서 담당하는게 특징입니다.

배움에 있어서 여러가지 새로운 ms의 기술들과 플렉스 등을 보면서.
MFC의 기술 또한 같이 성장하는거 같습니다.

아.. 이제 자야 겠네요.. @.@.. 몽롱합니다.
Posted by gsi
:

CScrollView를 사용해서 화면을 처리 하다 보면 셀 단위의 뷰를구현할때 즉, 화면이 일정 범위의 간격을 두고 움직이고자 할때 스크롤 바를 움직이면 한픽셀씩 움직이지 않고 한 단위씩 움직이도록 하고자 할때가 있다. 이때는 OnVScroll()를 오버라이드 한다.

void CColorPlayScrollView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
 UINT newpos = 0;
 switch(nSBCode) {
  case SB_LINEUP:
  case SB_LINEDOWN:
  case SB_PAGEUP:
  case SB_PAGEDOWN:
  case SB_THUMBPOSITION:
  case SB_THUMBTRACK:
  case SB_TOP:
  case SB_BOTTOM:
  case SB_ENDSCROLL:
   {
    if(nPos%30 == 0) {
//     SetScrollPos(SB_VERT,nPos,TRUE);
     CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
    }
   }
   break;
 }

// SetScrollPos(SB_VERT,newpos,TRUE);

// CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}

여기서 모든 메시지를 가져와서 해당 값이 되었을때만 호출하도록 처리 해봤습니다.
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
이 함수를 호출하면 화면이 이동 되도록 해봤습니다. 결과는 아래와 같아요.^^

사용자 삽입 이미지

Posted by gsi
:

기존 CScrollView를 사용하면서 mfc의 DC 드로잉 부분에서 부족했던 저로서는 번쩍 거리는 화면이 너무 안좋게 보였습니다.
하지만 지금 테스트해본 결과가 맞는 정답은 아니겠지만 많은 부분 개선되는 것을 확인했습니다.

스크롤 사이즈를 10240000 까지 늘려서 테스트를 진행했습니다.
sizeTotal.cx = sizeTotal.cy = 10240000;
SetScrollSizes(MM_TEXT, sizeTotal);

미리 선과제로 OnEraseBkgnd()는 return false로 변경을 하고 시작했습니다.

BOOL CScrollViewTestView::OnEraseBkgnd(CDC* pDC)
{
     return false;
}

하나더 해줘야 할게 CScrollView의 스크롤이 16bit로 되는 현상을 32bit로 전환처리. (이건 제 블로그나 기타 다른 곳에도 기술되어 있습니다.)

BOOL CScrollViewTestView::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll)
{
 // When you drag the scroll box, the nPos value send from WM_HSCROLL/WM_VSCROLL is 16bit value.
 // Therefore retrieve the 32bit scroll box position value.
 if(SB_THUMBTRACK == LOBYTE(nScrollCode)) // WM_HSCROLL
 {
  SCROLLINFO info;
  if(GetScrollInfo(SB_HORZ, &info, SIF_TRACKPOS))
  {
   nPos = info.nTrackPos; // 32bit position value.
  }
 }
 else if(SB_THUMBTRACK == HIBYTE(nScrollCode)) // WM_VSCROLL
 {
  SCROLLINFO info;
  if(GetScrollInfo(SB_VERT, &info, SIF_TRACKPOS))
  {
   nPos = info.nTrackPos; // 32bit position value.
  }
 }

 return CScrollView::OnScroll(nScrollCode, nPos, bDoScroll);
}

이후에 OnDraw(CDC* pDC) 에서 테스트를 했습니다.

스크롤 내부의 총 사이즈를 사용해서 드로잉을 해봤습니다.

CSize size = GetTotalSize()
... 중략...
 for(int x = 0; x < size.cx; x += 10) {
  pDC->MoveTo(x, 0);
  pDC->LineTo(x, size.cy);
 }

 for(int y = 0; y < size.cy; y += 10) {
  pDC->MoveTo(0, y);
  pDC->LineTo(size.cx, y);
 }

이렇게 테스트를 하니까. tick를 찍어 봤을때 2250 이 나오네요. -.-;

그래서 우선  Flicker Free Drawing 를 사용해서 해봤습니다.

 CRect rcBounds = CRect(0, 0, size.cx, size.cy);
 CMemDC pDCEx(pDC);
 pDCEx->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));

 for(int x = 0; x < size.cx; x += 10) {
  pDCEx->MoveTo(x, 0);
  pDCEx->LineTo(x, size.cy);
 }

 for(int y = 0; y < size.cy; y += 10) {
  pDCEx->MoveTo(0, y);
  pDCEx->LineTo(size.cx, y);
 }

하지만 tick는 2500 으로 더 많게 되네요. 왜냐하면. 메모리 DC를 만들고 하다 보니 그런거 같아요.

그래서 스크롤은 안보이는 부분을 드로잉하지 않는 처리를 해야 하는거 같아서
아래와 같이 값을 구한다음에 처리를 해봤습니다.

 CSize size = GetTotalSize();  // 페이지의 총 사이즈(안보이는 부분까지 싹다)
 CRect clientRect;
 GetClientRect(&clientRect);    // 현재 화면에 보이는 클라이언트 정보

 CPoint scrollpos = GetScrollPosition();  // 스크롤 된 위치 좌측 상단
 CPoint devicescrollpos = GetDeviceScrollPosition();  // 디바이스별... 이건 위와 같네요(현재 상태에서는)

// 드로잉 간격을 10씩 했기 때문에 시작 지점을 보정해 줬습니다.
 CPoint startpos = CPoint(scrollpos.x%10, scrollpos.y%10);
 startpos.x = scrollpos.x - startpos.x;
 startpos.y = scrollpos.y - startpos.y;

// 시작지점과 클라이언트 영역을 사용해서 끝 점을 구했습니다.
 CPoint endpos = CPoint(scrollpos.x + clientRect.Width(), scrollpos.y + clientRect.Height());

드로잉은 아래와 같이 테스트...

 CRect rcBounds = CRect(0, 0, size.cx, size.cy);
 CMemDC pDCEx(pDC);
 pDCEx->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));

 for(int x = startpos.x; x < endpos.x; x += 10) {
  pDCEx->MoveTo(x, 0);
  pDCEx->LineTo(x, size.cy);
 }

 for(int y = startpos.y; y < endpos.y; y += 10) {
  pDCEx->MoveTo(0, y);
  pDCEx->LineTo(size.cx, y);
 }

이렇게 작업을 해서 안보이는 부분을 처리 했습니다.
처음 시작할때는 조금 딜레이가 있지만. 번쩍 거리는 현상의 거의 없어 지네요.
앞으로 복잡한 부분이 아닌 적당한 드로잉 방법에는 Flicker Free Drawing를 사용해야 겠습니다. ^^..


여기서 사용한 CMemDC는 아래 코드가 있습니다.




스크롤 테스트한 총 예제는 아래 코드..

Posted by gsi
:

CScrollView 클래스는 스크롤바 관련 메시지 처리를 구현하고 있다. CSrollView::OnHScroll(), CScrollView::ONVScroll() 루틴이 그것인데, 이 두 루틴은 CScrollView::OnScroll()를 호출하도록 구현하고 있다.

그런데 스크롤 메시지(WM_HSCROLL/WM_VSCROLL)의 스크롤 코드가 SB_THUMBTRACK일때, wParam의 상위 워드(16bit)로 전달되는 스크롤 박스의 현재 위치 값이 CScrollView::OnScroll()의 nPos 파라미터로 전달되어 그대로 사용된다. SB_THUMBTRACK이 아닌 다른 스크롤 코드에 대해서는 CScrollView::OnScroll() 루틴이 직접 GetScrollPos() 함수를 호출함으로 스크롤 박스의 현재 위치 값이 32bit값으로 사용된다.

CScrollView::SetScrollSizes()를 사용하여 스크롤 뷰의 크기를 일반적으로 크게 설정할 때, (맵핑모드에 따라 차이는 있겠지만) 결과적으로 다바이스 단위로 변환된 스크롤 뷰의 크기가 16bit int(0 ~ 32767)의 범위를 넘어가면 문제가 발생한다. 스크롤바의 스크롤 박스를 마우스로 드래그할 때 (즉, SB_THUMBTRACK 코드가 발생될 때) 드래그 위치가 16bit int 값으로 짤려서 전달되기 때문에 음수로 해석이 되어 스크롤 박스위치가 0으로 리셋되는 (튕겨지는) 현상이 발생한다.

이 문제를 해결하려면 아래의 예와 같이 CScrollView::OnScroll()를 오버라이드 해야 한다. 다행이 CScrollView::OnScroll()은 버추얼 함수로 되어 있다.

BOOL CPixelMapView::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll)
{
 // When you drag the scroll box, the nPos value send from WM_HSCROLL/WM_VSCROLL is 16bit value.
 // Therefore retrieve the 32bit scroll box position value.
 if(SB_THUMBTRACK == LOBYTE(nScrollCode)) // WM_HSCROLL
 {
  SCROLLINFO info;
  if(GetScrollInfo(SB_HORZ, &info, SIF_TRACKPOS))
  {
   nPos = info.nTrackPos; // 32bit position value.
  }
 }
 else if(SB_THUMBTRACK == HIBYTE(nScrollCode)) // WM_VSCROLL
 {
  SCROLLINFO info;
  if(GetScrollInfo(SB_VERT, &info, SIF_TRACKPOS))
  {
   nPos = info.nTrackPos; // 32bit position value.
  }
 }

 return CZoomView::OnScroll(nScrollCode, nPos, bDoScroll);
}

발췌 : http://blog.naver.com/lonekid?Redirect=Log&logNo=60045291285
감사 ^^.

Posted by gsi
:

기존의 스크롤뷰가 페이지의 크기가 커지면, 많은 문제점이 생기게 됩니다.
좀 불합리성이 보이네욤..
더블 버퍼링도 좀 부피가 커져서 효율이 떨어 지고. 스크롤의 최대 값도 좀 걸리고.
그래서 싱글 뷰에 직접 컨트롤 박아서 처리해봤어요.

사용자 삽입 이미지
위에서 보는 거 처름 CView 에 View, ScrollBar등을 달아서
움직이도록 처리 해봤습니다.

더 보정할건 많지만. 기초 프로토타입으로는 좋은거 같네요..

앞으로 여기에 마우스로 컨트롤 추가 하고 타임 라인 비슷한 화면을 구성해 볼려고 합니다.
잘 되면 좋겠네요 ^^.

관련코드 :
Posted by gsi
:

사용자 삽입 이미지

이번에 하게된 테스트 프로젝트에서 사용하게 되는 모듈 중에 CScrollView를 사용한
화면 구현 부분을 작성해 봤습니다.

기능 :
- CScrollVew
- ZoomIn, ZoomOut
- MouseLButton 연동한 해당 지점 찍기

스크롤을 하거나, 줌인이 되면서 스크롤 되거나 하는 부분에서
마우스의 위치 처리 부분이 참 궁금했습니다.
이것으로 테스트는 마치고 작업에 들어가야 하겠네요.

구체적인 코드 설명은 오늘은 영.. @.@..
요청이 있을시에는 설명 해 드리겠습니다. ^^..

<참고> 코드 구루 인가 그쪽에서 가져온 ZoomView를 사용해서 확장한 겁니다.

소스 파일 :

Posted by gsi
:

이번에 데모로 하나 작업 하는게 있다.

그런데 CScrollView를 사용한 데모이다.
물론 기존에 소스를 보면 Zoom, Pan, Scroll 기능이 접목되어 있는
소스들이 많이 있다.

이것을 갔다가 활용할려고 했지만.
마우스로 찍는 부분과 화면의 표현 부분에서
정말 많이 막히는거 같다.

내가 개념을 잘못 잡고 있는건지...
왠지 어렵다.

MM_TEXT를 사용해서 하는것도 괜찮은거 같은데.
화면에 해당 그림을 찍고 Zooming를 하게 되면
이상하게 자꾸 화면이 표현이 되질 않는다.

혹 누가 아시는분 있으시면 코멘트 부탁..
술, 밥 다 쏩니다 ^^
Posted by gsi
: