본문 바로가기
C & C++/MFC 컨트롤

[Tip] 썸네일 리스트 미리보기 만들기

by izen8 2011. 4. 4.
반응형


리스트 컨트롤로 썸네일을 구현하였을때

마우스를 올려놓았을 때 일정 시간이 지나면 미리 보는 기능을 넣을려면

다이얼로그를 하나 만든다 ( Style은 None으로 )

그리고 동적으로 생성하여서 모달리스 다이얼로그로 생성하고 초기 상태를

ShowWindow( SW_HIDE); 로 해놓는다.

MouseMove 메시지를 오버라이드한다. 마우스가 해당 그림위에 있을 때

  1. void CThumbList::OnMouseMove(UINT nFlags, CPoint point)    
  2. {   
  3.     LVHITTESTINFO htInfo;   
  4.     CPoint pt( point );   
  5.   
  6.     htInfo.pt = pt;   
  7.     htInfo.flags = LVHT_ONITEM;   
  8.   
  9.     int nItem = HitTest( &htInfo );   
  10.   
  11.     if ( nItem == -1 )   
  12.     {   
  13.         KillTimer( 1 );   
  14.         ::PostMessage((GetParent())->m_hWnd, WM_SHOWPREVIEW, FALSE, (u_int)&m_strName);   
  15.         m_bTimer = FALSE;   
  16.   
  17.         return;   
  18.     }   
  19.   
  20.     m_nPoint = htInfo.iItem;   
  21.   
  22.     if ( m_bTimer == FALSE )   
  23.     {   
  24.         m_nOldPoint = m_nPoint;   
  25.   
  26.         SetTimer( 1, 1000, NULL );   
  27.         m_bTimer = TRUE;   
  28.     }   
  29.   
  30.     CListCtrl::OnMouseMove(nFlags, point);   
  31. }  


이렇게 한뒤에 OnTimer 함수에는 이렇게 코딩한다


  1. void CThumbList::OnTimer(UINT nIDEvent)    
  2. {   
  3.     switch ( nIDEvent)   
  4.     {   
  5.     case 1:   
  6.         if ( m_nPoint == m_nOldPoint )   
  7.         {   
  8.             GetItemPosition( m_nPoint, &m_ItemPoint );   
  9.             m_strName = GetItemText( m_nPoint, 0 );   
  10.             // 보여준다   
  11.             ::PostMessage((GetParent())->m_hWnd, WM_SHOWPREVIEW, TRUE, (u_int)&m_strName);   
  12.         }   
  13.   
  14.         KillTimer(1);   
  15.         m_bTimer = FALSE;   
  16.         break;   
  17.     default:   
  18.         ;   
  19.     }   
  20.            
  21.     CListCtrl::OnTimer(nIDEvent);   
  22. }  

그리고 메시지를 받는 메인 다이얼로그( 리스트 컨트롤을 포함하고 있는)는

메시지를 받는 함수를 만들고,


  1. VOID CShotEditorDlg::ShowPreview( WPARAM wParam, LPARAM lParam )   
  2. {   
  3.     CPoint point;   
  4.     CString* strPath = ( CString* )lParam;   
  5.     CString strResult;   
  6.   
  7.     strResult = m_strShotPath + "\\" + *strPath;   
  8.   
  9.     if ( wParam == 0 )   
  10.     {   
  11.         m_pPreview->ShowWindow( SW_HIDE );   
  12.   
  13.         return;   
  14.     }   
  15.   
  16.     GetCursorPos(&point);   
  17.   
  18.     m_pPreview->SetThumbBmp( strResult );   
  19.     m_pPreview->MoveWindow( point.x , point.y, PREVIEW_WIDTH, PREVIEW_HEIGHT );   
  20.     m_pPreview->ShowWindow( SW_SHOW );   
  21. }  

이렇게 하면 밑과 같이 완성이 된다



반응형

댓글