// ShowSelPhoto2.cpp : implementation file // #include "stdafx.h" #include "ylgl.h" #include "ShowSelPhoto2.h" #include "ShowPic22.h" #include "JPEG.h" #include "ComparePhoto.h" using namespace helper_coffs; #define THUMBNAIL_WIDTH 100 #define THUMBNAIL_HEIGHT 90 unsigned __stdcall LoadThumbNail10(LPVOID lpParam); ShowSelPhoto2::ShowSelPhoto2(CWnd* pParent /*=NULL*/) : CDialog(ShowSelPhoto2::IDD, pParent) { m_bTerminate2 = false; m_bRunning2 = false; m_hThread2 = NULL; } void ShowSelPhoto2::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST4, m_List4); } BEGIN_MESSAGE_MAP(ShowSelPhoto2, CDialog) ON_WM_DESTROY() ON_NOTIFY(NM_DBLCLK, IDC_LIST4, OnDblclkList4) END_MESSAGE_MAP() BOOL ShowSelPhoto2::OnInitDialog() { CDialog::OnInitDialog(); CRect rc; rc = m_rc; rc.right -= m_rc.Width ()*0.5; MoveWindow(rc); GetClientRect(rc); m_List4.MoveWindow (rc); m_ImageListThumb2.Create(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, ILC_COLOR24, 0, 1); m_List4.SetImageList(&m_ImageListThumb2, LVSIL_NORMAL); #if USE_SHARE_FLORD TCHAR szShare[MAX_PATH] = {0}; TCHAR szOrdePath[MAX_PATH] = {0}; CStringArray originalDirArr; //ԭƬĿ¼ CStringArray earlyDirArr; //����Ŀ¼ #ifdef VC60 sprintf(szShare, _T("\\\\%s\\%s"), g_serverbak, _T("�ͻ�ԭƬ(��������)$")); sprintf(szOrdePath, _T("%s\\%s"), szShare, m_id); #else _stprintf_s(szShare, MAX_PATH, _T("\\\\%s\\%s"), g_serverbak, _T("�ͻ�ԭƬ(��������)$")); _stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s"), szShare, m_id); #endif // ����ԭƬ; if ( PathFileExists(szOrdePath) ) originalDirArr.Add(CString(szOrdePath)); // 3.2.������������Ŀ¼; int nSize = g_aryOfSharePathInfo.GetSize(); int i = 0; for ( i = 0; i < nSize; i++) { if ( 1 == atoi(g_aryOfSharePathInfo.ElementAt(i).ElementAt(5)) ) { // ��һ������������Ŀ¼; #ifdef VC60 sprintf(szShare, "%s", g_aryOfSharePathInfo.ElementAt(i).ElementAt(2)); sprintf(szOrdePath, "%s\\%s", szShare, m_id); #else _stprintf_s(szShare, MAX_PATH, _T("%s"), g_aryOfSharePathInfo.ElementAt(i).ElementAt(2)); _stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s"), szShare, m_id); #endif if ( PathFileExists(szOrdePath) ) originalDirArr.Add(CString(szOrdePath)); } } // ����dzɳ���ϵ����ϵ����Ϊ�ջ�ȫ��; #ifdef VC60 sprintf(szShare, _T("\\\\%s\\%s"), g_serverbak, "�õ�Ƭ(��������)$"); #else _stprintf_s(szShare, MAX_PATH, _T("\\\\%s\\%s"), g_serverbak, "�õ�Ƭ(��������)$"); #endif // ���dzɳ���ϵ,����Ƭ����Ŀ¼; ���ǻ�ɴ��,����û�˾�����Ŀ¼; #ifdef VC60 if ( m_bGrowthTX && ( !m_seltxname.IsEmpty() && m_seltxname != _T("ȫ��")) ) sprintf(szOrdePath, _T("%s\\%s\\%s"), szShare, m_id, m_seltxname); else sprintf(szOrdePath, _T("%s\\%s"), szShare, m_id); #else if ( m_bGrowthTX && ( !m_seltxname.IsEmpty() && m_seltxname != _T("ȫ��")) ) _stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s\\%s"), szShare, m_id, m_seltxname); else _stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s"), szShare, m_id); #endif if ( PathFileExists(szOrdePath) ) earlyDirArr.Add(CString(szOrdePath)); // 2.3.������������Ŀ¼�µij�����Ŀ¼; nSize = g_aryOfSharePathInfo.GetSize(); i=0; for (i = 0; i < nSize; i++) { if ( 2 == atoi(g_aryOfSharePathInfo.ElementAt(i).ElementAt(5)) ) { // ��һ������������Ŀ¼; // ����dzɳ���ϵ����ϵ����Ϊ�ջ�ȫ��; #ifdef VC60 sprintf(szShare,_T("%s"), g_aryOfSharePathInfo.ElementAt(i).ElementAt(2)); // ���dzɳ���ϵ,����Ƭ����Ŀ¼; ���ǻ�ɴ��,����û�˾�����Ŀ¼; if ( m_bGrowthTX && ( !m_seltxname.IsEmpty() && m_seltxname != _T("ȫ��")) ) sprintf(szOrdePath, _T("%s\\%s\\%s"), szShare, m_id, m_seltxname); else sprintf(szOrdePath, _T("%s\\%s"), szShare, m_id); #else _stprintf_s(szShare, MAX_PATH, _T("%s"), g_aryOfSharePathInfo.ElementAt(i).ElementAt(2)); // ���dzɳ���ϵ,����Ƭ����Ŀ¼; ���ǻ�ɴ��,����û�˾�����Ŀ¼; if ( m_bGrowthTX && ( !m_seltxname.IsEmpty() && m_seltxname != _T("ȫ��")) ) _stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s\\%s"), szShare, m_id, m_seltxname); else _stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s"), szShare, m_id); #endif if ( PathFileExists(szOrdePath) ) earlyDirArr.Add(CString(szOrdePath)); } } //ԭƬ for(i=0; i<originalDirArr.GetSize(); i++) LoadPhotos(originalDirArr.ElementAt(i), &m_originalPathArr, &m_originalNameArr); //���� for(i=0; i<earlyDirArr.GetSize(); i++) LoadPhotos(earlyDirArr.ElementAt(i), &m_earlyPathArr, &m_earlyNameArr); if(m_bRunning2) return TRUE; //��������Ƭ���ӵ�һ�������� CString filePath = _T(""); m_vFileName2.clear(); i = 0; BOOL bOriginalFinish = FALSE; BOOL bEarlyFinish = FALSE; while(1) { //ԭƬ if(i < m_originalPathArr.GetSize()) { CString strPath = m_originalPathArr.ElementAt(i); m_patharray1.Add(strPath); m_vFileName2.push_back(strPath); m_patharray2.Add(m_originalNameArr.ElementAt(i)); } else bOriginalFinish = TRUE; //���� if(i < m_earlyPathArr.GetSize()) { CString strPath = m_earlyPathArr.ElementAt(i); m_patharray1.Add(strPath); m_vFileName2.push_back(strPath); m_patharray2.Add(m_earlyNameArr.ElementAt(i) + _T("-����")); } else bEarlyFinish = TRUE; if(bOriginalFinish && bEarlyFinish) break; ++i; } TerminateThread2(); m_hThread2 = (HANDLE)_beginthreadex(NULL,0, LoadThumbNail10,(LPVOID)this,0/* CREATE_SUSPENDED*/,&m_dwThreadID2); m_bRunning2 = true; #else m_path=g_path1+"\\"; m_path+=m_id; m_path +="\\"; LoadPhotos(m_path); #endif //#if USE_SHARE_FLORD return TRUE; } unsigned __stdcall LoadThumbNail10(LPVOID lpParam) { ShowSelPhoto2 *pDlg=(ShowSelPhoto2*)lpParam; CImageList* pImgList=&pDlg->m_ImageListThumb2; CListCtrl *ListCtrl=&pDlg->m_List4; try { // reset our image list for(int i=0; i<pImgList->GetImageCount(); i++) pImgList->Remove(i); // remove all items from list view ListCtrl->DeleteAllItems(); pImgList->SetImageCount(pDlg->m_vFileName2.size()); TCHAR path[MAX_PATH]; vector<CString>::iterator iter; // Set redraw to FALSE to avoid flickering during adding new items ListCtrl->SetRedraw(FALSE); int nIndex=0; CString str, spath; for(iter=pDlg->m_vFileName2.begin(); iter!=pDlg->m_vFileName2.end() && pDlg->m_bTerminate2!=true; iter++, nIndex++) { ListCtrl->InsertItem(nIndex, pDlg->m_patharray2.ElementAt (nIndex), nIndex); } ListCtrl->SetRedraw(TRUE); ListCtrl->Invalidate(); const float fRatio=(float)THUMBNAIL_HEIGHT/THUMBNAIL_WIDTH; int XDest, YDest, nDestWidth, nDestHeight; nIndex=0; SolidBrush whitebrush(Color(255,255,255,255)); for(iter=pDlg->m_vFileName2.begin(); iter!=pDlg->m_vFileName2.end() && pDlg->m_bTerminate2!=true; iter++, nIndex++) { // Load Image File Image *image=NULL; Bitmap *pBmp=NULL; str=*iter; spath=str.Left (str.ReverseFind ('\\')+1); spath+="s"; spath+=str.Right (str.GetLength ()-str.ReverseFind ('\\')-1); if (PathFileExists(spath)) ::LoadImageFromBuf (&image, spath); else ::LoadImageFromBuf (&image, str); int orientation=GetOrientation(image); if(orientation==8) image->RotateFlip( Rotate270FlipNone ); else if(orientation==6) image->RotateFlip( Rotate90FlipNone ); if(image->GetWidth()==0) continue; // Calculate Rect to fit to canvas const float fImgRatio=(float)image->GetHeight()/image->GetWidth(); if(fImgRatio > fRatio) { nDestWidth=THUMBNAIL_HEIGHT/fImgRatio; XDest=(THUMBNAIL_WIDTH-nDestWidth)/2; YDest=0; nDestHeight=THUMBNAIL_HEIGHT; } else { XDest=0; nDestWidth=THUMBNAIL_WIDTH; nDestHeight=THUMBNAIL_WIDTH*fImgRatio; YDest=(THUMBNAIL_HEIGHT-nDestHeight)/2; } pBmp=new Bitmap(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, PixelFormat24bppRGB ); Graphics graph2(pBmp); graph2.Clear(Color(255,192,192,192)); graph2.FillRectangle (&whitebrush,1, 1, THUMBNAIL_WIDTH-2, THUMBNAIL_HEIGHT-2); Graphics graph(pBmp); Rect desRect(XDest, YDest, nDestWidth, nDestHeight); // Draw Image graph.DrawImage(image, desRect, 0,0,image->GetWidth(),image->GetHeight(),UnitPixel); delete image; // Attach to Bitmap and Replace image in CImageList CBitmap bitmap; HBITMAP hbmp; pBmp->GetHBITMAP(Color(255,255,255,255), &hbmp); bitmap.Attach(hbmp); pImgList->Replace(nIndex, &bitmap, NULL); delete pBmp; // Redraw only a current item for removing flickering and fast speed. ListCtrl->RedrawItems(nIndex, nIndex); // Release used DC and Object } ListCtrl->Invalidate(); pDlg->m_bRunning2=false; pDlg->m_bTerminate2=false; _endthreadex( 0 ); return 0; } catch(...) { ListCtrl->Invalidate(); pDlg->m_bRunning2=false; pDlg->m_bTerminate2=false; _endthreadex( 0 ); } return true; } void ShowSelPhoto2::OnDestroy() { TerminateThread2(); CDialog::OnDestroy(); } #if USE_SHARE_FLORD void ShowSelPhoto2::LoadPhotos(CString& strDir, CStringArray* pPathArr, CStringArray* pPhotoNameArr) { if(strDir == _T("") || pPathArr == NULL || pPhotoNameArr == NULL) return; pPathArr->RemoveAll(); pPhotoNameArr->RemoveAll(); strDir.MakeLower(); CStringArray dirarray; CString str = _T(""); { //����Ŀ¼ ffsco o; o.dirs(1); //1������Ŀ¼, 0��������Ŀ¼ o.find(LPCSTR(strDir), LPCSTR("*.*")); ffsco::typeT coo; ffsco::typeT::iterator it; coo = o.co_dir(); for (it = coo.begin(); coo.end() != it; it ++) { str=(*it).c_str(); if(FindArray(&dirarray, str) == -1) dirarray.Add (str); } } { //������Ƭ CString spath(_T("")), name(_T("")); for(int i=0; i<dirarray.GetSize (); i++) { ffsco o; o.dirs(1); o.find(LPCSTR(dirarray.ElementAt (i)), LPCSTR("*.jpg")); ffsco::typeT coo; ffsco::typeT::iterator it; coo = o.co_file(); for (it = coo.begin(); coo.end() != it; it++) { str = (*it).c_str(); if(str.GetAt(str.ReverseFind('\\') + 1) == 's')continue; if(str.GetAt(str.ReverseFind('\\') + 1) == 'm')continue; str.MakeLower(); pPathArr->Add(str); { spath.Empty(); spath = str.Left(str.ReverseFind('\\')); if(spath != strDir) { spath = spath.Right(spath.GetLength() - strDir.GetLength() - 1); name = str.Right(str.GetLength() - str.ReverseFind('\\')); name = spath + name.Left (name.ReverseFind('.')); } else { name = str.Right(str.GetLength() - str.ReverseFind('\\') - 1); name = name.Left (name.ReverseFind('.')); } pPhotoNameArr->Add(name); } } } } } #else void ShowSelPhoto2::LoadPhotos(CString& strDir) { if(strDir == _T("")) return; m_patharray1.RemoveAll (); strDir.MakeLower (); CStringArray dirarray; CString str; if(1) { //����Ŀ¼ ffsco o; o.dirs(1); //1������Ŀ¼, 0��������Ŀ¼ o.find(LPCSTR(strDir), LPCSTR("*.*")); ffsco::typeT coo; ffsco::typeT::iterator it; coo = o.co_dir(); for (it = coo.begin(); coo.end() != it; it ++) { str=(*it).c_str(); if(FindArray(&dirarray, str)==-1) dirarray.Add (str); } } if(1) { //������Ƭ CString spath,name; for(int i=0; i<dirarray.GetSize (); i++) { ffsco o; o.dirs(1); o.find(LPCSTR(dirarray.ElementAt (i)), LPCSTR("*.jpg")); ffsco::typeT coo; ffsco::typeT::iterator it; coo = o.co_file(); for (it = coo.begin(); coo.end() != it; it++) { str=(*it).c_str(); if(str.GetAt (str.ReverseFind ('\\')+1)=='s')continue; if(str.GetAt (str.ReverseFind ('\\')+1)=='m')continue; str.MakeLower (); m_patharray1.Add(str); { spath.Empty (); if(str.Left (str.ReverseFind ('\\')+1) != strDir) { spath=str.Left (str.ReverseFind ('\\')+1); spath= spath.Right (spath.GetLength ()-strDir.GetLength ()); } name=str.Right (str.GetLength ()-str.ReverseFind ('\\')-1); name=spath+name.Left (name.GetLength ()-4); m_patharray2.Add(name); } str.Replace ("�ͻ�ԭƬ", "�õ�Ƭ"); int pos1=str.Find (m_id); pos1+=m_id.GetLength (); int pos2=str.ReverseFind ('\\'); str=str.Left (pos1)+str.Right (str.GetLength ()-pos2); if(::PathFileExists (str)) { m_patharray1.Add (str); m_patharray2.Add (name+"-��Ƭ"); } } } } if(m_bRunning2)return; CStringArray *pArray=&m_patharray1; m_vFileName2.clear(); for(int i=0; i<pArray->GetSize (); i++) { CString filePath=pArray->ElementAt (i); filePath.MakeLower(); m_vFileName2.push_back(filePath); } TerminateThread2(); m_hThread2 = (HANDLE)_beginthreadex(NULL,0, LoadThumbNail10,(LPVOID)this,0/* CREATE_SUSPENDED*/,&m_dwThreadID2); m_bRunning2=true; } #endif //#if USE_SHARE_FLORD BOOL ShowSelPhoto2::TerminateThread2() { if ( !m_bRunning2 ) return TRUE; m_bTerminate2=true; for( ; ; ) { if ( ::WaitForSingleObject(m_hThread2, 0) == WAIT_OBJECT_0 ) break; MSG msg; while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) { if (!AfxGetApp()->PumpMessage()) break; } } ::CloseHandle(m_hThread2); return TRUE; } void ShowSelPhoto2::OnDblclkList4(NMHDR* pNMHDR, LRESULT* pResult) { POSITION pos; pos=m_List4.GetFirstSelectedItemPosition(); if(pos==NULL) { return; } int iItem=m_List4.GetNextSelectedItem(pos); ShowPic22 dlg; dlg.m_nCurImgPos=iItem; dlg.m_AryOfImgPath=&m_patharray1; dlg.DoModal (); *pResult = 0; } BOOL ShowSelPhoto2::PreTranslateMessage(MSG* pMsg) { if(pMsg->message==WM_KEYDOWN) { switch (pMsg->wParam) { case VK_F1: { ShowWindow(0); } break; case VK_RETURN: { POSITION pos; pos=m_List4.GetFirstSelectedItemPosition(); if(pos==NULL) { return 1; } CArray<int,int>posarray; int iItem=m_List4.GetNextSelectedItem(pos); posarray.Add (iItem); while (pos) { int iItem=m_List4.GetNextSelectedItem(pos); posarray.Add (iItem); if(posarray.GetSize ()>1)break; } if(posarray.GetSize ()>=2) { CComparePhoto dlg; dlg.m_path1=m_patharray1.ElementAt (posarray.ElementAt(0)); dlg.m_path2=m_patharray1.ElementAt (posarray.ElementAt(1)); dlg.DoModal(); return 1; } } return 1; } } return CDialog::PreTranslateMessage(pMsg); }