QuickView.cpp
上传用户:gzboli
上传日期:2013-04-10
资源大小:471k
文件大小:7k
源码类别:

图片显示

开发平台:

Visual C++

  1. // MatchNavView.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "QuickImage.h"
  5. #include "QuickView.h"
  6. #include "dibapi.h"
  7. #include "FileView.h"
  8. #include "DIBDoc.h"
  9. #include "raw.h"
  10. #include "importsjpegfile.h"
  11. #include "importsgifapi.h"
  12. #include "MainFrm.h"
  13. #include "global.h"
  14. #ifdef _DEBUG
  15. #define new DEBUG_NEW
  16. #undef THIS_FILE
  17. static char THIS_FILE[] = __FILE__;
  18. #endif
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CQuickView
  21. IMPLEMENT_DYNCREATE(CQuickView, CView)
  22. CQuickView::CQuickView()
  23. {
  24. m_rcDIB = m_rcDC = CRect(0,0,0,0);
  25. m_HDIB = NULL;
  26. *m_lpszFileName = '';
  27. }
  28. CQuickView::~CQuickView()
  29. {
  30. if(NULL != m_HDIB)
  31. {
  32. GlobalFree(m_HDIB);
  33. m_HDIB = NULL;
  34. }
  35. *m_lpszFileName = '';
  36. }
  37. BEGIN_MESSAGE_MAP(CQuickView, CView)
  38. //{{AFX_MSG_MAP(CQuickView)
  39. ON_WM_ERASEBKGND()
  40. ON_WM_SIZE()
  41. ON_WM_LBUTTONDOWN()
  42. ON_WM_MOUSEMOVE()
  43. ON_WM_LBUTTONUP()
  44. //}}AFX_MSG_MAP
  45. END_MESSAGE_MAP()
  46. /////////////////////////////////////////////////////////////////////////////
  47. // CQuickView drawing
  48. void CQuickView::OnDraw(CDC* pDC)
  49. {
  50. // CDocument* pDoc = GetDocument();
  51. // TODO: add draw code her
  52. // HDIB hDIB = GetDocument()->GetHDIB();
  53. if (m_HDIB != NULL)
  54. {
  55. ::PaintDIB(pDC->GetSafeHdc(), &m_rcDC, m_HDIB, &m_rcDIB, NULL);
  56. }
  57. else
  58. {
  59. CPoint pt = m_rcDC.CenterPoint();
  60. int iOldBkMode = pDC->SetBkMode(TRANSPARENT);
  61. int iOldAlign = pDC->SetTextAlign(TA_CENTER);
  62. pDC->TextOut(pt.x, pt.y, _T("No Preview!"));
  63. pDC->SetTextAlign(iOldAlign);
  64. pDC->SetBkMode(iOldBkMode);
  65. }
  66. }
  67. /////////////////////////////////////////////////////////////////////////////
  68. // CQuickView diagnostics
  69. #ifdef _DEBUG
  70. void CQuickView::AssertValid() const
  71. {
  72. CView::AssertValid();
  73. }
  74. void CQuickView::Dump(CDumpContext& dc) const
  75. {
  76. CView::Dump(dc);
  77. }
  78. #endif //_DEBUG
  79. /////////////////////////////////////////////////////////////////////////////
  80. // CQuickView message handlers
  81. BOOL CQuickView::OnEraseBkgnd(CDC* pDC) 
  82. {
  83. CBrush brBack;
  84. // brBack.CreateSolidBrush((COLORREF) GetSysColor(COLOR_DESKTOP));
  85. COLORREF bkColor = GetSysColor(COLOR_BACKGROUND);
  86. if(RGB(0, 0, 0) == bkColor)
  87. {
  88. bkColor = RGB(192, 192, 192);
  89. }
  90. brBack.CreateSolidBrush(bkColor);
  91. CBrush* pOldBrush = pDC->SelectObject(&brBack);
  92. CRect rect;
  93. pDC->GetClipBox(&rect);     // 擦除所需的区域
  94. pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
  95. pDC->SelectObject(pOldBrush);
  96. return TRUE;
  97. // return CView::OnEraseBkgnd(pDC);
  98. }
  99. void CQuickView::OnInitialUpdate() 
  100. {
  101. CView::OnInitialUpdate();
  102. /*
  103. HDIB hDIB = GetDocument()->GetHDIB();
  104. if (hDIB != NULL)
  105. {
  106. LPSTR lpbi = (LPSTR)::GlobalLock((HGLOBAL) hDIB);;
  107. m_rcDIB.right = (int) ::DIBWidth((LPSTR)lpbi);         // Size of DIB - x
  108. m_rcDIB.bottom = (int) abs(::DIBHeight((LPSTR)lpbi));        // Size of DIB - y
  109. CalcDCRect();
  110. ::GlobalUnlock((HGLOBAL) hDIB);
  111. }*/
  112. GetClientRect(&m_rcDC);
  113. }
  114. void CQuickView::OnSize(UINT nType, int cx, int cy) 
  115. {
  116. CView::OnSize(nType, cx, cy);
  117. if((m_rcDIB.Width() > 0) && (m_rcDIB.Height() > 0))
  118. {
  119. CalcRects();
  120. // Invalidate();
  121. }
  122. }
  123. void CQuickView::CalcRects()
  124. {
  125. ASSERT(NULL != m_HDIB);
  126. LPSTR lpbi = (LPSTR)::GlobalLock((HGLOBAL) m_HDIB);;
  127. m_rcDIB.right = (int) ::DIBWidth((LPSTR)lpbi);         // Size of DIB - x
  128. m_rcDIB.bottom = (int) abs(::DIBHeight((LPSTR)lpbi));
  129. ::GlobalUnlock((HGLOBAL) m_HDIB);
  130. //calcu m_rcDIB
  131. GetClientRect(&m_rcDC);
  132. m_rcDC.InflateRect(-2, -2);
  133. double dx = (double)m_rcDC.Width() / m_rcDIB.Width();
  134. double dy = (double)m_rcDC.Height() / m_rcDIB.Height();
  135. POINT pt = m_rcDC.CenterPoint();
  136. int iHalf;
  137. if((dx > 1.0) && (dy > 1.0))
  138. {
  139. iHalf = int((double)m_rcDIB.Width() / 2.0 + 0.5);
  140. m_rcDC.left = pt.x - iHalf;
  141. m_rcDC.right = pt.x + iHalf;
  142. iHalf = int((double)m_rcDIB.Height() / 2.0 + 0.5);
  143. m_rcDC.top = pt.y - iHalf;
  144. m_rcDC.bottom = pt.y + iHalf;
  145. }
  146. else if(dx > dy)
  147. {
  148. iHalf = int(dy * (double)m_rcDIB.Width() / 2.0);
  149. m_rcDC.left = pt.x - iHalf;
  150. m_rcDC.right = pt.x + iHalf;
  151. }
  152. else
  153. {
  154. iHalf = int(dx * (double)m_rcDIB.Height() / 2.0);
  155. m_rcDC.top = pt.y - iHalf;
  156. m_rcDC.bottom = pt.y + iHalf;
  157. }
  158. }
  159. CDIBDoc* CQuickView::GetDocument()
  160. {
  161. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDIBDoc)));
  162. return (CDIBDoc*)m_pDocument;
  163. }
  164. BOOL CQuickView::DrawIMG(void)
  165. {
  166. ASSERT(strlen(m_lpszFileName) > 0);
  167. char *pExt = strrchr(m_lpszFileName, '.');
  168. if(NULL == pExt)
  169. return FALSE;
  170. CString strExt;
  171. strExt.Format("%s", ++pExt);
  172. strExt.MakeUpper();
  173. HDIB hDIB = NULL;
  174. if((0 == strExt.Compare("BMP"))
  175. || (0 == strExt.Compare("DIB"))
  176. || (0 == strExt.Compare("DDB")))
  177. {
  178. CFile file;
  179. CFileException fe;
  180. if (!file.Open(m_lpszFileName, CFile::modeRead | CFile::shareDenyWrite, &fe))
  181. {
  182. fe.ReportError();
  183. return NULL;
  184. }
  185. // replace calls to Serialize with ReadDIBFile function
  186. TRY
  187. {
  188. hDIB = ::ReadDIBFile(file);
  189. }
  190. CATCH (CFileException, eLoad)
  191. {
  192. file.Abort(); // will not throw an exception
  193. eLoad->ReportError();
  194. if(NULL != hDIB)
  195. {
  196. GlobalFree(hDIB);
  197. hDIB = NULL;
  198. }
  199. return FALSE;
  200. }
  201. END_CATCH
  202. if (hDIB == NULL)
  203. {
  204. // may not be DIB format
  205. CString strMsg;
  206. strMsg.LoadString(IDS_CANNOT_LOAD_DIB);
  207. MessageBox(strMsg, NULL, MB_ICONINFORMATION | MB_OK);
  208. return FALSE;
  209. }
  210. }
  211. else if((0 == strExt.Compare("JPG"))
  212. || (0 == strExt.Compare("JPEG")))
  213. {
  214. UINT height,width;
  215. BYTE *pData = NULL;
  216. pData = JpegFile::JpegFileToRGB(m_lpszFileName, &width, &height);
  217. if(NULL == pData)return FALSE;
  218. JpegFile::BGRFromRGB(pData, width, height);
  219. JpegFile::VertFlipBuf(pData, width * 3, height);
  220. UINT widthDW;
  221. BYTE *pDIB = JpegFile::MakeDwordAlignedBuf(pData, width, height, &widthDW);
  222. delete []pData;
  223. if(NULL == pDIB)
  224. {
  225. char strErr[100];
  226. sprintf(strErr, "Error: %d", GetLastError());
  227. MessageBox(strErr, "Read File Error",
  228. MB_OK|MB_ICONERROR);
  229. return FALSE;
  230. }
  231. hDIB = ::ShowJPEG(width, height, pDIB);
  232. delete []pDIB;
  233. }
  234. else if(0 == strExt.Compare("GIF"))
  235. {
  236. hDIB = ReadGIF(m_lpszFileName);
  237. }
  238. else if(0 == strExt.Compare("PCX"))
  239. {
  240. hDIB = ::ReadPCX256(m_lpszFileName);
  241. }
  242. /* else if(0 == strExt.Compare("RAW"))
  243. {
  244. CRaw raw;
  245. if(!raw.ReadFromFile(m_lpszFileName))
  246. {
  247. return FALSE;
  248. }
  249. hDIB = raw.Show();
  250. }
  251. */ else
  252. {
  253. return FALSE;
  254. }
  255. ASSERT(NULL == m_HDIB);
  256. m_HDIB = hDIB;
  257. return TRUE;
  258. }
  259. void CQuickView::SetFileName(LPCTSTR lpszFileName)
  260. {
  261. CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
  262. ASSERT(NULL != pMainWnd);
  263. if(NULL == lpszFileName)
  264. {
  265. *m_lpszFileName = '';
  266. if(NULL != m_HDIB)
  267. {
  268. GlobalFree(m_HDIB);
  269. }
  270. m_HDIB = NULL;
  271. pMainWnd->SetStatusText(0);
  272. Invalidate();
  273. }
  274. else if(0 != stricmp(lpszFileName, m_lpszFileName))
  275. {
  276. strcpy(m_lpszFileName, lpszFileName);
  277. if(CGlobal::IsImgFile(m_lpszFileName))
  278. {
  279. if(NULL != m_HDIB)
  280. {
  281. GlobalFree(m_HDIB);
  282. }
  283. m_HDIB = NULL;
  284. DrawIMG();
  285. CalcRects();
  286. CString strText;
  287. strText.Format("Image Size: %d,%d", m_rcDIB.Width(), m_rcDIB.Height());
  288. pMainWnd->SetStatusText(1, (LPCTSTR)strText);
  289. strText.Format("Zoom: %d%%",
  290. int((double)m_rcDC.Width() / m_rcDIB.Width() * 100.0));
  291. pMainWnd->SetStatusText(2, (LPCTSTR)strText);
  292. }
  293. else
  294. {
  295. if(NULL != m_HDIB)
  296. {
  297. GlobalFree(m_HDIB);
  298. }
  299. m_HDIB = NULL;
  300. pMainWnd->SetStatusText(0);
  301. }
  302. Invalidate();
  303. }
  304. }