CachedScrollView.cpp
上传用户:ynjin1970
上传日期:2014-10-13
资源大小:6438k
文件大小:3k
源码类别:

中间件编程

开发平台:

Visual C++

  1. // CachedScrollView.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "CCachedScrollViewP.h"
  5. #include "CachedScrollView.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CCachedScrollView
  13. IMPLEMENT_DYNCREATE(CCachedScrollView, CScrollView)
  14. CCachedScrollView::CCachedScrollView()
  15. { CacheValid=FALSE;
  16. CacheRect=new CRect;
  17. CacheRect.SetRectEmpty();
  18. }
  19. CCachedScrollView::~CCachedScrollView()
  20. {
  21. }
  22. BEGIN_MESSAGE_MAP(CCachedScrollView, CScrollView)
  23. //{{AFX_MSG_MAP(CCachedScrollView)
  24. ON_WM_PAINT()
  25. //}}AFX_MSG_MAP
  26. END_MESSAGE_MAP()
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CCachedScrollView drawing
  29. void CCachedScrollView::OnInitialUpdate()
  30. {
  31. CScrollView::OnInitialUpdate();
  32. CSize sizeTotal;
  33. // TODO: calculate the total size of this view
  34. sizeTotal.cx = sizeTotal.cy = 100;
  35. SetScrollSizes(MM_TEXT, sizeTotal);
  36. }
  37. void CCachedScrollView::OnDraw(CDC* pDC)
  38. {
  39. CDocument* pDoc = GetDocument();
  40. // TODO: add draw code here
  41. }
  42. /////////////////////////////////////////////////////////////////////////////
  43. // CCachedScrollView diagnostics
  44. #ifdef _DEBUG
  45. void CCachedScrollView::AssertValid() const
  46. {
  47. CScrollView::AssertValid();
  48. }
  49. void CCachedScrollView::Dump(CDumpContext& dc) const
  50. {
  51. CScrollView::Dump(dc);
  52. }
  53. #endif //_DEBUG
  54. /////////////////////////////////////////////////////////////////////////////
  55. // CCachedScrollView message handlers
  56. void CCachedScrollView::OnPaint() 
  57. {
  58. CPaintDC dc(this); // device context for painting
  59. OnPrepareDC(&dc);
  60. //无缓冲
  61. if (CacheRect.IsRectNull()) 
  62. {
  63. OnDraw(&dc);
  64. return;
  65. }
  66. //创建缓冲位图
  67. if (CacheBitmap.m_hObject==NULL) 
  68. CacheBitmap.CreateCompatibleBitmap(&dc,CacheRect.Width(),CacheRect.Height());
  69. CRect ClientRect;
  70. GetClientRect(ClientRect);
  71. CPoint org=dc.GetViewportOrg();
  72. ClientRect.OffsetRect(-org.x,-org.y);
  73. if (!CacheRect.PtInRect(ClientRect.TopLeft()) ||
  74. !CacheRect.PtInRect(ClientRect.BottomRight()))
  75. {
  76. CacheRect.OffsetRect(
  77. ClientRect.CenterPoint()-CacheRect.CenterPoint());
  78. CacheValid=FALSE;
  79. }
  80. CDC mdc;
  81. mdc.CreateCompatibleDC(&dc);
  82. mdc.SelectObject(&CacheBitmap);
  83. if (!CacheValid) {
  84. mdc.SelectStockObject(WHITE_BRUSH);
  85. mdc.SelectStockObject(NULL_PEN);
  86. mdc.Rectangle(0,0,CacheRect.Width(),CacheRect.Height());
  87. mdc.SelectStockObject(BLACK_PEN);
  88. mdc.SetViewportOrg(-CacheRect.left,-CacheRect.top);
  89. OnDraw(&mdc);
  90. mdc.SetViewportOrg(0,0);
  91. CacheValid=TRUE;
  92. }
  93. dc.SelectClipRgn(NULL);
  94. dc.BitBlt(CacheRect.left,CacheRect.top,
  95. CacheRect.Width(),CacheRect.Height(),&mdc,0,0,SRCCOPY);
  96. }