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

图片显示

开发平台:

Visual C++

  1. // DIBView.cpp : implementation of the CDIBView class
  2. //
  3. #include "stdafx.h"
  4. #include "QuickImage.h"
  5. #include "DIBDoc.h"
  6. #include "DIBView.h"
  7. #include "Piccontrol.h"
  8. //#include "MathEx.h"
  9. #include <math.h>
  10. #include "resource.h"
  11. #include "MainFrm.h"
  12. #include "Global.h"
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CDIBView
  20. extern CString g_strCurrentDir;
  21. extern bool g_bShowHide;
  22. extern CList<CString,CString&> g_strImgFileNames;
  23. IMPLEMENT_DYNCREATE(CDIBView, CView)
  24. BEGIN_MESSAGE_MAP(CDIBView, CView)
  25. ON_WM_CONTEXTMENU()
  26. //{{AFX_MSG_MAP(CDIBView)
  27. ON_WM_LBUTTONUP()
  28. ON_WM_MOUSEMOVE()
  29. ON_WM_LBUTTONDOWN()
  30. ON_WM_KEYDOWN()
  31. //}}AFX_MSG_MAP
  32. // Standard printing commands
  33. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  34. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  35. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  36. ON_COMMAND_RANGE(ID_MAP_PAN, ID_MAP_SCISSOR, OnMapButton)
  37. ON_UPDATE_COMMAND_UI_RANGE(ID_MAP_PAN, ID_MAP_SCISSOR, OnUpdateMapButtonState)
  38. ON_COMMAND_RANGE(ID_DIR_HOME, ID_DIR_END, OnDirButtons)
  39. ON_UPDATE_COMMAND_UI_RANGE(ID_DIR_HOME, ID_DIR_END, OnUpdateDirButtons)
  40. END_MESSAGE_MAP()
  41. /////////////////////////////////////////////////////////////////////////////
  42. // CDIBView construction/destruction
  43. CDIBView::CDIBView()
  44. {
  45. m_uIDMapButton = UINT_MAX;
  46. m_ptMouseDown.x=m_ptMouseDown.y=-1;
  47. m_ptTracing.x = m_ptTracing.y = 0;
  48. m_ptFirst.x = m_ptFirst.y = -1;
  49. m_iBacks = 0;
  50. m_iMaxBacks = 10;
  51. m_dMeasure = 0.0;
  52. }
  53. CDIBView::~CDIBView()
  54. {
  55. }
  56. BOOL CDIBView::PreCreateWindow(CREATESTRUCT& cs)
  57. {
  58. // TODO: Modify the Window class or styles here by modifying
  59. //  the CREATESTRUCT cs
  60. // cs.lpszClass = AfxRegisterWndClass(NULL,AfxGetApp()->LoadCursor(IDC_AIM),
  61. // 0,0);
  62. return CView::PreCreateWindow(cs);
  63. }
  64. /////////////////////////////////////////////////////////////////////////////
  65. // CDIBView drawing
  66. void CDIBView::OnDraw(CDC* pDC)
  67. {
  68. CDIBDoc* pDoc = GetDocument();
  69. ASSERT_VALID(pDoc);
  70. // TODO: add draw code for native data here
  71. HDIB hDIB = pDoc->GetHDIB();
  72. if (hDIB != NULL)
  73. {
  74. CRect rcDest , rcDIB;
  75. if (pDC->IsPrinting())   // printer DC
  76. {
  77. LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
  78. int cxDIB = (int) ::DIBWidth(lpDIB);         // Size of DIB - x
  79. int cyDIB = (int) abs(::DIBHeight(lpDIB));        // Size of DIB - y
  80. ::GlobalUnlock((HGLOBAL) hDIB);
  81. rcDIB.top = rcDIB.left = 0;
  82. rcDIB.right = cxDIB;
  83. rcDIB.bottom = cyDIB;
  84. // get size of printer page (in pixels)
  85. int cxPage = pDC->GetDeviceCaps(HORZRES);
  86. int cyPage = pDC->GetDeviceCaps(VERTRES);
  87. // get printer pixels per inch
  88. int cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
  89. int cyInch = pDC->GetDeviceCaps(LOGPIXELSY);
  90. //
  91. // Best Fit case -- create a rectangle which preserves
  92. // the DIB's aspect ratio, and fills the page horizontally.
  93. //
  94. // The formula in the "->bottom" field below calculates the Y
  95. // position of the printed bitmap, based on the size of the
  96. // bitmap, the width of the page, and the relative size of
  97. // a printed pixel (cyInch / cxInch).
  98. //
  99. rcDest.top = rcDest.left = 0;
  100. rcDest.bottom = (int)(((double)cyDIB * cxPage * cyInch)
  101. / ((double)cxDIB * cxInch));
  102. rcDest.right = cxPage;
  103. }
  104. else   // not printer DC
  105. {
  106. GetClientRect(&rcDest);
  107. CPicControl::CalcuRect(rcDest, rcDIB, m_ptDIBCenter, hDIB, m_dZoom);
  108. }
  109. ::PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(),
  110. &rcDIB, pDoc->GetDocPalette());
  111. }
  112. }
  113. /////////////////////////////////////////////////////////////////////////////
  114. // CDIBView printing
  115. BOOL CDIBView::OnPreparePrinting(CPrintInfo* pInfo)
  116. {
  117. // default preparation
  118. return DoPreparePrinting(pInfo);
  119. }
  120. void CDIBView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  121. {
  122. // TODO: add extra initialization before printing
  123. }
  124. void CDIBView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  125. {
  126. // TODO: add cleanup after printing
  127. }
  128. /////////////////////////////////////////////////////////////////////////////
  129. // CDIBView diagnostics
  130. #ifdef _DEBUG
  131. void CDIBView::AssertValid() const
  132. {
  133. CView::AssertValid();
  134. }
  135. void CDIBView::Dump(CDumpContext& dc) const
  136. {
  137. CView::Dump(dc);
  138. }
  139. CDIBDoc* CDIBView::GetDocument() // non-debug version is inline
  140. {
  141. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDIBDoc)));
  142. return (CDIBDoc*)m_pDocument;
  143. }
  144. #endif //_DEBUG
  145. /////////////////////////////////////////////////////////////////////////////
  146. // CDIBView message handlers
  147. void CDIBView::OnInitialUpdate() 
  148. {
  149. CView::OnInitialUpdate();
  150. HDIB hDIB = GetDocument()->GetHDIB();
  151. int cxDIB,cyDIB;
  152. if (hDIB != NULL)
  153. {
  154. LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
  155. cxDIB = (int) ::DIBWidth(lpDIB);         // Size of DIB - x
  156. cyDIB = (int) abs(::DIBHeight(lpDIB));        // Size of DIB - y
  157. ::GlobalUnlock((HGLOBAL) hDIB);
  158. m_ptDIBCenter.x = cxDIB/2;
  159. m_ptDIBCenter.y = cyDIB/2;
  160. CRect rcDC;
  161. GetClientRect(&rcDC);
  162. if(cxDIB > rcDC.Width() || cyDIB > rcDC.Height())
  163. {
  164. m_dZoom = CPicControl::ViewFit(m_ptDIBCenter, rcDC, hDIB);
  165. }
  166. else
  167. {
  168. m_dZoom = CPicControl::ViewActual(m_ptDIBCenter, rcDC, hDIB);
  169. }
  170. CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
  171. ASSERT(NULL != pMainWnd);
  172. CString strText;
  173. strText.Format("Image Size: %d,%d", cxDIB, cyDIB);
  174. pMainWnd->SetStatusText(1, (LPCTSTR)strText);
  175. strText.Format("Zoom: %d%%",
  176. int(100.0 / m_dZoom));
  177. pMainWnd->SetStatusText(2, (LPCTSTR)strText);
  178. }
  179. }
  180. void CDIBView::OnMapButton(UINT uID)
  181. {
  182. CRect rcView;
  183. GetClientRect(&rcView);
  184. switch(uID)
  185. {
  186. case ID_MAP_ACTUAL:
  187. Push();
  188. m_dZoom = CPicControl::ViewActual(m_ptDIBCenter, rcView, GetDocument()->GetHDIB());
  189. m_uIDMapButton = UINT_MAX;
  190. Invalidate();
  191. SetStatusText();
  192. break;
  193. case ID_MAP_FIT:
  194. Push();
  195. m_dZoom = CPicControl::ViewFit(m_ptDIBCenter, rcView, GetDocument()->GetHDIB());
  196. m_uIDMapButton = UINT_MAX;
  197. Invalidate();
  198. SetStatusText();
  199. break;
  200. case ID_MAP_VIEWPREVIOUS:
  201. if(m_iBacks > 0)
  202. {
  203. PICCONTROL a = Pop();
  204. m_ptDIBCenter.x = a.x;
  205. m_ptDIBCenter.y = a.y;
  206. m_dZoom = a.zoom;
  207. Invalidate();
  208. SetStatusText();
  209. }
  210. m_uIDMapButton = UINT_MAX;
  211. break;
  212. case ID_MAP_ZOOMOUT:
  213. BeginWaitCursor();
  214. Push();
  215. m_dZoom = CPicControl::ZoomOut(m_dZoom);
  216. Invalidate();
  217. EndWaitCursor();
  218. m_uIDMapButton = UINT_MAX;
  219. SetStatusText();
  220. break;
  221. case ID_MAP_ZOOMIN:
  222. BeginWaitCursor();
  223. Push();
  224. m_dZoom = CPicControl::ZoomIn(m_dZoom);
  225. Invalidate();
  226. EndWaitCursor();
  227. m_uIDMapButton = UINT_MAX;
  228. SetStatusText();
  229. break;
  230. default:
  231. m_uIDMapButton = (m_uIDMapButton == uID) ? UINT_MAX : uID;
  232. break;
  233. }
  234. }
  235. void CDIBView::OnUpdateMapButtonState(CCmdUI* pCmdUI)
  236. {
  237. if(ID_MAP_VIEWPREVIOUS == pCmdUI->m_nID)
  238. // && ID_MAP_VIEWPREVIOUS == m_uIDMapButton)
  239. {
  240. pCmdUI->SetCheck(FALSE);
  241. pCmdUI->Enable(m_iBacks > 0);
  242. }
  243. else
  244. {
  245. pCmdUI->SetCheck(pCmdUI->m_nID == m_uIDMapButton);
  246. }
  247. }
  248. void CDIBView::OnMouseMove(UINT nFlags, CPoint point) 
  249. {
  250. CDC *pDC=GetDC();
  251. ASSERT_VALID(pDC);
  252. int iOldROP;
  253. CBrush* pOldBrush;
  254. CPen* pOldPen;
  255. CPen pen;
  256. CRect rcTracing(m_ptMouseDown,m_ptTracing);
  257. switch(m_uIDMapButton)
  258. {
  259. case ID_MAP_PAN://pan
  260. if(nFlags & MK_LBUTTON)
  261. {
  262. SetCursor(AfxGetApp()->LoadCursor(IDC_HANDD));
  263. // ::ZoomPan(m_ptDIBCenter, m_ptMouseDown, point, m_dZoom);
  264. m_ptDIBCenter.x -= int((point.x-m_ptMouseDown.x)*m_dZoom);
  265. m_ptDIBCenter.y -= int((point.y-m_ptMouseDown.y)*m_dZoom);
  266. m_ptMouseDown=point;
  267. Invalidate();
  268. }
  269. else
  270. {
  271. SetCursor(AfxGetApp()->LoadCursor(IDC_HANDU));
  272. }
  273. break;
  274. case ID_MAP_ZOOMOUT://Zoom +
  275. // SetCursor(AfxGetApp()->LoadCursor(IDC_ZOOMOUT));
  276. break;
  277. case ID_MAP_ZOOMIN://Zoom -
  278. // SetCursor(AfxGetApp()->LoadCursor(IDC_ZOOMIN));
  279. break;
  280. case ID_MAP_ZOOMWINDOW://zoom window
  281. if(nFlags & MK_LBUTTON)
  282. {
  283. SetCursor(AfxGetApp()->LoadCursor(IDC_ZOOMWINDOW));
  284. iOldROP = pDC->SetROP2(R2_XORPEN);
  285. pen.CreatePen(PS_DOT,1,RGB(0,0,255));
  286. pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);
  287. pOldPen=pDC->SelectObject(&pen);
  288. rcTracing.NormalizeRect();
  289. pDC->Rectangle(&rcTracing);
  290. m_ptTracing = point;
  291. rcTracing.TopLeft() = m_ptMouseDown;
  292. rcTracing.BottomRight() = m_ptTracing;
  293. rcTracing.NormalizeRect();
  294. pDC->Rectangle(&rcTracing);
  295. pDC->SelectObject(pOldPen);
  296. pDC->SelectObject(pOldBrush);
  297. pDC->SetROP2(iOldROP);
  298. }
  299. break;
  300. case ID_MAP_ACTUAL://view actual size
  301. break;
  302. case ID_MAP_FIT://view fit in
  303. break;
  304. case ID_MAP_SCISSOR://Scissor
  305. /*
  306. // if(nFlags & MK_LBUTTON)//if(m_ptTracing.x != 0 || m_ptTracing.y != 0)
  307. {
  308. iOldROP = pDC->SetROP2(R2_NOT);
  309. pDC->MoveTo(0, m_ptTracing.y);
  310. pDC->LineTo(1024, m_ptTracing.y);
  311. pDC->MoveTo(m_ptTracing.x, 0);
  312. pDC->LineTo(m_ptTracing.x, 768);
  313. // TRACE("nO:%dt%d",m_ptTracing.x,m_ptTracing.y);
  314. m_ptTracing = point;
  315. // TRACE("nN:%dt%d",m_ptTracing.x,m_ptTracing.y);
  316. pDC->MoveTo(0, m_ptTracing.y);
  317. pDC->LineTo(1024, m_ptTracing.y);
  318. pDC->MoveTo(m_ptTracing.x, 0);
  319. pDC->LineTo(m_ptTracing.x, 768);
  320. pDC->SetROP2(iOldROP);
  321. }*/
  322. SetCursor(AfxGetApp()->LoadCursor(IDC_SCISSOR));
  323. if(nFlags & MK_LBUTTON)
  324. {
  325. iOldROP = pDC->SetROP2(R2_XORPEN);
  326. pen.CreatePen(PS_DOT,1,RGB(0,0,255));
  327. pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);
  328. pOldPen=pDC->SelectObject(&pen);
  329. rcTracing.NormalizeRect();
  330. pDC->Rectangle(&rcTracing);
  331. m_ptTracing = point;
  332. rcTracing.TopLeft() = m_ptMouseDown;
  333. rcTracing.BottomRight() = m_ptTracing;
  334. rcTracing.NormalizeRect();
  335. pDC->Rectangle(&rcTracing);
  336. pDC->SelectObject(pOldPen);
  337. pDC->SelectObject(pOldBrush);
  338. pDC->SetROP2(iOldROP);
  339. }
  340. break;
  341. default:
  342. // ASSERT(FALSE);
  343. break;
  344. }
  345. CView::OnMouseMove(nFlags, point);
  346. }
  347. void CDIBView::OnLButtonDown(UINT nFlags, CPoint point) 
  348. {
  349. CPen pen, *pOldPen = NULL;
  350. CDC *pDC = GetDC();
  351. ASSERT(NULL != pDC);
  352. switch(m_uIDMapButton)
  353. {
  354. case ID_MAP_PAN://pan
  355. SetCursor(AfxGetApp()->LoadCursor(IDC_HANDD));
  356. break;
  357. case ID_MAP_ZOOMOUT://zoom +
  358. break;
  359. case ID_MAP_ZOOMIN://zoom -
  360. break;
  361. case ID_MAP_ZOOMWINDOW://zoom window
  362. SetCursor(AfxGetApp()->LoadCursor(IDC_ZOOMWINDOW));
  363. break;
  364. case ID_MAP_ACTUAL://view actual size
  365. break;
  366. case ID_MAP_FIT://view fit in
  367. break;
  368. case ID_MAP_SCISSOR://Scissor
  369. break;
  370. default:
  371. // ASSERT(FALSE);
  372. break;
  373. }
  374. m_ptTracing = m_ptMouseDown = point;
  375. CView::OnLButtonDown(nFlags, point);
  376. }
  377. void CDIBView::OnLButtonUp(UINT nFlags, CPoint point) 
  378. {
  379. CDC *pDC=GetDC();
  380. ASSERT_VALID(pDC);
  381. int iOldROP;
  382. CBrush* pOldBrush;
  383. CPen* pOldPen;
  384. CRect rcTracing(m_ptMouseDown,m_ptTracing);
  385. CPen pen;
  386. switch(m_uIDMapButton)
  387. {
  388. case ID_MAP_PAN://pan
  389. SetCursor(AfxGetApp()->LoadCursor(IDC_HANDU));
  390. Push();
  391. break;
  392. case ID_MAP_ZOOMOUT://zoom +
  393. break;
  394. case ID_MAP_ZOOMIN://zoom -
  395. break;
  396. case ID_MAP_ZOOMWINDOW://zoom window
  397. iOldROP = pDC->SetROP2(R2_XORPEN);
  398. pen.CreatePen(PS_DOT,1,RGB(0,0,255));
  399. pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);
  400. pOldPen=pDC->SelectObject(&pen);
  401. rcTracing.NormalizeRect();
  402. pDC->Rectangle(&rcTracing);
  403. pDC->SelectObject(pOldPen);
  404. pDC->SelectObject(pOldBrush);
  405. pDC->SetROP2(iOldROP);
  406. rcTracing.TopLeft() = m_ptMouseDown;
  407. rcTracing.BottomRight() = point;
  408. rcTracing.NormalizeRect();
  409. if(rcTracing.Width() > 5 && rcTracing.Height() > 5)
  410. {
  411. CRect rcView;
  412. GetClientRect(&rcView);
  413. Push();
  414. m_dZoom = CPicControl::ZoomWindow(m_ptDIBCenter, rcView, rcTracing, m_dZoom);
  415. Invalidate();
  416. SetStatusText();
  417. }
  418. break;
  419. case ID_MAP_ACTUAL://view actual size
  420. break;
  421. case ID_MAP_FIT://view fit in
  422. break;
  423. case ID_MAP_SCISSOR://Scissor
  424. iOldROP = pDC->SetROP2(R2_XORPEN);
  425. pen.CreatePen(PS_DOT,1,RGB(0,0,255));
  426. pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);
  427. pOldPen=pDC->SelectObject(&pen);
  428. rcTracing.NormalizeRect();
  429. pDC->Rectangle(&rcTracing);
  430. pDC->SelectObject(pOldPen);
  431. pDC->SelectObject(pOldBrush);
  432. pDC->SetROP2(iOldROP);
  433. rcTracing.TopLeft() = m_ptMouseDown;
  434. rcTracing.BottomRight() = point;
  435. rcTracing.NormalizeRect();
  436. break;
  437. default:
  438. // ASSERT(FALSE);
  439. break;
  440. }
  441. CView::OnLButtonUp(nFlags, point);
  442. }
  443. void CDIBView::Push()
  444. {
  445. if(m_iBacks < m_iMaxBacks)
  446. {
  447. m_Pipe[m_iBacks].x = m_ptDIBCenter.x;
  448. m_Pipe[m_iBacks].y = m_ptDIBCenter.y;
  449. m_Pipe[m_iBacks].zoom = m_dZoom;
  450. m_iBacks ++;
  451. }
  452. else
  453. {
  454. for(int i =0; i < m_iBacks -1; i++)
  455. {
  456. m_Pipe[i] = m_Pipe[i + 1];
  457. }
  458. m_Pipe[m_iBacks -1].x = m_ptDIBCenter.x;
  459. m_Pipe[m_iBacks -1].y = m_ptDIBCenter.y;
  460. m_Pipe[m_iBacks -1].zoom = m_dZoom;
  461. }
  462. }
  463. PICCONTROL CDIBView::Pop()
  464. {
  465. ASSERT(m_iBacks > 0);
  466. m_iBacks --;
  467. return m_Pipe[m_iBacks];
  468. }
  469. void CDIBView::OnContextMenu(CWnd*, CPoint point)
  470. {
  471. // CG: This block was added by the Pop-up Menu component
  472. {
  473. if (point.x == -1 && point.y == -1){
  474. //keystroke invocation
  475. CRect rect;
  476. GetClientRect(rect);
  477. ClientToScreen(rect);
  478. point = rect.TopLeft();
  479. point.Offset(5, 5);
  480. }
  481. CMenu menu;
  482. VERIFY(menu.LoadMenu(CG_IDR_POPUP_DIBVIEW));
  483. CMenu* pPopup = menu.GetSubMenu(0);
  484. ASSERT(pPopup != NULL);
  485. CWnd* pWndPopupOwner = this;
  486. while (pWndPopupOwner->GetStyle() & WS_CHILD)
  487. pWndPopupOwner = pWndPopupOwner->GetParent();
  488. pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
  489. pWndPopupOwner);
  490. }
  491. }
  492. void CDIBView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  493. {
  494. CView::OnKeyDown(nChar, nRepCnt, nFlags);
  495. if((nChar == 107) || (nChar == 187))//+ =
  496. {
  497. // CPicControl::ZoomIn(m_dZoom);
  498. m_dZoom /= 2.0;
  499. Invalidate();
  500. SetStatusText();
  501. }
  502. else if((nChar == 109) || (nChar == 189))//- _
  503. {
  504. // CPicControl::ZoomOut(m_dZoom);
  505. m_dZoom *= 2.0;
  506. Invalidate();
  507. SetStatusText();
  508. }
  509. else if(nChar == 38)//UpArrow
  510. {
  511. CRect rcDC;
  512. GetClientRect(&rcDC);
  513. m_ptDIBCenter.y += int((double)rcDC.Height() / 6.0 * m_dZoom);
  514. Invalidate();
  515. }
  516. else if(nChar == 40)//Down arrow
  517. {
  518. CRect rcDC;
  519. GetClientRect(&rcDC);
  520. m_ptDIBCenter.y -= int((double)rcDC.Height() / 6.0 * m_dZoom);
  521. Invalidate();
  522. }
  523. else if(nChar == 37)//Left arrow
  524. {
  525. CRect rcDC;
  526. GetClientRect(&rcDC);
  527. m_ptDIBCenter.x += int((double)rcDC.Width() / 6.0 * m_dZoom);
  528. Invalidate();
  529. }
  530. else if(nChar == 39)//right arrow
  531. {
  532. CRect rcDC;
  533. GetClientRect(&rcDC);
  534. m_ptDIBCenter.x -= int((double)rcDC.Width() / 6.0 * m_dZoom);
  535. Invalidate();
  536. }
  537. else if(nChar == 34)//Page Down
  538. {
  539. if(!g_strImgFileNames.IsEmpty())
  540. {
  541. const char *pTitle = strrchr(GetDocument()->GetPathName(), '\');
  542. CString strOldFileName = ++pTitle;
  543. POSITION pos = g_strImgFileNames.Find(strOldFileName);
  544. if(NULL != pos)
  545. {
  546. g_strImgFileNames.GetNext(pos);
  547. if(NULL != pos)
  548. {
  549. strOldFileName = g_strImgFileNames.GetAt(pos);
  550. GetDocument()->EnumFile(g_strCurrentDir + g_strImgFileNames.GetAt(pos));
  551. CPicControl::ViewIdeal(m_ptDIBCenter, m_dZoom, this, GetDocument()->GetHDIB());
  552. Invalidate();
  553. SetStatusText();
  554. }
  555. }
  556. }
  557. }
  558. else if(nChar == 33)//Page Up
  559. {
  560. if(!g_strImgFileNames.IsEmpty())
  561. {
  562. const char *pTitle = strrchr(GetDocument()->GetPathName(), '\');
  563. CString strOldFileName = ++pTitle;
  564. POSITION pos = g_strImgFileNames.Find(strOldFileName);
  565. if(NULL != pos)
  566. {
  567. g_strImgFileNames.GetPrev(pos);
  568. if(NULL != pos)
  569. {
  570. GetDocument()->EnumFile(g_strCurrentDir + g_strImgFileNames.GetAt(pos));
  571. CPicControl::ViewIdeal(m_ptDIBCenter, m_dZoom, this, GetDocument()->GetHDIB());
  572. Invalidate();
  573. SetStatusText();
  574. }
  575. }
  576. }
  577. }
  578. else if(nChar == 36)//Home
  579. {
  580. if(!g_strImgFileNames.IsEmpty())
  581. {
  582. POSITION pos = g_strImgFileNames.GetHeadPosition();
  583. if(NULL != pos)
  584. {
  585. GetDocument()->EnumFile(g_strCurrentDir + g_strImgFileNames.GetAt(pos));
  586. CPicControl::ViewIdeal(m_ptDIBCenter, m_dZoom, this, GetDocument()->GetHDIB());
  587. Invalidate();
  588. SetStatusText();
  589. }
  590. }
  591. }
  592. else if(nChar == 35)//End
  593. {
  594. if(!g_strImgFileNames.IsEmpty())
  595. {
  596. POSITION pos = g_strImgFileNames.GetTailPosition();
  597. if(NULL != pos)
  598. {
  599. GetDocument()->EnumFile(g_strCurrentDir + g_strImgFileNames.GetAt(pos));
  600. CPicControl::ViewIdeal(m_ptDIBCenter, m_dZoom, this, GetDocument()->GetHDIB());
  601. Invalidate();
  602. SetStatusText();
  603. }
  604. }
  605. }
  606. else if(nChar == 46)//Delete
  607. {
  608. if(!g_strImgFileNames.IsEmpty())
  609. {
  610. CString strOldFileName = GetDocument()->GetTitle();
  611. POSITION posThis = g_strImgFileNames.Find(strOldFileName);
  612. if(NULL != posThis)
  613. {
  614. POSITION pos = posThis;
  615. g_strImgFileNames.GetNext(pos);
  616. if(NULL != pos)
  617. {
  618. GetDocument()->EnumFile(g_strCurrentDir + g_strImgFileNames.GetAt(pos));
  619. CPicControl::ViewIdeal(m_ptDIBCenter, m_dZoom, this, GetDocument()->GetHDIB());
  620. Invalidate();
  621. SetStatusText();
  622. }
  623. }
  624. g_strImgFileNames.RemoveAt(posThis);
  625. }
  626. DeleteFile(GetDocument()->GetPathName());
  627. }
  628. else
  629. {
  630. }
  631. }
  632. void CDIBView::SetStatusText()
  633. {
  634. HDIB hDIB = GetDocument()->GetHDIB();
  635. if(NULL != hDIB)
  636. {
  637. LPSTR lpDIB = (LPSTR)::GlobalLock(hDIB);
  638. int cxDIB = (int) ::DIBWidth(lpDIB);         // Size of DIB - x
  639. int cyDIB = (int) abs(::DIBHeight(lpDIB));        // Size of DIB - y
  640. ::GlobalUnlock((HGLOBAL) hDIB);
  641. CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
  642. ASSERT(NULL != pMainWnd);
  643. CString strText;
  644. strText.Format("Image Size: %d,%d", cxDIB, cyDIB);
  645. pMainWnd->SetStatusText(1, (LPCTSTR)strText);
  646. strText.Format("Zoom: %d%%",
  647. int(100.0 / m_dZoom));
  648. pMainWnd->SetStatusText(2, (LPCTSTR)strText);
  649. }
  650. }
  651. void CDIBView::OnDirButtons(UINT nID)
  652. {
  653. switch(nID)
  654. {
  655. case ID_DIR_HOME:
  656. if(!g_strImgFileNames.IsEmpty())
  657. {
  658. POSITION pos = g_strImgFileNames.GetHeadPosition();
  659. if(NULL != pos)
  660. {
  661. GetDocument()->EnumFile(g_strCurrentDir + g_strImgFileNames.GetAt(pos));
  662. CPicControl::ViewIdeal(m_ptDIBCenter, m_dZoom, this, GetDocument()->GetHDIB());
  663. Invalidate();
  664. SetStatusText();
  665. }
  666. }
  667. break;
  668. case ID_DIR_PREV:
  669. if(!g_strImgFileNames.IsEmpty())
  670. {
  671. CString strOldFileName = GetDocument()->GetTitle();
  672. POSITION pos = g_strImgFileNames.Find(strOldFileName);
  673. if(NULL != pos)
  674. {
  675. g_strImgFileNames.GetPrev(pos);
  676. if(NULL != pos)
  677. {
  678. GetDocument()->EnumFile(g_strCurrentDir + g_strImgFileNames.GetAt(pos));
  679. CPicControl::ViewIdeal(m_ptDIBCenter, m_dZoom, this, GetDocument()->GetHDIB());
  680. Invalidate();
  681. SetStatusText();
  682. }
  683. }
  684. }
  685. break;
  686. case ID_DIR_NEXT:
  687. if(!g_strImgFileNames.IsEmpty())
  688. {
  689. CString strOldFileName = GetDocument()->GetTitle();
  690. POSITION pos = g_strImgFileNames.Find(strOldFileName);
  691. if(NULL != pos)
  692. {
  693. g_strImgFileNames.GetNext(pos);
  694. if(NULL != pos)
  695. {
  696. GetDocument()->EnumFile(g_strCurrentDir + g_strImgFileNames.GetAt(pos));
  697. CPicControl::ViewIdeal(m_ptDIBCenter, m_dZoom, this, GetDocument()->GetHDIB());
  698. Invalidate();
  699. SetStatusText();
  700. }
  701. }
  702. }
  703. break;
  704. case ID_DIR_END:
  705. if(!g_strImgFileNames.IsEmpty())
  706. {
  707. POSITION pos = g_strImgFileNames.GetTailPosition();
  708. if(NULL != pos)
  709. {
  710. GetDocument()->EnumFile(g_strCurrentDir + g_strImgFileNames.GetAt(pos));
  711. CPicControl::ViewIdeal(m_ptDIBCenter, m_dZoom, this, GetDocument()->GetHDIB());
  712. Invalidate();
  713. SetStatusText();
  714. }
  715. }
  716. break;
  717. default:
  718. break;
  719. }
  720. }
  721. void CDIBView::OnUpdateDirButtons(CCmdUI *pCmdUI)
  722. {
  723. pCmdUI->Enable(TRUE);
  724. }