ScrollRichEditView.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:6k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // ScrollRichEditView.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ribbonsample.h"
  5. #include "ScrollRichEditView.h"
  6. #include "WorkspaceView.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CScrollRichEditView
  14. CScrollRichEditView::CScrollRichEditView()
  15. {
  16. m_nTextHeight = 0;
  17. m_nPageHeight = 1000;
  18. m_nTotalHeight = 0;
  19. m_nScrollPos = 0;
  20. m_bInScrollChanged = FALSE;
  21. TCHAR tchPath[MAX_PATH];
  22. m_hInstance = NULL;
  23. ExpandEnvironmentStrings(_T("%CommonProgramFiles%\Microsoft Shared\OFFICE12\RICHED20.DLL"), tchPath, MAX_PATH);
  24. m_hInstance = LoadLibrary(tchPath);
  25. if (!m_hInstance)
  26. {
  27. m_hInstance = LoadLibrary(_T("RICHED20.DLL"));
  28. }
  29. else
  30. {
  31. ExpandEnvironmentStrings(_T("%CommonProgramFiles%\Microsoft Shared\OFFICE12\MSPTLS.DLL"), tchPath, MAX_PATH);
  32. LoadLibrary(tchPath);
  33. }
  34. if (m_hInstance)
  35. {
  36. #ifdef _UNICODE
  37. m_strClass = _T("RichEdit20W");
  38. #else
  39. m_strClass = _T("RichEdit20A");
  40. #endif
  41. }
  42. }
  43. CScrollRichEditView::~CScrollRichEditView()
  44. {
  45. }
  46. BEGIN_MESSAGE_MAP(CScrollRichEditView, CRichEditView)
  47. //{{AFX_MSG_MAP(CScrollRichEditView)
  48. ON_WM_SIZE()
  49. ON_WM_NCPAINT()
  50. ON_WM_VSCROLL()
  51. ON_WM_MOUSEWHEEL()
  52. //}}AFX_MSG_MAP
  53. END_MESSAGE_MAP()
  54. /////////////////////////////////////////////////////////////////////////////
  55. // CScrollRichEditView message handlers
  56. #ifndef EM_GETSCROLLPOS
  57. #define EM_GETSCROLLPOS         (WM_USER + 221)
  58. #endif
  59. #ifndef EM_SETSCROLLPOS
  60. #define EM_SETSCROLLPOS         (WM_USER + 222)
  61. #endif
  62. #ifndef EM_SHOWSCROLLBAR
  63. #define EM_SHOWSCROLLBAR (WM_USER + 96)
  64. #endif
  65. void CScrollRichEditView::OnInitialUpdate()
  66. {
  67. CRichEditView::OnInitialUpdate();
  68. m_nScrollPos = 0;
  69. SendMessage(EM_SHOWSCROLLBAR, SB_VERT, FALSE);
  70. SendMessage(EM_SHOWSCROLLBAR, SB_HORZ, FALSE);
  71. GetRichEditCtrl().SetEventMask(GetRichEditCtrl().GetEventMask()| ENM_SCROLL | ENM_REQUESTRESIZE);
  72. UpdateScrollInfo();
  73. }
  74. CScrollBar* CScrollRichEditView::GetScrollBarCtrl(int nBar) const
  75. {
  76. ASSERT(nBar == SB_VERT); 
  77. UNUSED(nBar);
  78. if (!AfxGetMainWnd())
  79. return NULL;
  80. return &((CWorkspaceView*)GetParent())->m_wndScrollBar[nBar];
  81. }
  82. void CScrollRichEditView::UpdateScrollInfo()
  83. {
  84. m_nTotalHeight = max(m_nPageHeight, m_nTextHeight + 40 + 10);
  85. CScrollBar* pScrollBar = GetScrollBarCtrl(SB_VERT);
  86. if (!pScrollBar)
  87. return;
  88. SCROLLINFO si;
  89. ZeroMemory(&si, sizeof(SCROLLINFO));
  90. si.cbSize = sizeof(SCROLLINFO);
  91. si.fMask = SIF_ALL;
  92. si.nPos = m_nScrollPos;
  93. si.nPage = GetPageSize();
  94. si.nMax = m_nTotalHeight;
  95. pScrollBar->SetScrollInfo(&si);
  96. }
  97. void CScrollRichEditView::OnEditScrollChanged()
  98. {
  99. if (m_bInScrollChanged)
  100. return;
  101. POINT pt;
  102. GetRichEditCtrl().SendMessage(EM_GETSCROLLPOS, 0, (LPARAM)&pt);
  103. m_nScrollPos = 40 + pt.y;
  104. UpdateScrollInfo();
  105. UpdatePosition();
  106. }
  107. void CScrollRichEditView::OnRequestResize(NMHDR * pNotifyStruct, LRESULT* /*result*/)
  108. {
  109. REQRESIZE* rs = (REQRESIZE*)pNotifyStruct;
  110. m_nTextHeight = rs->rc.bottom - rs->rc.top - 3;
  111. UpdateScrollInfo();
  112. }
  113. void CScrollRichEditView::UpdatePosition()
  114. {
  115. CRect rc = ((CWorkspaceView*)GetParent())->GetViewRect(CXTPClientRect(GetParent()));
  116. MoveWindow(rc, TRUE);
  117. SendMessage(WM_NCPAINT);
  118. }
  119. void CScrollRichEditView::SetScrollPos(int nScrollPos)
  120. {
  121. int nMaxPos = m_nTotalHeight - GetPageSize() + 1;
  122. if (nScrollPos > nMaxPos)
  123. nScrollPos = nMaxPos;
  124. if (nScrollPos < 0)
  125. nScrollPos = 0;
  126. if (m_nScrollPos == nScrollPos)
  127. return;
  128. m_nScrollPos = nScrollPos;
  129. int nEditScroll = max(0, m_nScrollPos - 40);
  130. m_bInScrollChanged = TRUE;
  131. POINT pt = {0, nEditScroll};
  132. SendMessage(EM_SETSCROLLPOS, 0, (LPARAM)&pt);
  133. m_bInScrollChanged = FALSE;
  134. UpdateScrollInfo();
  135. UpdatePosition();
  136. }
  137. int CScrollRichEditView::GetPageSize()
  138. {
  139. return CXTPClientRect(GetParent()).Height() - 50;
  140. }
  141. BOOL CScrollRichEditView::PreCreateWindow(CREATESTRUCT& cs)
  142. {
  143. return CRichEditView::PreCreateWindow(cs);
  144. }
  145. void CScrollRichEditView::OnVScroll(UINT nScrollCode, UINT nPos, CScrollBar* /*pScrollBar*/)
  146. {
  147. int y = GetScrollPos(SB_VERT);
  148. switch (nScrollCode)
  149. {
  150. case SB_TOP:
  151. y = 0;
  152. break;
  153. case SB_BOTTOM:
  154. y = m_nTotalHeight;
  155. break;
  156. case SB_LINEUP:
  157. y -= 20;
  158. break;
  159. case SB_LINEDOWN:
  160. y += 20;
  161. break;
  162. case SB_PAGEUP:
  163. y -= GetPageSize();
  164. break;
  165. case SB_PAGEDOWN:
  166. y += GetPageSize();
  167. break;
  168. case SB_THUMBTRACK:
  169. case SB_THUMBPOSITION:
  170. y = nPos;
  171. break;
  172. }
  173. SetScrollPos(y);
  174. }
  175. void CScrollRichEditView::OnSize(UINT nType, int cx, int cy) 
  176. {
  177. CRichEditView::OnSize(nType, cx, cy);
  178. UpdateScrollInfo();  
  179. }
  180. void CScrollRichEditView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType) 
  181. {
  182. // TODO: Add your specialized code here and/or call the base class
  183. CRichEditView::CalcWindowRect(lpClientRect, nAdjustType);
  184. int nWidth = 820;
  185. int nClientWidth = lpClientRect->right - lpClientRect->left;
  186. int nBorders = max(8, nClientWidth - nWidth);
  187. int nTopMargin = max(4, 40 - m_nScrollPos);
  188. int nBottomMargin = m_nScrollPos + GetPageSize() - m_nTotalHeight + 10;
  189. nBottomMargin = max(1, nBottomMargin);
  190. lpClientRect->top += nTopMargin;
  191. lpClientRect->left += nBorders / 2;
  192. lpClientRect->right -= nBorders / 2;
  193. lpClientRect->bottom -= nBottomMargin;
  194. }
  195. void CScrollRichEditView::OnNcPaint() 
  196. {
  197. CWindowDC dc(this);
  198. CXTPWindowRect rc(this);
  199. rc.OffsetRect(-rc.TopLeft());
  200. int nBottomMargin = m_nScrollPos + GetPageSize() - m_nTotalHeight + 10;
  201. dc.FillSolidRect(1, 0, rc.Width() - 2, 1, m_nScrollPos < 40 ? 0 : GetXtremeColor(COLOR_WINDOW));
  202. dc.FillSolidRect(0, 0, 1, rc.Height(), 0);
  203. dc.FillSolidRect(rc.Width() - 1, 0, 1, rc.Height(), 0);
  204. dc.FillSolidRect(1, rc.Height() - 1, rc.Width() - 2, 1, nBottomMargin > 0 ? 0 : GetXtremeColor(COLOR_WINDOW));
  205. }
  206. BOOL CScrollRichEditView::OnMouseWheel(UINT /*nFlags*/, short zDelta, CPoint /*pt*/) 
  207. {
  208. SetScrollPos(m_nScrollPos + (zDelta < 0 ? 60 : -60));
  209. return TRUE;
  210. }