// ImgListView.cpp : implementation file // #include "stdafx.h" #include "ImgListView.h" #include #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_s(m_Path, MAX_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 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(); }