// ImgListView.cpp : implementation file
|
//
|
|
#include "stdafx.h"
|
#include "ImgListView.h"
|
#include <vector>
|
|
#ifdef _DEBUG
|
#define new DEBUG_NEW
|
#undef THIS_FILE
|
static char THIS_FILE[] = __FILE__;
|
#endif
|
|
/////////////////////////////////////////////////////////////////////////////
|
// CImgListView
|
|
IMPLEMENT_DYNCREATE(CImgListView, CScrollView)
|
|
CImgListView::CImgListView():m_nAddItem(0)
|
{
|
m_BgBrush.CreateSolidBrush(RGB(0,0,0));
|
m_pSelectItem = NULL;
|
}
|
|
CImgListView::~CImgListView()
|
{
|
DeleteItemAll();
|
}
|
|
|
BEGIN_MESSAGE_MAP(CImgListView, CScrollView)
|
//{{AFX_MSG_MAP(CImgListView)
|
ON_WM_SIZE()
|
ON_WM_PAINT()
|
ON_WM_LBUTTONDOWN()
|
ON_WM_LBUTTONDBLCLK()
|
//}}AFX_MSG_MAP
|
ON_WM_ERASEBKGND()
|
ON_WM_VSCROLL()
|
ON_WM_DESTROY()
|
END_MESSAGE_MAP()
|
|
/////////////////////////////////////////////////////////////////////////////
|
// CImgListView drawing
|
|
CPotoItem::CPotoItem()
|
{
|
m_Img;
|
//m_strImgInfo = "";
|
m_rcImg = CRect(0,0,100,100);
|
m_bSelect = 0;
|
}
|
|
CPotoItem::CPotoItem(CString strFilePath)
|
{
|
m_bProcesing = 0;
|
m_bSelect = 0;
|
m_bValid = m_Img.Load(strFilePath);
|
m_rcImg = CRect(0,0,100,100);
|
}
|
|
CPotoItem::CPotoItem(CString strFilePath,CString strFileName,CString strImgInfo)
|
{
|
m_bProcesing = 0;
|
m_bSelect = 0;
|
_stprintf(m_Path,_T("%s%s"),strFilePath,strFileName);
|
m_bValid = m_Img.Load(m_Path);
|
m_rcImg = CRect(0,0,100,100);
|
}
|
CPotoItem::~CPotoItem()
|
{
|
}
|
|
|
void CPotoItem::Draw(CDC *pDC, CRect rcClient, CRect rcChange)
|
{
|
//------------------------------------------------------
|
// Á¤»ç°¢Çü Å©±â¸¦ °®´Â ¸Þ¸ð¸®DC »ý¼º( MemDC )
|
//------------------------------------------------------
|
|
CDC MemDC;
|
MemDC.CreateCompatibleDC( pDC );
|
MemDC.SetStretchBltMode(COLORONCOLOR);
|
CBitmap MemBitmap;
|
MemBitmap.CreateCompatibleBitmap( pDC , rcChange.Width() , rcChange.Height() );
|
CBitmap * pOldBitmap = (CBitmap *)MemDC.SelectObject( &MemBitmap );
|
|
// ¹è°æ Ä¥Çϱâ
|
CRect rcMemDC(0, 0, rcChange.Width(), rcChange.Height());
|
|
if(m_bSelect)
|
MemDC.FillRect( rcMemDC, &CBrush(RGB(200,100,0)));
|
else
|
MemDC.FillRect( rcMemDC, &CBrush(RGB(255,255,255)));
|
|
if(m_bProcesing)
|
DrawRect(&MemDC,RGB(255,0,0),rcMemDC);
|
// ¿©¹éÀº °¡·Î ¼¼·Î 5
|
// Text °¡ ¾²¿©Áú °ø°£ 25
|
CRect rcImg (5, 5, rcChange.Width()-5, rcChange.Height()-ITEM_TEXT);
|
m_Img.Draw(MemDC.GetSafeHdc(), rcImg);
|
DrawText(&MemDC,RGB(0,0,255));
|
|
|
pDC->BitBlt( rcChange.left, rcChange.top, rcChange.Width(), rcChange.Height(), &MemDC, 0, 0, SRCCOPY );
|
|
}
|
|
void CPotoItem::DrawText(CDC *pDC, COLORREF color)
|
{
|
|
CFont TextFont;
|
TextFont.CreateFont(12 , 0, 0, 0, 300 , FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
|
DEFAULT_QUALITY, DEFAULT_PITCH | FF_ROMAN,_T("Arial"));
|
|
CFont *pOldFont = (CFont*) pDC->SelectObject(&TextFont);
|
int mode = pDC->SetBkMode( TRANSPARENT );
|
int modeText = pDC->SetTextColor( color );
|
//-----------------------------------------------------------
|
// À̹ÌÁö¸íÀ» ȸ鿡 Ãâ·ÂÇÑ´Ù.
|
// File NameÀÌ 15ÀÚ ÀÌ»ó µÇ¸é ~~ ·Î Ãà¾à
|
//-----------------------------------------------------------
|
CString strtmp;
|
// if(m_strName.GetLength() > 15)
|
// strtmp = m_strName.Left(6) + "~~";// +m_strName.Right(4);
|
// else
|
/*
|
if(m_strName.GetLength() > 20)
|
strtmp = m_strName.Left(20);
|
else
|
*/
|
|
|
|
//strtmp = m_strName;
|
//CRect rcText( 0 , ITEM_HEIGHT + 5 , ITEM_HEIGHT , ITEM_HEIGHT + ITEM_TEXT );
|
//pDC->DrawText( strtmp , rcText , DT_CENTER | DT_WORDBREAK );
|
|
// strtmp.Format("%d X %d X %d",m_Img.GetWidth(),m_Img.GetHeight(),m_Img.GetBpp());
|
// rcText = CRect( 0 , ITEM_HEIGHT + 20 , ITEM_HEIGHT , ITEM_HEIGHT + ITEM_TEXT );
|
// pDC->DrawText( strtmp , rcText , DT_CENTER | DT_WORDBREAK );
|
|
pDC->SetTextColor( modeText );
|
pDC->SetBkMode( mode );
|
pDC->SelectObject( pOldFont );
|
TextFont.DeleteObject();
|
}
|
|
|
void CPotoItem::DrawRect(CDC *pDC, COLORREF color,CRect rc)
|
{
|
CPen pen,*pOldPen;
|
pen.CreatePen(PS_SOLID,3,color);
|
pDC->SelectObject(GetStockObject(NULL_BRUSH));
|
|
pOldPen = (CPen *)pDC->SelectObject(&pen);
|
|
pDC->Rectangle(rc);
|
pDC->SelectObject(pOldPen);
|
pen.DeleteObject();
|
}
|
|
|
|
void CImgListView::OnInitialUpdate()
|
{
|
CScrollView::OnInitialUpdate();
|
|
CSize sizeTotal;
|
|
// TODO: calculate the total size of this view
|
sizeTotal.cx = sizeTotal.cy = 100;
|
SetScrollSizes(MM_TEXT, sizeTotal);
|
}
|
|
void CImgListView::OnDraw(CDC* pDC)
|
{
|
CDocument* pDoc = GetDocument();
|
// TODO: add draw code here
|
}
|
|
/////////////////////////////////////////////////////////////////////////////
|
// CImgListView diagnostics
|
|
#ifdef _DEBUG
|
void CImgListView::AssertValid() const
|
{
|
//CScrollView::AssertValid();
|
}
|
|
void CImgListView::Dump(CDumpContext& dc) const
|
{
|
//CScrollView::Dump(dc);
|
}
|
#endif //_DEBUG
|
|
/////////////////////////////////////////////////////////////////////////////
|
// CImgListView message handlers
|
CRect CImgListView::GetItemRect(int nItem)
|
{
|
CRect rc;
|
int left, top;
|
|
left = LEFT_MARJIN + ((nItem) % m_nHItem) * (ITEM_WIDTH+ITEM_ROW_MARJIN);
|
top = TOP_MARJIN + ((nItem) / m_nHItem) * (ITEM_HEIGHT+ITEM_TEXT+ITEM_COL_MARJIN);
|
|
rc.SetRect( left, top, left + ITEM_WIDTH, top + ITEM_HEIGHT + ITEM_TEXT );
|
return rc;
|
}
|
|
void CImgListView::UpdateItem()
|
{
|
CString mapKey;
|
CPotoItem *pImgItem;
|
int count=0;
|
IMG_MAP::iterator it_img;
|
if(!m_ImgMap.empty())
|
{
|
for(it_img = m_ImgMap.begin(); it_img !=m_ImgMap.end();it_img++)
|
{
|
mapKey = (*it_img).first;
|
pImgItem = (*it_img).second;
|
pImgItem->m_rcImg = GetItemRect(count++);
|
}
|
}
|
Invalidate( FALSE );
|
}
|
|
void CImgListView::SetPageSize()
|
{
|
CSize sizeTotal;
|
int nHeight = 0;
|
nHeight = m_nAddItem / m_nHItem;
|
if( (m_nAddItem % m_nHItem) > 0 )
|
nHeight++;
|
|
sizeTotal.cx = LEFT_MARJIN + (m_nHItem * (ITEM_WIDTH+ITEM_ROW_MARJIN));
|
sizeTotal.cy = TOP_MARJIN + ((nHeight+1) * (ITEM_HEIGHT+ITEM_TEXT+ITEM_COL_MARJIN));
|
if((sizeTotal.cy >0 )&& (sizeTotal.cx >0))
|
SetScrollSizes( MM_TEXT, sizeTotal);
|
}
|
|
BOOL CImgListView::LoadImage(CString strFilePath)
|
{
|
//m_nAddItem++;
|
//CPotoItem *pItem = new CPotoItem(strFilePath);
|
return TRUE;
|
}
|
|
|
BOOL CImgListView::LoadImageFolder(CString strPath, CString strGlassID, CString strOp)
|
{
|
CString strFile;
|
CString strPattern;
|
CString strExt;
|
BOOL bRC = TRUE;
|
std::vector<CString> VectorImageNames;
|
|
if ( strPath[strPath.GetLength() - 1] == TCHAR('\\') )
|
strPattern.Format( TEXT("%s*.*"), strPath );
|
else
|
strPattern.Format( TEXT("%s\\*.*"), strPath );
|
|
HANDLE hFind = NULL;
|
WIN32_FIND_DATA FindFileData;
|
hFind = ::FindFirstFile(strPattern, &FindFileData); // strat search
|
if (hFind == INVALID_HANDLE_VALUE)
|
{
|
return FALSE;
|
}
|
|
// filter off the system files and directories
|
if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
|
!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) &&
|
!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) &&
|
!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY))
|
{
|
// test file extension
|
strFile = FindFileData.cFileName;
|
strExt = strFile.Right(3);
|
|
if ( (strExt.CompareNoCase( TEXT("bmp") ) == 0) ||
|
(strExt.CompareNoCase( TEXT("jpg") ) == 0) ||
|
(strExt.CompareNoCase( TEXT("gif") ) == 0) ||
|
(strExt.CompareNoCase( TEXT("tif") ) == 0) ||
|
(strExt.CompareNoCase( TEXT("png") ) == 0) )
|
{
|
// save the image file name
|
VectorImageNames.push_back(strFile);
|
}
|
}
|
|
// loop through to add all of them to our vector
|
while (bRC)
|
{
|
bRC = ::FindNextFile(hFind, &FindFileData);
|
if (bRC)
|
{
|
// filter off the system files and directories
|
if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
|
!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) &&
|
!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) &&
|
!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY))
|
{
|
// test file extension
|
strFile = FindFileData.cFileName;
|
strExt = strFile.Right(3);
|
|
if ( (strExt.CompareNoCase( TEXT("bmp") ) == 0) ||
|
(strExt.CompareNoCase( TEXT("jpg") ) == 0) ||
|
(strExt.CompareNoCase( TEXT("gif") ) == 0) ||
|
(strExt.CompareNoCase( TEXT("tif") ) == 0) ||
|
(strExt.CompareNoCase( TEXT("png") ) == 0) )
|
{
|
// save the image file name
|
VectorImageNames.push_back(strFile);
|
}
|
}
|
}
|
else
|
{
|
DWORD err = ::GetLastError();
|
if (err != ERROR_NO_MORE_FILES)
|
{
|
|
return FALSE;
|
}
|
}
|
} // end of while loop
|
|
// close the search handle
|
::FindClose(hFind);
|
|
// update the names, if any
|
if ( !VectorImageNames.empty() )
|
{
|
for(int i=0;i<(int)VectorImageNames.size();i++)
|
{
|
strFile = VectorImageNames[i];
|
if(strFile.IsEmpty() == TRUE)
|
continue;
|
|
m_nAddItem++;
|
|
CPotoItem *pItem = new CPotoItem(strPath,strFile);
|
m_ImgMap[strFile] =pItem;
|
}
|
|
UpdateItem();
|
SetPageSize();
|
Invalidate(FALSE);
|
|
return TRUE;
|
}
|
|
return FALSE;
|
}
|
|
|
|
BOOL CImgListView::SelectItemChk(CPoint point)
|
{
|
|
CString mapKey;
|
CPotoItem *pImgItem,*pImgItem2;
|
IMG_MAP::iterator it_img,it_img2;
|
CRect rcItem;
|
BOOL bUpdate=0;
|
if(!m_ImgMap.empty())
|
{
|
for(it_img = m_ImgMap.begin(); it_img !=m_ImgMap.end();it_img++)
|
{
|
pImgItem = (*it_img).second;
|
rcItem = pImgItem->GetRect();
|
if(rcItem.PtInRect(point))
|
{
|
if(KEY_DOWN(VK_SHIFT))
|
{
|
pImgItem->ToggleSelected();
|
}
|
else
|
{
|
for(it_img2 = m_ImgMap.begin(); it_img2 != m_ImgMap.end();it_img2++)
|
{
|
pImgItem2 = (*it_img2).second;
|
pImgItem2->SetSelect(0);
|
}
|
pImgItem->SetSelect(1);
|
m_pSelImg = &pImgItem->m_Img;
|
m_pSelectItem = pImgItem;
|
::SendMessage(GetParent()->m_hWnd,UM_CLK_ITEM_UPDATE, 0, NULL);
|
bUpdate =1;
|
break;
|
}
|
bUpdate =1;
|
}
|
}
|
}
|
return bUpdate;
|
}
|
|
|
|
void CImgListView::DeleteItemAll()
|
{
|
m_pSelectItem = NULL;
|
|
m_nAddItem =0;
|
if(m_ImgMap.empty())
|
return;
|
IMG_MAP::iterator it_img;
|
CString mapKey;
|
CPotoItem *pImgItem;
|
|
for(it_img = m_ImgMap.begin(); it_img !=m_ImgMap.end();it_img++)
|
{
|
mapKey = (*it_img).first;
|
pImgItem = (*it_img).second;
|
|
|
if(pImgItem->m_Img.IsNull() == FALSE)
|
{
|
pImgItem->m_Img.Destroy();
|
}
|
delete pImgItem;
|
}
|
m_ImgMap.clear();
|
}
|
|
void CImgListView::OnSize(UINT nType, int cx, int cy)
|
{
|
CScrollView::OnSize(nType, cx, cy);
|
|
CRect rc;
|
GetClientRect(rc);
|
cx = rc.Width();
|
cy = rc.Height();
|
|
int nX = ITEM_WIDTH + ITEM_ROW_MARJIN;
|
int nHalfX = nX >> 1;
|
m_nHItem = cx / nX;
|
|
if( (cx % nX) > nHalfX ) m_nHItem++;
|
|
if( m_nHItem <= 1 )
|
m_nHItem = 1;
|
|
|
if( m_nHItemOld != m_nHItem )
|
{
|
m_nHItemOld = m_nHItem;
|
UpdateItem();
|
SetPageSize();
|
}
|
}
|
|
void CImgListView::OnPaint()
|
{
|
CPaintDC dc(this); // device context for painting
|
|
|
|
CPoint ptScroll = GetScrollPosition();
|
dc.SetWindowOrg( ptScroll.x , ptScroll.y );
|
CRect rect;
|
GetClientRect(&rect);
|
|
|
|
CRect rcInvalid = dc.m_ps.rcPaint;
|
dc.DPtoLP( &rcInvalid );
|
|
CDC MemDC;
|
CBitmap MemBitmap,* pOldBitmap;
|
|
MemDC.CreateCompatibleDC( &dc );
|
MemBitmap.CreateCompatibleBitmap( &dc , rect.Width() , rect.Height() );
|
pOldBitmap = (CBitmap *)MemDC.SelectObject( &MemBitmap );
|
MemDC.FillRect( &rect , &m_BgBrush ); // ¹è°æ»öÀ¸·Î ¿ì¼± Ä¥ÇØÁÖ°í...
|
MemDC.SetWindowOrg( ptScroll.x , ptScroll.y ); // SetWindowOrg()
|
|
|
IMG_MAP::iterator it_img;
|
CString mapKey;
|
CPotoItem *pImgItem;
|
int i=0;
|
CRect tmpRc;
|
if(!m_ImgMap.empty())
|
{
|
for(it_img = m_ImgMap.begin(); it_img !=m_ImgMap.end();it_img++)
|
{
|
mapKey = (*it_img).first;
|
pImgItem = (*it_img).second;
|
tmpRc = pImgItem->m_rcImg;//=GetItemRect(i++);// rc ;
|
|
|
if( !tmpRc.IntersectRect( pImgItem->m_rcImg , rcInvalid ) )
|
{
|
//¼·Î °ãÄ¡´Â ºÎºÐÀÌ ¾ø´Ù´Â °ÍÀ» ³ªÅ¸³½´Ù.
|
//Áï ÇöÀç ¾ÆÀÌÅÛÀº ȸ鿡 ´Ù½Ã ±×¸®Áö ¾Ê´Â´Ù.
|
continue;
|
}
|
pImgItem->Draw(&MemDC,rcInvalid,pImgItem->m_rcImg);
|
}
|
}
|
dc.BitBlt( rcInvalid.left , rcInvalid.top , rcInvalid.Width() , rcInvalid.Height() , &MemDC , rcInvalid.left , rcInvalid.top , SRCCOPY );
|
MemDC.SelectObject( pOldBitmap );
|
MemDC.DeleteDC();
|
MemBitmap.DeleteObject();
|
|
}
|
|
BYTE* CImgListView::GetImagePoint()
|
{
|
return (BYTE*)m_pSelImg->GetBits();
|
}
|
|
TCHAR* CImgListView::GetSelectImgPath()
|
{
|
if(m_pSelectItem)
|
{
|
return m_pSelectItem->m_Path;
|
}
|
return _T("");
|
}
|
|
|
|
void CImgListView::OnLButtonDown(UINT nFlags, CPoint point)
|
{
|
CPoint ptScroll(point);
|
ptScroll += GetScrollPosition(); // ½ºÅ©·ÑµÈ ÁÂÇ¥¸¦ ´õÇØÁÖ°í...
|
|
if(SelectItemChk(ptScroll))
|
Invalidate(FALSE);//Invalidate();
|
|
CScrollView::OnLButtonDown(nFlags, point);
|
}
|
|
void CImgListView::OnLButtonDblClk(UINT nFlags, CPoint point)
|
{
|
if(SelectItemChk(point))
|
Invalidate(FALSE);
|
|
CScrollView::OnLButtonDblClk(nFlags, point);
|
}
|
|
|
|
|
BOOL CImgListView::OnEraseBkgnd(CDC* pDC)
|
{
|
// TODO: ¿©±â¿¡ ¸Þ½ÃÁö 󸮱â Äڵ带 Ãß°¡ ¹×/¶Ç´Â ±âº»°ªÀ» È£ÃâÇÕ´Ï´Ù.
|
CRect rect ;
|
GetClientRect(&rect);
|
pDC->FillRect(rect, &m_BgBrush);
|
return TRUE ;
|
return CScrollView::OnEraseBkgnd(pDC);
|
}
|
|
|
void CImgListView::UpdateView()
|
{
|
|
|
CDC * pDC = GetDC();
|
CRect rect;
|
GetClientRect(&rect);
|
|
CPoint ptScroll = GetScrollPosition();
|
pDC->SetWindowOrg(ptScroll.x,ptScroll.y);
|
//----------------------------------------------------
|
// Invalidate µÈ ¿µ¿ªÀÇ ÁÂÇ¥¸¦ ³í¸® ÁÂÇ¥°è·Î º¯ÈÇϱâ
|
// À§Çؼ ¾ò¾î¿Â´Ù.
|
//----------------------------------------------------
|
CRect rcInvalid;
|
GetClientRect(rcInvalid);
|
pDC->DPtoLP(&rcInvalid);
|
|
|
CDC MemDC;
|
CBitmap MemBitmap,* pOldBitmap;
|
|
MemDC.CreateCompatibleDC(pDC);
|
MemBitmap.CreateCompatibleBitmap(pDC , rect.Width() , rect.Height() );
|
pOldBitmap = (CBitmap *)MemDC.SelectObject( &MemBitmap );
|
//MemDC.FillRect( &rect , &m_BgBrush );
|
MemDC.SetWindowOrg( ptScroll.x , ptScroll.y );
|
|
|
IMG_MAP::iterator it_img;
|
CString mapKey;
|
CPotoItem *pImgItem;
|
int i=0;
|
CRect tmpRc;
|
if(!m_ImgMap.empty())
|
{
|
for(it_img = m_ImgMap.begin(); it_img !=m_ImgMap.end();it_img++)
|
{
|
mapKey = (*it_img).first;
|
pImgItem = (*it_img).second;
|
tmpRc = pImgItem->m_rcImg;
|
if( !tmpRc.IntersectRect( pImgItem->m_rcImg , rcInvalid ) )
|
{
|
//¼·Î °ãÄ¡´Â ºÎºÐÀÌ ¾ø´Ù´Â °ÍÀ» ³ªÅ¸³½´Ù.
|
//Áï ÇöÀç ¾ÆÀÌÅÛÀº ȸ鿡 ´Ù½Ã ±×¸®Áö ¾Ê´Â´Ù.
|
continue;
|
}
|
pImgItem->Draw(&MemDC,rcInvalid,pImgItem->m_rcImg);
|
}
|
}
|
pDC->BitBlt( rcInvalid.left ,rcInvalid.top , rcInvalid.Width() , rcInvalid.Height() , &MemDC , rcInvalid.left , rcInvalid.top , SRCCOPY );
|
MemDC.SelectObject( pOldBitmap );
|
MemDC.DeleteDC();
|
MemBitmap.DeleteObject();
|
|
ReleaseDC(pDC);
|
|
}
|
|
void CImgListView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
|
{
|
// TODO: ¿©±â¿¡ ¸Þ½ÃÁö 󸮱â Äڵ带 Ãß°¡ ¹×/¶Ç´Â ±âº»°ªÀ» È£ÃâÇÕ´Ï´Ù.
|
//UpdateView();
|
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
|
}
|
|
void CImgListView::OnDestroy()
|
{
|
CScrollView::OnDestroy();
|
DeleteItemAll();
|
}
|