DIBVIEW.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // dibview.cpp : implementation of the CDibView class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. #include "stdafx.h"
  13. #include "diblook.h"
  14. #include "dibdoc.h"
  15. #include "dibview.h"
  16. #include "dibapi.h"
  17. #include "mainfrm.h"
  18. #ifdef _DEBUG
  19. #undef THIS_FILE
  20. static char BASED_CODE THIS_FILE[] = __FILE__;
  21. #endif
  22. /////////////////////////////////////////////////////////////////////////////
  23. // CDibView
  24. IMPLEMENT_DYNCREATE(CDibView, CScrollView)
  25. BEGIN_MESSAGE_MAP(CDibView, CScrollView)
  26. //{{AFX_MSG_MAP(CDibView)
  27. ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
  28. ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
  29. ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
  30. ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
  31. ON_MESSAGE(WM_DOREALIZE, OnDoRealize)
  32. //}}AFX_MSG_MAP
  33. // Standard printing commands
  34. ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
  35. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
  36. END_MESSAGE_MAP()
  37. /////////////////////////////////////////////////////////////////////////////
  38. // CDibView construction/destruction
  39. CDibView::CDibView()
  40. {
  41. }
  42. CDibView::~CDibView()
  43. {
  44. }
  45. /////////////////////////////////////////////////////////////////////////////
  46. // CDibView drawing
  47. void CDibView::OnDraw(CDC* pDC)
  48. {
  49. CDibDoc* pDoc = GetDocument();
  50. HDIB hDIB = pDoc->GetHDIB();
  51. if (hDIB != NULL)
  52. {
  53. LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
  54. int cxDIB = (int) ::DIBWidth(lpDIB);         // Size of DIB - x
  55. int cyDIB = (int) ::DIBHeight(lpDIB);        // Size of DIB - y
  56. ::GlobalUnlock((HGLOBAL) hDIB);
  57. CRect rcDIB;
  58. rcDIB.top = rcDIB.left = 0;
  59. rcDIB.right = cxDIB;
  60. rcDIB.bottom = cyDIB;
  61. CRect rcDest;
  62. if (pDC->IsPrinting())   // printer DC
  63. {
  64. // get size of printer page (in pixels)
  65. int cxPage = pDC->GetDeviceCaps(HORZRES);
  66. int cyPage = pDC->GetDeviceCaps(VERTRES);
  67. // get printer pixels per inch
  68. int cxInch = pDC->GetDeviceCaps(LOGPIXELSX);
  69. int cyInch = pDC->GetDeviceCaps(LOGPIXELSY);
  70. //
  71. // Best Fit case -- create a rectangle which preserves
  72. // the DIB's aspect ratio, and fills the page horizontally.
  73. //
  74. // The formula in the "->bottom" field below calculates the Y
  75. // position of the printed bitmap, based on the size of the
  76. // bitmap, the width of the page, and the relative size of
  77. // a printed pixel (cyInch / cxInch).
  78. //
  79. rcDest.top = rcDest.left = 0;
  80. rcDest.bottom = (int)(((double)cyDIB * cxPage * cyInch)
  81. / ((double)cxDIB * cxInch));
  82. rcDest.right = cxPage;
  83. }
  84. else   // not printer DC
  85. {
  86. rcDest = rcDIB;
  87. }
  88. ::PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(),
  89. &rcDIB, pDoc->GetDocPalette());
  90. }
  91. }
  92. /////////////////////////////////////////////////////////////////////////////
  93. // CDibView printing
  94. BOOL CDibView::OnPreparePrinting(CPrintInfo* pInfo)
  95. {
  96. // default preparation
  97. return DoPreparePrinting(pInfo);
  98. }
  99. /////////////////////////////////////////////////////////////////////////////
  100. // CDibView commands
  101. LRESULT CDibView::OnDoRealize(WPARAM wParam, LPARAM)
  102. {
  103. ASSERT(wParam != NULL);
  104. CDibDoc* pDoc = GetDocument();
  105. if (pDoc->GetHDIB() == NULL)
  106. return 0L;  // must be a new document
  107. CPalette* pPal = pDoc->GetDocPalette();
  108. if (pPal != NULL)
  109. {
  110. CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
  111. ASSERT_KINDOF(CMainFrame, pAppFrame);
  112. CClientDC appDC(pAppFrame);
  113. // All views but one should be a background palette.
  114. // wParam contains a handle to the active view, so the SelectPalette
  115. // bForceBackground flag is FALSE only if wParam == m_hWnd (this view)
  116. CPalette* oldPalette = appDC.SelectPalette(pPal, ((HWND)wParam) != m_hWnd);
  117. if (oldPalette != NULL)
  118. {
  119. UINT nColorsChanged = appDC.RealizePalette();
  120. if (nColorsChanged > 0)
  121. pDoc->UpdateAllViews(NULL);
  122. appDC.SelectPalette(oldPalette, TRUE);
  123. }
  124. else
  125. {
  126. TRACE0("tSelectPalette failed in CDibView::OnPaletteChangedn");
  127. }
  128. }
  129. return 0L;
  130. }
  131. void CDibView::OnInitialUpdate()
  132. {
  133. CScrollView::OnInitialUpdate();
  134. ASSERT(GetDocument() != NULL);
  135. SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize());
  136. }
  137. void CDibView::OnActivateView(BOOL bActivate, CView* pActivateView,
  138. CView* pDeactiveView)
  139. {
  140. CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView);
  141. if (bActivate)
  142. {
  143. ASSERT(pActivateView == this);
  144. OnDoRealize((WPARAM)m_hWnd, 0);   // same as SendMessage(WM_DOREALIZE);
  145. }
  146. }
  147. void CDibView::OnEditCopy()
  148. {
  149. CDibDoc* pDoc = GetDocument();
  150. // Clean clipboard of contents, and copy the DIB.
  151. if (OpenClipboard())
  152. {
  153. BeginWaitCursor();
  154. EmptyClipboard();
  155. SetClipboardData (CF_DIB, CopyHandle((HANDLE) pDoc->GetHDIB()) );
  156. CloseClipboard();
  157. EndWaitCursor();
  158. }
  159. }
  160. void CDibView::OnUpdateEditCopy(CCmdUI* pCmdUI)
  161. {
  162. pCmdUI->Enable(GetDocument()->GetHDIB() != NULL);
  163. }
  164. void CDibView::OnEditPaste()
  165. {
  166. HDIB hNewDIB = NULL;
  167. if (OpenClipboard())
  168. {
  169. BeginWaitCursor();
  170. hNewDIB = (HDIB) CopyHandle(::GetClipboardData(CF_DIB));
  171. CloseClipboard();
  172. if (hNewDIB != NULL)
  173. {
  174. CDibDoc* pDoc = GetDocument();
  175. pDoc->ReplaceHDIB(hNewDIB); // and free the old DIB
  176. pDoc->InitDIBData();    // set up new size & palette
  177. pDoc->SetModifiedFlag(TRUE);
  178. SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
  179. OnDoRealize((WPARAM)m_hWnd,0);  // realize the new palette
  180. pDoc->UpdateAllViews(NULL);
  181. }
  182. EndWaitCursor();
  183. }
  184. }
  185. void CDibView::OnUpdateEditPaste(CCmdUI* pCmdUI)
  186. {
  187. pCmdUI->Enable(::IsClipboardFormatAvailable(CF_DIB));
  188. }