ShowSelPhoto2.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. // ShowSelPhoto2.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ylgl.h"
  5. #include "ShowSelPhoto2.h"
  6. #include "ShowPic22.h"
  7. #include "JPEG.h"
  8. #include "ComparePhoto.h"
  9. using namespace helper_coffs;
  10. #define THUMBNAIL_WIDTH 100
  11. #define THUMBNAIL_HEIGHT 90
  12. unsigned __stdcall LoadThumbNail10(LPVOID lpParam);
  13. ShowSelPhoto2::ShowSelPhoto2(CWnd* pParent /*=NULL*/) : CDialog(ShowSelPhoto2::IDD, pParent)
  14. {
  15. m_bTerminate2 = false;
  16. m_bRunning2 = false;
  17. m_hThread2 = NULL;
  18. }
  19. void ShowSelPhoto2::DoDataExchange(CDataExchange* pDX)
  20. {
  21. CDialog::DoDataExchange(pDX);
  22. DDX_Control(pDX, IDC_LIST4, m_List4);
  23. }
  24. BEGIN_MESSAGE_MAP(ShowSelPhoto2, CDialog)
  25. ON_WM_DESTROY()
  26. ON_NOTIFY(NM_DBLCLK, IDC_LIST4, OnDblclkList4)
  27. END_MESSAGE_MAP()
  28. BOOL ShowSelPhoto2::OnInitDialog()
  29. {
  30. CDialog::OnInitDialog();
  31. CRect rc;
  32. rc = m_rc;
  33. rc.right -= m_rc.Width ()*0.5;
  34. MoveWindow(rc);
  35. GetClientRect(rc);
  36. m_List4.MoveWindow (rc);
  37. m_ImageListThumb2.Create(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, ILC_COLOR24, 0, 1);
  38. m_List4.SetImageList(&m_ImageListThumb2, LVSIL_NORMAL);
  39. #if USE_SHARE_FLORD
  40. TCHAR szShare[MAX_PATH] = {0};
  41. TCHAR szOrdePath[MAX_PATH] = {0};
  42. CStringArray originalDirArr; //原片目录
  43. CStringArray earlyDirArr; //初修目录
  44. #ifdef VC60
  45. sprintf(szShare, _T("\\\\%s\\%s"), g_serverbak, _T("客户原片(管理软件)$"));
  46. sprintf(szOrdePath, _T("%s\\%s"), szShare, m_id);
  47. #else
  48. _stprintf_s(szShare, MAX_PATH, _T("\\\\%s\\%s"), g_serverbak, _T("客户原片(管理软件)$"));
  49. _stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s"), szShare, m_id);
  50. #endif
  51. // 存在原片;
  52. if ( PathFileExists(szOrdePath) )
  53. originalDirArr.Add(CString(szOrdePath));
  54. // 3.2.查找其他共享目录;
  55. int nSize = g_aryOfSharePathInfo.GetSize();
  56. int i = 0;
  57. for ( i = 0; i < nSize; i++)
  58. {
  59. if ( 1 == atoi(g_aryOfSharePathInfo.ElementAt(i).ElementAt(5)) )
  60. {
  61. // 逐一加载其他共享目录;
  62. #ifdef VC60
  63. sprintf(szShare, "%s", g_aryOfSharePathInfo.ElementAt(i).ElementAt(2));
  64. sprintf(szOrdePath, "%s\\%s", szShare, m_id);
  65. #else
  66. _stprintf_s(szShare, MAX_PATH, _T("%s"), g_aryOfSharePathInfo.ElementAt(i).ElementAt(2));
  67. _stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s"), szShare, m_id);
  68. #endif
  69. if ( PathFileExists(szOrdePath) )
  70. originalDirArr.Add(CString(szOrdePath));
  71. }
  72. }
  73. // 如果是成长套系且套系名不为空或全部;
  74. #ifdef VC60
  75. sprintf(szShare, _T("\\\\%s\\%s"), g_serverbak, "修好的片(管理软件)$");
  76. #else
  77. _stprintf_s(szShare, MAX_PATH, _T("\\\\%s\\%s"), g_serverbak, "修好的片(管理软件)$");
  78. #endif
  79. // 若是成长套系,初修片有子目录; 若是婚纱版,初修没了景点了目录;
  80. #ifdef VC60
  81. if ( m_bGrowthTX && ( !m_seltxname.IsEmpty() && m_seltxname != _T("全部")) )
  82. sprintf(szOrdePath, _T("%s\\%s\\%s"), szShare, m_id, m_seltxname);
  83. else
  84. sprintf(szOrdePath, _T("%s\\%s"), szShare, m_id);
  85. #else
  86. if ( m_bGrowthTX && ( !m_seltxname.IsEmpty() && m_seltxname != _T("全部")) )
  87. _stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s\\%s"), szShare, m_id, m_seltxname);
  88. else
  89. _stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s"), szShare, m_id);
  90. #endif
  91. if ( PathFileExists(szOrdePath) )
  92. earlyDirArr.Add(CString(szOrdePath));
  93. // 2.3.查找其他共享目录下的初修订单目录;
  94. nSize = g_aryOfSharePathInfo.GetSize();
  95. i=0;
  96. for (i = 0; i < nSize; i++)
  97. {
  98. if ( 2 == atoi(g_aryOfSharePathInfo.ElementAt(i).ElementAt(5)) )
  99. {
  100. // 逐一加载其他共享目录;
  101. // 如果是成长套系且套系名不为空或全部;
  102. #ifdef VC60
  103. sprintf(szShare,_T("%s"), g_aryOfSharePathInfo.ElementAt(i).ElementAt(2));
  104. // 若是成长套系,初修片有子目录; 若是婚纱版,初修没了景点了目录;
  105. if ( m_bGrowthTX && ( !m_seltxname.IsEmpty() && m_seltxname != _T("全部")) )
  106. sprintf(szOrdePath, _T("%s\\%s\\%s"), szShare, m_id, m_seltxname);
  107. else
  108. sprintf(szOrdePath, _T("%s\\%s"), szShare, m_id);
  109. #else
  110. _stprintf_s(szShare, MAX_PATH, _T("%s"), g_aryOfSharePathInfo.ElementAt(i).ElementAt(2));
  111. // 若是成长套系,初修片有子目录; 若是婚纱版,初修没了景点了目录;
  112. if ( m_bGrowthTX && ( !m_seltxname.IsEmpty() && m_seltxname != _T("全部")) )
  113. _stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s\\%s"), szShare, m_id, m_seltxname);
  114. else
  115. _stprintf_s(szOrdePath, MAX_PATH, _T("%s\\%s"), szShare, m_id);
  116. #endif
  117. if ( PathFileExists(szOrdePath) )
  118. earlyDirArr.Add(CString(szOrdePath));
  119. }
  120. }
  121. //原片
  122. for(i=0; i<originalDirArr.GetSize(); i++)
  123. LoadPhotos(originalDirArr.ElementAt(i), &m_originalPathArr, &m_originalNameArr);
  124. //初修
  125. for(i=0; i<earlyDirArr.GetSize(); i++)
  126. LoadPhotos(earlyDirArr.ElementAt(i), &m_earlyPathArr, &m_earlyNameArr);
  127. if(m_bRunning2)
  128. return TRUE;
  129. //将所有相片添加到一个集合里
  130. CString filePath = _T("");
  131. m_vFileName2.clear();
  132. i = 0;
  133. BOOL bOriginalFinish = FALSE;
  134. BOOL bEarlyFinish = FALSE;
  135. while(1)
  136. {
  137. //原片
  138. if(i < m_originalPathArr.GetSize())
  139. {
  140. CString strPath = m_originalPathArr.ElementAt(i);
  141. m_patharray1.Add(strPath);
  142. m_vFileName2.push_back(strPath);
  143. m_patharray2.Add(m_originalNameArr.ElementAt(i));
  144. }
  145. else
  146. bOriginalFinish = TRUE;
  147. //初修
  148. if(i < m_earlyPathArr.GetSize())
  149. {
  150. CString strPath = m_earlyPathArr.ElementAt(i);
  151. m_patharray1.Add(strPath);
  152. m_vFileName2.push_back(strPath);
  153. m_patharray2.Add(m_earlyNameArr.ElementAt(i) + _T("-初修"));
  154. }
  155. else
  156. bEarlyFinish = TRUE;
  157. if(bOriginalFinish && bEarlyFinish)
  158. break;
  159. ++i;
  160. }
  161. TerminateThread2();
  162. m_hThread2 = (HANDLE)_beginthreadex(NULL,0, LoadThumbNail10,(LPVOID)this,0/* CREATE_SUSPENDED*/,&m_dwThreadID2);
  163. m_bRunning2 = true;
  164. #else
  165. m_path=g_path1+"\\";
  166. m_path+=m_id;
  167. m_path +="\\";
  168. LoadPhotos(m_path);
  169. #endif //#if USE_SHARE_FLORD
  170. return TRUE;
  171. }
  172. unsigned __stdcall LoadThumbNail10(LPVOID lpParam)
  173. {
  174. ShowSelPhoto2 *pDlg=(ShowSelPhoto2*)lpParam;
  175. CImageList* pImgList=&pDlg->m_ImageListThumb2;
  176. CListCtrl *ListCtrl=&pDlg->m_List4;
  177. try
  178. {
  179. // reset our image list
  180. for(int i=0; i<pImgList->GetImageCount(); i++)
  181. pImgList->Remove(i);
  182. // remove all items from list view
  183. ListCtrl->DeleteAllItems();
  184. pImgList->SetImageCount(pDlg->m_vFileName2.size());
  185. TCHAR path[MAX_PATH];
  186. vector<CString>::iterator iter;
  187. // Set redraw to FALSE to avoid flickering during adding new items
  188. ListCtrl->SetRedraw(FALSE);
  189. int nIndex=0;
  190. CString str, spath;
  191. for(iter=pDlg->m_vFileName2.begin(); iter!=pDlg->m_vFileName2.end() && pDlg->m_bTerminate2!=true; iter++, nIndex++)
  192. {
  193. ListCtrl->InsertItem(nIndex, pDlg->m_patharray2.ElementAt (nIndex), nIndex);
  194. }
  195. ListCtrl->SetRedraw(TRUE);
  196. ListCtrl->Invalidate();
  197. const float fRatio=(float)THUMBNAIL_HEIGHT/THUMBNAIL_WIDTH;
  198. int XDest, YDest, nDestWidth, nDestHeight;
  199. nIndex=0;
  200. SolidBrush whitebrush(Color(255,255,255,255));
  201. for(iter=pDlg->m_vFileName2.begin(); iter!=pDlg->m_vFileName2.end() && pDlg->m_bTerminate2!=true; iter++, nIndex++)
  202. {
  203. // Load Image File
  204. Image *image=NULL;
  205. Bitmap *pBmp=NULL;
  206. str=*iter;
  207. spath=str.Left (str.ReverseFind ('\\')+1);
  208. spath+="s";
  209. spath+=str.Right (str.GetLength ()-str.ReverseFind ('\\')-1);
  210. if (PathFileExists(spath))
  211. ::LoadImageFromBuf (&image, spath);
  212. else
  213. ::LoadImageFromBuf (&image, str);
  214. int orientation=GetOrientation(image);
  215. if(orientation==8)
  216. image->RotateFlip( Rotate270FlipNone );
  217. else if(orientation==6)
  218. image->RotateFlip( Rotate90FlipNone );
  219. if(image->GetWidth()==0)
  220. continue;
  221. // Calculate Rect to fit to canvas
  222. const float fImgRatio=(float)image->GetHeight()/image->GetWidth();
  223. if(fImgRatio > fRatio)
  224. {
  225. nDestWidth=THUMBNAIL_HEIGHT/fImgRatio;
  226. XDest=(THUMBNAIL_WIDTH-nDestWidth)/2;
  227. YDest=0;
  228. nDestHeight=THUMBNAIL_HEIGHT;
  229. }
  230. else
  231. {
  232. XDest=0;
  233. nDestWidth=THUMBNAIL_WIDTH;
  234. nDestHeight=THUMBNAIL_WIDTH*fImgRatio;
  235. YDest=(THUMBNAIL_HEIGHT-nDestHeight)/2;
  236. }
  237. pBmp=new Bitmap(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, PixelFormat24bppRGB );
  238. Graphics graph2(pBmp);
  239. graph2.Clear(Color(255,192,192,192));
  240. graph2.FillRectangle (&whitebrush,1, 1, THUMBNAIL_WIDTH-2, THUMBNAIL_HEIGHT-2);
  241. Graphics graph(pBmp);
  242. Rect desRect(XDest, YDest, nDestWidth, nDestHeight);
  243. // Draw Image
  244. graph.DrawImage(image, desRect, 0,0,image->GetWidth(),image->GetHeight(),UnitPixel);
  245. delete image;
  246. // Attach to Bitmap and Replace image in CImageList
  247. CBitmap bitmap;
  248. HBITMAP hbmp;
  249. pBmp->GetHBITMAP(Color(255,255,255,255), &hbmp);
  250. bitmap.Attach(hbmp);
  251. pImgList->Replace(nIndex, &bitmap, NULL);
  252. delete pBmp;
  253. // Redraw only a current item for removing flickering and fast speed.
  254. ListCtrl->RedrawItems(nIndex, nIndex);
  255. // Release used DC and Object
  256. }
  257. ListCtrl->Invalidate();
  258. pDlg->m_bRunning2=false;
  259. pDlg->m_bTerminate2=false;
  260. _endthreadex( 0 );
  261. return 0;
  262. }
  263. catch(...)
  264. {
  265. ListCtrl->Invalidate();
  266. pDlg->m_bRunning2=false;
  267. pDlg->m_bTerminate2=false;
  268. _endthreadex( 0 );
  269. }
  270. return true;
  271. }
  272. void ShowSelPhoto2::OnDestroy()
  273. {
  274. TerminateThread2();
  275. CDialog::OnDestroy();
  276. }
  277. #if USE_SHARE_FLORD
  278. void ShowSelPhoto2::LoadPhotos(CString& strDir, CStringArray* pPathArr, CStringArray* pPhotoNameArr)
  279. {
  280. if(strDir == _T("") || pPathArr == NULL || pPhotoNameArr == NULL)
  281. return;
  282. pPathArr->RemoveAll();
  283. pPhotoNameArr->RemoveAll();
  284. strDir.MakeLower();
  285. CStringArray dirarray;
  286. CString str = _T("");
  287. {
  288. //查找目录
  289. ffsco o;
  290. o.dirs(1); //1查找子目录, 0不查找子目录
  291. o.find(LPCSTR(strDir), LPCSTR("*.*"));
  292. ffsco::typeT coo;
  293. ffsco::typeT::iterator it;
  294. coo = o.co_dir();
  295. for (it = coo.begin(); coo.end() != it; it ++)
  296. {
  297. str=(*it).c_str();
  298. if(FindArray(&dirarray, str) == -1)
  299. dirarray.Add (str);
  300. }
  301. }
  302. {
  303. //查找相片
  304. CString spath(_T("")), name(_T(""));
  305. for(int i=0; i<dirarray.GetSize (); i++)
  306. {
  307. ffsco o;
  308. o.dirs(1);
  309. o.find(LPCSTR(dirarray.ElementAt (i)), LPCSTR("*.jpg"));
  310. ffsco::typeT coo;
  311. ffsco::typeT::iterator it;
  312. coo = o.co_file();
  313. for (it = coo.begin(); coo.end() != it; it++)
  314. {
  315. str = (*it).c_str();
  316. if(str.GetAt(str.ReverseFind('\\') + 1) == 's')continue;
  317. if(str.GetAt(str.ReverseFind('\\') + 1) == 'm')continue;
  318. str.MakeLower();
  319. pPathArr->Add(str);
  320. {
  321. spath.Empty();
  322. spath = str.Left(str.ReverseFind('\\'));
  323. if(spath != strDir)
  324. {
  325. spath = spath.Right(spath.GetLength() - strDir.GetLength() - 1);
  326. name = str.Right(str.GetLength() - str.ReverseFind('\\'));
  327. name = spath + name.Left (name.ReverseFind('.'));
  328. }
  329. else
  330. {
  331. name = str.Right(str.GetLength() - str.ReverseFind('\\') - 1);
  332. name = name.Left (name.ReverseFind('.'));
  333. }
  334. pPhotoNameArr->Add(name);
  335. }
  336. }
  337. }
  338. }
  339. }
  340. #else
  341. void ShowSelPhoto2::LoadPhotos(CString& strDir)
  342. {
  343. if(strDir == _T(""))
  344. return;
  345. m_patharray1.RemoveAll ();
  346. strDir.MakeLower ();
  347. CStringArray dirarray;
  348. CString str;
  349. if(1)
  350. {
  351. //查找目录
  352. ffsco o;
  353. o.dirs(1); //1查找子目录, 0不查找子目录
  354. o.find(LPCSTR(strDir), LPCSTR("*.*"));
  355. ffsco::typeT coo;
  356. ffsco::typeT::iterator it;
  357. coo = o.co_dir();
  358. for (it = coo.begin(); coo.end() != it; it ++)
  359. {
  360. str=(*it).c_str();
  361. if(FindArray(&dirarray, str)==-1)
  362. dirarray.Add (str);
  363. }
  364. }
  365. if(1)
  366. {
  367. //查找相片
  368. CString spath,name;
  369. for(int i=0; i<dirarray.GetSize (); i++)
  370. {
  371. ffsco o;
  372. o.dirs(1);
  373. o.find(LPCSTR(dirarray.ElementAt (i)), LPCSTR("*.jpg"));
  374. ffsco::typeT coo;
  375. ffsco::typeT::iterator it;
  376. coo = o.co_file();
  377. for (it = coo.begin(); coo.end() != it; it++)
  378. {
  379. str=(*it).c_str();
  380. if(str.GetAt (str.ReverseFind ('\\')+1)=='s')continue;
  381. if(str.GetAt (str.ReverseFind ('\\')+1)=='m')continue;
  382. str.MakeLower ();
  383. m_patharray1.Add(str);
  384. {
  385. spath.Empty ();
  386. if(str.Left (str.ReverseFind ('\\')+1) != strDir)
  387. {
  388. spath=str.Left (str.ReverseFind ('\\')+1);
  389. spath= spath.Right (spath.GetLength ()-strDir.GetLength ());
  390. }
  391. name=str.Right (str.GetLength ()-str.ReverseFind ('\\')-1);
  392. name=spath+name.Left (name.GetLength ()-4);
  393. m_patharray2.Add(name);
  394. }
  395. str.Replace ("客户原片", "修好的片");
  396. int pos1=str.Find (m_id);
  397. pos1+=m_id.GetLength ();
  398. int pos2=str.ReverseFind ('\\');
  399. str=str.Left (pos1)+str.Right (str.GetLength ()-pos2);
  400. if(::PathFileExists (str))
  401. {
  402. m_patharray1.Add (str);
  403. m_patharray2.Add (name+"-修片");
  404. }
  405. }
  406. }
  407. }
  408. if(m_bRunning2)return;
  409. CStringArray *pArray=&m_patharray1;
  410. m_vFileName2.clear();
  411. for(int i=0; i<pArray->GetSize (); i++)
  412. {
  413. CString filePath=pArray->ElementAt (i);
  414. filePath.MakeLower();
  415. m_vFileName2.push_back(filePath);
  416. }
  417. TerminateThread2();
  418. m_hThread2 = (HANDLE)_beginthreadex(NULL,0, LoadThumbNail10,(LPVOID)this,0/* CREATE_SUSPENDED*/,&m_dwThreadID2);
  419. m_bRunning2=true;
  420. }
  421. #endif //#if USE_SHARE_FLORD
  422. BOOL ShowSelPhoto2::TerminateThread2()
  423. {
  424. if ( !m_bRunning2 )
  425. return TRUE;
  426. m_bTerminate2=true;
  427. for( ; ; )
  428. {
  429. if ( ::WaitForSingleObject(m_hThread2, 0) == WAIT_OBJECT_0 )
  430. break;
  431. MSG msg;
  432. while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
  433. {
  434. if (!AfxGetApp()->PumpMessage())
  435. break;
  436. }
  437. }
  438. ::CloseHandle(m_hThread2);
  439. return TRUE;
  440. }
  441. void ShowSelPhoto2::OnDblclkList4(NMHDR* pNMHDR, LRESULT* pResult)
  442. {
  443. POSITION pos;
  444. pos=m_List4.GetFirstSelectedItemPosition();
  445. if(pos==NULL)
  446. {
  447. return;
  448. }
  449. int iItem=m_List4.GetNextSelectedItem(pos);
  450. ShowPic22 dlg;
  451. dlg.m_nCurImgPos=iItem;
  452. dlg.m_AryOfImgPath=&m_patharray1;
  453. dlg.DoModal ();
  454. *pResult = 0;
  455. }
  456. BOOL ShowSelPhoto2::PreTranslateMessage(MSG* pMsg)
  457. {
  458. if(pMsg->message==WM_KEYDOWN)
  459. {
  460. switch (pMsg->wParam)
  461. {
  462. case VK_F1:
  463. {
  464. ShowWindow(0);
  465. }
  466. break;
  467. case VK_RETURN:
  468. {
  469. POSITION pos;
  470. pos=m_List4.GetFirstSelectedItemPosition();
  471. if(pos==NULL)
  472. {
  473. return 1;
  474. }
  475. CArray<int,int>posarray;
  476. int iItem=m_List4.GetNextSelectedItem(pos);
  477. posarray.Add (iItem);
  478. while (pos)
  479. {
  480. int iItem=m_List4.GetNextSelectedItem(pos);
  481. posarray.Add (iItem);
  482. if(posarray.GetSize ()>1)break;
  483. }
  484. if(posarray.GetSize ()>=2)
  485. {
  486. CComparePhoto dlg;
  487. dlg.m_path1=m_patharray1.ElementAt (posarray.ElementAt(0));
  488. dlg.m_path2=m_patharray1.ElementAt (posarray.ElementAt(1));
  489. dlg.DoModal();
  490. return 1;
  491. }
  492. }
  493. return 1;
  494. }
  495. }
  496. return CDialog::PreTranslateMessage(pMsg);
  497. }