QZVDemoView.cpp
上传用户:xp9161
上传日期:2009-12-21
资源大小:70k
文件大小:7k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // QZVDemoView.cpp
  2. #include "stdafx.h"
  3. #include "QZoomViewDemo.h"
  4. #include "QZVDemoView.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #endif
  8. #define ID_ZOOM_FIRST ID_ZOOM_01
  9. #define ID_ZOOM_LAST ID_ZOOM_10
  10. IMPLEMENT_DYNCREATE(CQZVDemoView, QZoomView)
  11. BEGIN_MESSAGE_MAP(CQZVDemoView, QZoomView)
  12. ON_COMMAND(ID_TOOL_ZOOMIN, OnToolZoomin)
  13. ON_COMMAND(ID_TOOL_ZOOMOUT, OnToolZoomout)
  14. ON_COMMAND(ID_TOOL_HAND, OnToolHand)
  15. ON_UPDATE_COMMAND_UI(ID_TOOL_ZOOMIN, OnUpdateToolZoomin)
  16. ON_UPDATE_COMMAND_UI(ID_TOOL_ZOOMOUT, OnUpdateToolZoomout)
  17. ON_UPDATE_COMMAND_UI(ID_TOOL_HAND, OnUpdateToolHand)
  18. ON_COMMAND(ID_ZOOM_ZOOMIN, OnZoomZoomin)
  19. ON_COMMAND(ID_ZOOM_ZOOMOUT, OnZoomZoomout)
  20. ON_COMMAND(ID_VIEW_ZOOMTOWINDOW, OnViewZoomtowindow)
  21. ON_COMMAND_RANGE(ID_ZOOM_FIRST, ID_ZOOM_LAST, OnZoom)
  22. ON_UPDATE_COMMAND_UI_RANGE(ID_ZOOM_FIRST, ID_ZOOM_LAST, OnUpdateZoom)
  23. ON_UPDATE_COMMAND_UI(ID_INDICATOR_ZOOM, OnUpdateIndicatorZoom)
  24. ON_COMMAND(ID_ZOOM_OTHER, OnZoomOther)
  25. ON_UPDATE_COMMAND_UI(ID_ZOOM_ZOOMIN, OnUpdateZoomZoomin)
  26. ON_UPDATE_COMMAND_UI(ID_ZOOM_ZOOMOUT, OnUpdateZoomZoomout)
  27. END_MESSAGE_MAP()
  28. CQZVDemoView::CQZVDemoView()
  29. : m_CurrentMode(ZoomViewOff)
  30. {
  31. }
  32. CQZVDemoView::~CQZVDemoView()
  33. {
  34. }
  35. void CQZVDemoView::OnDraw(CDC* pDC)
  36. {
  37. CSize szDoc(GetTotalSize());
  38. pDC->SetWindowOrg(0, szDoc.cy);
  39. CRect rcDoc(0, 0, szDoc.cx, szDoc.cy);
  40. pDC->Rectangle(rcDoc);
  41. CBrush brYellow(RGB(255, 255, 64));
  42. CBrush brSienna(RGB(128, 0, 0));
  43. CPen pen(PS_SOLID, 10, RGB(128, 0, 0));
  44. LOGFONT lf;
  45. ::ZeroMemory(& lf, sizeof(LOGFONT));
  46. _tcscpy(lf.lfFaceName, _T("Georgia"));
  47. lf.lfHeight = 60;
  48. lf.lfWeight = FW_BOLD;
  49. CFont font;
  50. font.CreateFontIndirect(& lf);
  51. CBrush * pOldBrush = (CBrush *) pDC->SelectObject(& brYellow);
  52. CPen * pOldPen = (CPen *) pDC->SelectObject(& pen);
  53. CFont * pOldFont = (CFont *) pDC->SelectObject(& font);
  54. pDC->Ellipse(200, 350, 600, 750);
  55. pDC->SelectObject(& brSienna);
  56. CRect rcEye(0, 0, 0, 0);
  57. rcEye.InflateRect(10, 10);
  58. rcEye.OffsetRect(330, 570);
  59. pDC->Ellipse(rcEye);
  60. rcEye.OffsetRect(140, 0);
  61. pDC->Ellipse(rcEye);
  62. CRect rcMouth(0, 0, 0, 0);
  63. rcMouth.InflateRect(60, 60);
  64. rcMouth.OffsetRect(400, 520);
  65. pDC->Arc(rcMouth, CPoint(340, 480), CPoint(460, 480));
  66. CString sHello(_T("Hello world!"));
  67. pDC->SetTextAlign(TA_CENTER);
  68. pDC->SetTextColor(RGB(192, 64, 0));
  69. pDC->TextOut(400, 280, sHello);
  70. lf.lfHeight = 36;
  71. lf.lfWeight = FW_NORMAL;
  72. CFont fontZoom;
  73. fontZoom.CreateFontIndirect(& lf);
  74. pDC->SelectObject(& fontZoom);
  75. pDC->SetTextColor(RGB(0, 0, 0));
  76. CString sZoom;
  77. sZoom.Format(_T("Zoom factor: %.2f"), GetZoom());
  78. pDC->TextOut(400, 180, sZoom);
  79. if (pOldFont) pDC->SelectObject(pOldFont);
  80. if (pOldPen) pDC->SelectObject(pOldPen);
  81. if (pOldBrush) pDC->SelectObject(pOldBrush);
  82. }
  83. void CQZVDemoView::OnInitialUpdate()
  84. {
  85. // Initialize QZoomView
  86. // Be a good programmer and call the base class.
  87. QZoomView::OnInitialUpdate();
  88. // Load the cursors. If you don't, QZoomView will display only the normal
  89. // arrow cursor.
  90. // The cursor loading might as well (or even preferably) be done in the
  91. // InitInstance() function of the application class, as it should be done only
  92. // once per program instance. But this doesn't hurt.
  93. UINT idCursors[] = 
  94. {
  95. IDC_LOUPE, IDC_LOUPEPLUS, IDC_LOUPEMINUS, IDC_GRIPOPEN, IDC_GRIPCLOSED
  96. };
  97. for (int i = 0; i < sizeof(idCursors) / sizeof(UINT); i++)
  98. VERIFY(LoadCursor(i, idCursors[i]));
  99. // Optionally, set another list of zoom presets than the default.
  100. float PresetZoomFactors[] =
  101. {
  102. 0.35f, 0.5f, 0.7f, 1.0f, 1.4f, 2.0f, 2.8f, 4.0f, 5.6f, 8.0f
  103. };
  104. int nPresets(sizeof(PresetZoomFactors) / sizeof(float));
  105. SetPresets(PresetZoomFactors, nPresets);
  106. // Set the document size as you would do for a normal CScrollView and use
  107. // any fixed scale mapping mode (MM_ISOTROPIC and MM_ANISOTROPIC are not allowed).
  108. // Here we choose MM_LOMETRIC and a document size of 80 x 100 millimeters.
  109. CSize sizeTotal(800, 1000);
  110. SetScrollSizes(MM_LOMETRIC, sizeTotal);
  111. // For demonstration purposes, start with Zoom In tool activated.
  112. OnToolZoomin();
  113. }
  114. void CQZVDemoView::OnToolZoomin()
  115. {
  116. SetZoomMode(ZoomViewZoomIn);
  117. m_CurrentMode = ZoomViewZoomIn;
  118. }
  119. void CQZVDemoView::OnToolZoomout()
  120. {
  121. SetZoomMode(ZoomViewZoomOut);
  122. m_CurrentMode = ZoomViewZoomOut;
  123. }
  124. void CQZVDemoView::OnToolHand()
  125. {
  126. SetZoomMode(ZoomViewDrag);
  127. m_CurrentMode = ZoomViewDrag;
  128. }
  129. void CQZVDemoView::OnUpdateToolZoomin(CCmdUI *pCmdUI)
  130. {
  131. pCmdUI->SetCheck(m_CurrentMode == ZoomViewZoomIn);
  132. }
  133. void CQZVDemoView::OnUpdateToolZoomout(CCmdUI *pCmdUI)
  134. {
  135. pCmdUI->SetCheck(m_CurrentMode == ZoomViewZoomOut);
  136. }
  137. void CQZVDemoView::OnUpdateToolHand(CCmdUI *pCmdUI)
  138. {
  139. pCmdUI->SetCheck(m_CurrentMode == ZoomViewDrag);
  140. }
  141. void CQZVDemoView::OnZoomZoomin()
  142. {
  143. ZoomIn();
  144. }
  145. void CQZVDemoView::OnZoomZoomout()
  146. {
  147. ZoomOut();
  148. }
  149. void CQZVDemoView::OnViewZoomtowindow()
  150. {
  151. ZoomToWindow();
  152. }
  153. void CQZVDemoView::OnZoom(UINT nID)
  154. {
  155. ZoomToPreset(nID - ID_ZOOM_FIRST);
  156. }
  157. void CQZVDemoView::OnUpdateZoom(CCmdUI *pCmdUI)
  158. {
  159. pCmdUI->SetCheck(pCmdUI->m_nID - ID_ZOOM_FIRST == (UINT) GetPresetZoom());
  160. }
  161. void CQZVDemoView::OnZoomOther()
  162. {
  163. CZoomLevelDlg dlg;
  164. dlg.m_ZoomPercentage = (int)(100.0f * GetZoom());
  165. if (dlg.DoModal() == IDOK)
  166. {
  167. ZoomTo((float) dlg.m_ZoomPercentage / 100.0f);
  168. CSize szDocument = GetTotalSize();
  169. ScrollToCenter(CPoint(szDocument.cx / 2, - szDocument.cy / 2));
  170. }
  171. }
  172. void CQZVDemoView::OnUpdateIndicatorZoom(CCmdUI *pCmdUI)
  173. {
  174. // Indicate the zoom level on the status bar.
  175. // See the MFC documentation for CStatusBar and the global variable
  176. // 'indicators' in MainFrm.cpp if this looks unfamiliar.
  177. CString sZoom;
  178. sZoom.Format(_T("%.2f%%"), 100.0f * GetZoom());
  179. pCmdUI->SetText(sZoom);
  180. pCmdUI->Enable();
  181. }
  182. //===========================
  183. // CZoomLevelDlg dialog
  184. IMPLEMENT_DYNAMIC(CZoomLevelDlg, CDialog)
  185. BEGIN_MESSAGE_MAP(CZoomLevelDlg, CDialog)
  186. END_MESSAGE_MAP()
  187. CZoomLevelDlg::CZoomLevelDlg(CWnd* pParent /*=NULL*/)
  188. : CDialog(CZoomLevelDlg::IDD, pParent)
  189. , m_ZoomPercentage(0)
  190. {
  191. }
  192. CZoomLevelDlg::~CZoomLevelDlg()
  193. {
  194. }
  195. void CZoomLevelDlg::DoDataExchange(CDataExchange* pDX)
  196. {
  197. CDialog::DoDataExchange(pDX);
  198. DDX_Text(pDX, IDC_ZOOMEDIT, m_ZoomPercentage);
  199. DDV_MinMaxInt(pDX, m_ZoomPercentage, 3, 2000);
  200. DDX_Control(pDX, IDC_ZOOMSPIN, m_ZoomSpin);
  201. }
  202. BOOL CZoomLevelDlg::OnInitDialog()
  203. {
  204. CDialog::OnInitDialog();
  205. m_ZoomSpin.SetRange(3, 2000);
  206. return TRUE;
  207. }
  208. void CQZVDemoView::OnUpdateZoomZoomin(CCmdUI *pCmdUI)
  209. {
  210. pCmdUI->Enable(CanZoomIn());
  211. }
  212. void CQZVDemoView::OnUpdateZoomZoomout(CCmdUI *pCmdUI)
  213. {
  214. pCmdUI->Enable(CanZoomOut());
  215. }