SinusFrame.cpp
上传用户:guanxf518
上传日期:2007-01-02
资源大小:21k
文件大小:6k
源码类别:

Static控件

开发平台:

Visual C++

  1. // SinusFrame.cpp: Implementierungsdatei
  2. //
  3. #include "stdafx.h"
  4. #include "Sinus.h"
  5. #include "SinusFrame.h"
  6. #include <math.h>
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CSinusFrame
  14. CSinusFrame::CSinusFrame()
  15. {
  16. m_bInitialized = false;
  17. m_bRunning = false;
  18. m_nTimer = 0;
  19. m_nTextPos = 0;
  20. m_nSinusPos = 0;
  21. m_nPixLeft = 0;
  22. m_nSinusOffset = 0;
  23. m_nSinusSpeed = -3;
  24. m_pFont = NULL;
  25. m_pDCScroll = NULL;
  26. m_pDCSinus = NULL;
  27. m_pBMScroll = NULL;
  28. m_pBMSinus = NULL;
  29. const double rad = 2.0*3.141592654/360.0;
  30. int i; float f;
  31. for(i=0, f=0.0; i<720; i++, f+=0.5f)
  32. m_dSinusTable[i] = sin(rad*f);
  33. }
  34. CSinusFrame::~CSinusFrame()
  35. {
  36. Cleanup();
  37. }
  38. BEGIN_MESSAGE_MAP(CSinusFrame, CStatic)
  39. //{{AFX_MSG_MAP(CSinusFrame)
  40. ON_WM_FONTCHANGE()
  41. ON_WM_SIZE()
  42. ON_WM_CLOSE()
  43. //}}AFX_MSG_MAP
  44. END_MESSAGE_MAP()
  45. /////////////////////////////////////////////////////////////////////////////
  46. // Behandlungsroutinen f黵 Nachrichten CSinusFrame 
  47. void CSinusFrame::Initialize()
  48. {
  49. ASSERT(::IsWindow(m_hWnd));
  50. if(m_bInitialized==true)
  51. return;
  52. CFont* pOldFont;
  53. // Font-Ausma遝 ermitteln...
  54. CDC* pDC = GetDC();
  55. ASSERT(pDC);
  56. if(m_pFont)
  57. pOldFont = pDC->SelectObject(m_pFont);
  58. TEXTMETRIC tm;
  59. VERIFY(pDC->GetTextMetrics(&tm));
  60. m_nCharHeight = tm.tmHeight;
  61. m_nCharWidth  = tm.tmMaxCharWidth;
  62. GetClientRect(m_rcClient);
  63. Cleanup();
  64. m_pDCScroll = new CDC;
  65. m_pDCSinus = new CDC;
  66. m_pBMScroll = new CBitmap;
  67. m_pBMSinus = new CBitmap;
  68. ASSERT(m_pDCScroll && m_pDCSinus && m_pBMScroll && m_pBMSinus);
  69. m_rcScroll.SetRect(0, 0, m_rcClient.Width()+m_nCharWidth, m_nCharHeight);
  70. VERIFY(m_pDCScroll->CreateCompatibleDC(pDC));
  71. VERIFY(m_pBMScroll->CreateCompatibleBitmap(pDC, m_rcScroll.Width(), m_rcScroll.Height()));
  72. m_pDCScroll->SelectObject(m_pBMScroll);
  73. m_pDCScroll->PatBlt(0, 0, m_rcScroll.Width(), m_rcScroll.Height(), BLACKNESS);
  74. m_pDCScroll->SetTextColor(RGB(255,255,192));
  75. m_pDCScroll->SetBkColor(RGB(0,0,0));
  76. if(m_pFont)
  77. m_pDCScroll->SelectObject(m_pFont);
  78. VERIFY(m_pDCSinus->CreateCompatibleDC(pDC));
  79. VERIFY(m_pBMSinus->CreateCompatibleBitmap(pDC, m_rcClient.Width(), m_rcClient.Height()));
  80. m_pDCSinus->SelectObject(m_pBMSinus);
  81. m_pDCSinus->PatBlt(0, 0, m_rcClient.Width(), m_rcClient.Height(), BLACKNESS);
  82. ReleaseDC(pDC);
  83. if(m_pFont)
  84. pDC->SelectObject(pOldFont);
  85. m_bInitialized = true;
  86. }
  87. void CSinusFrame::OnFontChange() 
  88. {
  89. CStatic::OnFontChange();
  90. m_bInitialized = false;
  91. }
  92. void CSinusFrame::OnSize(UINT nType, int cx, int cy) 
  93. {
  94. CStatic::OnSize(nType, cx, cy);
  95. m_bInitialized = false;
  96. }
  97. void CALLBACK AFX_EXPORT CSinusFrame::TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime)
  98. {
  99. ASSERT(hWnd);
  100. CSinusFrame* pSin = (CSinusFrame*)CWnd::FromHandle(hWnd);
  101. pSin->Scroll();
  102. }
  103. void CSinusFrame::SetText(LPCTSTR lpszText)
  104. {
  105. m_strText = lpszText;
  106. m_nTextPos = 0;
  107. m_bInitialized = false;
  108. }
  109. void CSinusFrame::Start()
  110. {
  111. ASSERT(::IsWindow(m_hWnd));
  112. if(m_bRunning)
  113. Stop();
  114. m_bRunning = true;
  115. Initialize();
  116. m_nTimer = SetTimer(1, 15, TimerProc);
  117. ASSERT(m_nTimer!=0);
  118. }
  119. void CSinusFrame::Stop()
  120. {
  121. ASSERT(::IsWindow(m_hWnd));
  122. if(m_bRunning)
  123. {
  124. ASSERT(m_nTimer!=0);
  125. KillTimer(m_nTimer);
  126. m_bRunning = false;
  127. }
  128. }
  129. TCHAR CSinusFrame::GetNextChar()
  130. {
  131. if(m_nTextPos >= m_strText.GetLength())
  132. m_nTextPos = 0;
  133. return m_strText[m_nTextPos++];
  134. }
  135. void CSinusFrame::Scroll()
  136. {
  137. if(m_bInitialized && m_bRunning)
  138. {
  139. DoCharBlit();
  140. DoSinScroll();
  141. CDC* pDC = GetDC();
  142. pDC->BitBlt(0, 0, m_rcClient.Width(), m_rcClient.Height(), m_pDCSinus, 0, 0, SRCCOPY);
  143. ReleaseDC(pDC);
  144. }
  145. else
  146. Initialize();
  147. }
  148. void CSinusFrame::DoCharBlit()
  149. {
  150. if(m_nPixLeft <= 0)
  151. {
  152. TCHAR c = GetNextChar();
  153. m_pDCScroll->PatBlt(m_rcClient.right, m_rcScroll.top, m_rcScroll.right, m_rcScroll.bottom, BLACKNESS);
  154. CSize sz = m_pDCScroll->GetTextExtent((LPCTSTR)&c, 1);
  155. m_pDCScroll->TextOut(m_rcClient.right, m_rcScroll.top, (LPCTSTR)&c, 1);
  156. m_nPixLeft = sz.cx;
  157. }
  158. }
  159. void CSinusFrame::DoSinScroll()
  160. {
  161. int nScrollWidth = -2;
  162. // first scroll Scroll-Bitmap
  163. m_pDCScroll->BitBlt(0, 0, m_rcScroll.Width()-2, m_rcScroll.Height(), m_pDCScroll, 2, 0, SRCCOPY);
  164. // clear sinus-bitmap
  165. m_pDCSinus->PatBlt(0, 0, m_rcClient.Width(), m_rcClient.Height(), BLACKNESS);
  166. // get sinustable-startposition
  167. m_nSinusPos = GetNextSinusOffset();
  168. for(int i=0; i<m_rcClient.Width(); i++)
  169. {
  170. double d = GetNextSinValue();
  171. int y = ((m_rcClient.Height() - 2*m_rcScroll.Height()) >> 1) + (m_rcScroll.Height() >> 1);
  172. y += (int)(d * y);
  173. m_pDCSinus->BitBlt(i, y, 1, y+m_rcScroll.Height(), m_pDCScroll, i, 0, SRCCOPY);
  174. }
  175. m_nPixLeft += nScrollWidth;
  176. }
  177. void CSinusFrame::OnClose() 
  178. {
  179. Stop();
  180. CStatic::OnClose();
  181. }
  182. double CSinusFrame::GetNextSinValue()
  183. {
  184. if(++m_nSinusPos >= 720)
  185. m_nSinusPos = 0;
  186. return m_dSinusTable[m_nSinusPos];
  187. }
  188. int CSinusFrame::GetNextSinusOffset()
  189. {
  190. m_nSinusOffset += m_nSinusSpeed;
  191. if(m_nSinusSpeed > 0 && m_nSinusOffset >= 720)
  192. m_nSinusOffset = 0;
  193. else if(m_nSinusSpeed < 0 && m_nSinusOffset < 0)
  194. m_nSinusOffset = 719;
  195. return m_nSinusOffset;
  196. }
  197. void CSinusFrame::SetFont(CFont * pFont)
  198. {
  199. ASSERT(pFont);
  200. m_pFont = pFont;
  201. m_nTextPos = 0;
  202. m_bInitialized = false;
  203. }
  204. void CSinusFrame::SetSinusSpeed(int n)
  205. {
  206. m_nSinusSpeed = n;
  207. }
  208. void CSinusFrame::Cleanup()
  209. {
  210. delete m_pDCScroll;
  211. delete m_pDCSinus;
  212. delete m_pBMScroll;
  213. delete m_pBMSinus;
  214. m_pDCScroll = NULL;
  215. m_pDCSinus = NULL;
  216. m_pBMScroll = NULL;
  217. m_pBMSinus = NULL;
  218. }