CreditStatic.cpp
上传用户:lczygg
上传日期:2007-07-03
资源大小:2947k
文件大小:12k
源码类别:

语音合成与识别

开发平台:

Visual C++

  1. // CreditStatic.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "CreditStatic.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. #define  DISPLAY_TIMER_ID 150 // timer id
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CCreditStatic
  13. CCreditStatic::CCreditStatic()
  14. {
  15. m_Colors[0] = RGB(0,0,0);       // Black
  16. m_Colors[1] = RGB(255,0,0);     // Red
  17. m_Colors[2] = RGB(255,255,0);   // Yellow
  18. m_Colors[3] = RGB(0,255,255);   // Turquoise
  19. m_Colors[4] = RGB(255,0,0); // White
  20. m_TextHeights[0] = 21;
  21. m_TextHeights[1] = 19;
  22. m_TextHeights[2] = 17;
  23. m_TextHeights[3] = 21;
  24. m_nCurrentFontHeight = m_TextHeights[NORMAL_TEXT_HEIGHT];
  25. m_Escapes[0] = 't';
  26. m_Escapes[1] = 'n';
  27. m_Escapes[2] = 'r';
  28. m_Escapes[3] = '^';
  29. m_DisplaySpeed[0] = 70;
  30. m_DisplaySpeed[1] = 40;
  31. m_DisplaySpeed[2] = 10;
  32. m_CurrentSpeed = 1;
  33. m_ScrollAmount = -1;
  34. m_bProcessingBitmap = FALSE;
  35. m_ArrIndex = NULL;
  36. m_nCounter = 1;
  37. m_nClip = 0;
  38. m_bFirstTime = TRUE;
  39. m_bDrawText = FALSE;
  40. m_bFirstTurn = TRUE;
  41. m_Gradient = GRADIENT_NONE;
  42. m_bTransparent = FALSE;
  43. n_MaxWidth = 0;
  44. TimerOn = 0;
  45. }
  46. CCreditStatic::~CCreditStatic()
  47. {
  48. }
  49. BEGIN_MESSAGE_MAP(CCreditStatic, CStatic)
  50. //{{AFX_MSG_MAP(CCreditStatic)
  51. ON_WM_ERASEBKGND()
  52. ON_WM_TIMER()
  53. ON_WM_DESTROY()
  54. //}}AFX_MSG_MAP
  55. END_MESSAGE_MAP()
  56. /////////////////////////////////////////////////////////////////////////////
  57. // CCreditStatic message handlers
  58. BOOL CCreditStatic::StartScrolling()
  59. {
  60. if(m_ArrCredit.IsEmpty())
  61. return FALSE;
  62. m_nCurrentFontHeight = m_TextHeights[NORMAL_TEXT_HEIGHT];
  63. m_fntArial.CreateFont(m_TextHeights[NORMAL_TEXT_HEIGHT], 0, 0, 0, 
  64. FW_THIN, FALSE, FALSE, 0, 
  65. ANSI_CHARSET,
  66. OUT_DEFAULT_PRECIS,
  67. CLIP_DEFAULT_PRECIS,
  68. PROOF_QUALITY,
  69. VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  70. (LPSTR)"Arial");
  71. if(m_BmpMain.m_hObject != NULL)
  72. {
  73. m_BmpMain.DeleteObject();
  74. m_BmpMain.m_hObject = NULL;
  75. }
  76. TimerOn = SetTimer(DISPLAY_TIMER_ID,m_DisplaySpeed[m_CurrentSpeed],NULL);
  77.     ASSERT(TimerOn != 0);
  78. m_ArrIndex = m_ArrCredit.GetHeadPosition();
  79. m_nCounter = 1;
  80. m_nClip = 0;
  81. m_bFirstTime = TRUE;
  82. m_bDrawText = FALSE;
  83. return TRUE;
  84. }
  85. void CCreditStatic::EndScrolling()
  86. {
  87. KillTimer(DISPLAY_TIMER_ID);
  88. TimerOn = 0;
  89. if(m_BmpMain.m_hObject != NULL) {
  90. m_BmpMain.DeleteObject();
  91. m_BmpMain.m_hObject = NULL;
  92. }
  93. }
  94. void CCreditStatic::SetCredits(LPCTSTR credits,char delimiter)
  95. {
  96. char *str,*ptr1,*ptr2;
  97.     
  98. ASSERT(credits);
  99. if((str = strdup(credits)) == NULL)
  100. return;
  101. m_ArrCredit.RemoveAll();
  102. ptr1 = str;
  103. while((ptr2 = strchr(ptr1,delimiter)) != NULL) {
  104. *ptr2 = '';
  105. m_ArrCredit.AddTail(ptr1);
  106. ptr1 = ptr2+1;
  107. }
  108. m_ArrCredit.AddTail(ptr1);
  109. free(str);
  110. m_ArrIndex = m_ArrCredit.GetHeadPosition();
  111. m_nCounter = 1;
  112. m_nClip = 0;
  113. m_bFirstTime = TRUE;
  114. m_bDrawText = FALSE;
  115. }
  116. void CCreditStatic::SetCredits(UINT nID,char delimiter)
  117. {
  118. CString credits;
  119. if(!credits.LoadString(nID))
  120. return;
  121. SetCredits((LPCTSTR)credits, delimiter);
  122. }
  123. void CCreditStatic::SetSpeed(UINT index, int speed)
  124. {
  125. ASSERT(index <= DISPLAY_FAST);
  126. if(speed)
  127. m_DisplaySpeed[index] = speed;
  128. m_CurrentSpeed = index;
  129. }
  130. void CCreditStatic::SetColor(UINT index, COLORREF col)
  131. {
  132. ASSERT(index <= NORMAL_TEXT_COLOR);
  133. m_Colors[index] = col;
  134. }
  135. void CCreditStatic::SetTextHeight(UINT index, int height)
  136. {
  137. ASSERT(index <= NORMAL_TEXT_HEIGHT);
  138. m_TextHeights[index] = height;
  139. }
  140. void CCreditStatic::SetEscape(UINT index, char escape)
  141. {
  142. ASSERT(index <= DISPLAY_BITMAP);
  143. m_Escapes[index] = escape;
  144. }
  145. void CCreditStatic::SetGradient(UINT value)
  146. {
  147. ASSERT(value <= GRADIENT_LEFT_LIGHT);
  148. m_Gradient = value;
  149. }
  150. void CCreditStatic::SetTransparent(BOOL bTransparent)
  151. {
  152. m_bTransparent = bTransparent;
  153. }
  154. BOOL CCreditStatic::OnEraseBkgnd(CDC* pDC) 
  155. {
  156. return TRUE;
  157. //return CStatic::OnEraseBkgnd(pDC);
  158. }
  159. //************************************************************************
  160. //  OnTimer
  161. //
  162. //   On each of the display timers, scroll the window 1 unit. Each 20
  163. //      units, fetch the next array element and load into work string. Call
  164. //      Invalidate and UpdateWindow to invoke the OnPaint which will paint 
  165. //      the contents of the newly updated work string.
  166. //************************************************************************
  167. void CCreditStatic::OnTimer(UINT nIDEvent) 
  168. {
  169. if (nIDEvent != DISPLAY_TIMER_ID)
  170. {
  171. CStatic::OnTimer(nIDEvent);
  172. return;
  173. }
  174. BOOL bCheck = FALSE;
  175. if (!m_bProcessingBitmap)
  176. {
  177. if (m_nCounter++ % m_nCurrentFontHeight == 0)  // every x timer events, show new line
  178. {
  179. m_nCounter=1;
  180. m_szWork = m_ArrCredit.GetNext(m_ArrIndex);
  181. if(m_bFirstTurn)
  182. bCheck = TRUE;
  183. if(m_ArrIndex == NULL)
  184. {
  185. m_bFirstTurn = FALSE;
  186. m_ArrIndex = m_ArrCredit.GetHeadPosition();
  187. }
  188. m_nClip = 0;
  189. m_bDrawText=TRUE;
  190. }
  191. }
  192.     CClientDC dc(this);
  193. CRect m_ScrollRect;
  194. GetClientRect(&m_ScrollRect);
  195.  
  196. CRect m_ClientRect(m_ScrollRect);
  197. m_ClientRect.left = (m_ClientRect.Width()-n_MaxWidth)/2;
  198. m_ClientRect.right = m_ClientRect.left + n_MaxWidth;
  199. MoveCredit(&dc, m_ScrollRect, m_ClientRect, bCheck);
  200. AddBackGround(&dc, m_ScrollRect, m_ClientRect);
  201. CStatic::OnTimer(nIDEvent);
  202. }
  203. void CCreditStatic::AddBackGround(CDC* pDC, CRect& m_ScrollRect, CRect& m_ClientRect)
  204. {
  205. CDC memDC;
  206. memDC.CreateCompatibleDC( pDC );
  207. // Draw bitmap in the background if one has been set
  208. // Now create a mask
  209. CBitmap bitmap;
  210. bitmap.CreateCompatibleBitmap( pDC, m_ClientRect.Width(), m_ClientRect.Height() );
  211. CBitmap* pOldMemDCBitmap = memDC.SelectObject( &bitmap );
  212. CDC tempDC;
  213. tempDC.CreateCompatibleDC(pDC);
  214. CBitmap* pOldTempDCBitmap = tempDC.SelectObject( &m_BmpMain );
  215. memDC.BitBlt(0, 0, m_ClientRect.Width(), m_ClientRect.Height(), 
  216. &tempDC, m_ClientRect.left, m_ClientRect.top, SRCCOPY);
  217. CDC maskDC;
  218. maskDC.CreateCompatibleDC(pDC);
  219. CBitmap maskBitmap;
  220. // Create monochrome bitmap for the mask
  221. maskBitmap.CreateBitmap( m_ClientRect.Width(), m_ClientRect.Height(), 1, 1, NULL );
  222. CBitmap* pOldMaskDCBitmap = maskDC.SelectObject( &maskBitmap );
  223.     memDC.SetBkColor(RGB(192,192,192));
  224. // Create the mask from the memory DC
  225. maskDC.BitBlt( 0, 0, m_ClientRect.Width(), m_ClientRect.Height(), &memDC, 0, 0, SRCCOPY );
  226. tempDC.SelectObject(pOldTempDCBitmap);
  227. pOldTempDCBitmap = tempDC.SelectObject( &m_bitmap );
  228. CDC imageDC;
  229. CBitmap bmpImage;
  230. imageDC.CreateCompatibleDC( pDC );
  231. bmpImage.CreateCompatibleBitmap( pDC, m_ScrollRect.Width(), m_ScrollRect.Height() );
  232. CBitmap* pOldImageDCBitmap = imageDC.SelectObject( &bmpImage );
  233. // Get x and y offset
  234. // Draw bitmap in tiled manner to imageDC
  235. for( int i = 0; i < m_ScrollRect.right; i += m_cxBitmap)
  236. {
  237. for( int j = 0; j < m_ScrollRect.bottom; j += m_cyBitmap)
  238. {
  239. imageDC.BitBlt( i, j, m_cxBitmap, m_cyBitmap, 
  240. &tempDC, 0, 0, SRCCOPY );
  241. }
  242. }
  243. // Set the background in memDC to black. Using SRCPAINT with black and any other
  244. // color results in the other color, thus making black the transparent color
  245. memDC.SetBkColor(RGB(0 , 0, 0));
  246. memDC.SetTextColor(RGB(255, 255, 255));
  247. memDC.BitBlt(0, 0, m_ClientRect.Width(), m_ClientRect.Height(), 
  248. &maskDC, 0, 0, SRCAND);
  249. // Set the foreground to black. See comment above.
  250. imageDC.SetBkColor(RGB(255,255,255));
  251. imageDC.SetTextColor(RGB(0,0,0));
  252. imageDC.BitBlt(m_ClientRect.left, m_ClientRect.top, m_ClientRect.Width(), m_ClientRect.Height(), 
  253. &maskDC, 0, 0, SRCAND);
  254. // Combine the foreground with the background
  255.     imageDC.BitBlt(m_ClientRect.left, m_ClientRect.top, m_ClientRect.Width(), m_ClientRect.Height(), 
  256. &memDC, 0, 0,SRCPAINT);
  257. // Draw the final image to the screen   
  258. pDC->BitBlt( 0, 0, m_ScrollRect.Width(), m_ScrollRect.Height(), 
  259. &imageDC, 0, 0, SRCCOPY );
  260. imageDC.SelectObject(pOldImageDCBitmap);
  261. maskDC.SelectObject(pOldMaskDCBitmap);
  262. tempDC.SelectObject(pOldTempDCBitmap);
  263. memDC.SelectObject(pOldMemDCBitmap);
  264. }
  265. void CCreditStatic::MoveCredit(CDC *pDC, CRect& r, CRect& r2, BOOL bCheck)
  266. {
  267. CDC memDC,memDC2;
  268.     memDC.CreateCompatibleDC(pDC);
  269.     memDC2.CreateCompatibleDC(pDC);
  270.     
  271. COLORREF BackColor = (m_bTransparent && m_bitmap.m_hObject != NULL)? RGB(192,192,192) : m_Colors[BACKGROUND_COLOR];
  272. CBitmap *pOldMemDCBitmap = NULL;
  273. CRect r1;
  274. if(m_BmpMain.m_hObject == NULL)
  275. {
  276. m_BmpMain.CreateCompatibleBitmap( pDC, r.Width(), r.Height() );
  277. pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);
  278. memDC.FillSolidRect(&r,BackColor);
  279. }
  280. else
  281. pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);
  282. if(r2.Width() > 0)
  283. {
  284. CRgn RgnUpdate;
  285. memDC.ScrollDC(0,m_ScrollAmount,(LPCRECT)r,(LPCRECT)r2,&RgnUpdate,
  286. (LPRECT)r1);
  287.     }
  288. else
  289. {
  290. r1 = r;
  291. r1.top = r1.bottom-abs(m_ScrollAmount);
  292. }
  293. m_nClip = m_nClip + abs(m_ScrollAmount);
  294. //*********************************************************************
  295. // FONT SELECTION
  296. CFont* pOldFont = NULL;
  297. memDC.SetTextColor(m_Colors[NORMAL_TEXT_COLOR]);
  298. if (pOldFont != NULL) memDC.SelectObject(pOldFont);
  299. pOldFont = memDC.SelectObject(&m_fntArial);
  300. memDC.FillSolidRect(&r1,BackColor);
  301. memDC.SetBkMode(TRANSPARENT);
  302. if(bCheck)
  303. {
  304. CSize size = memDC.GetTextExtent((LPCTSTR)m_szWork,m_szWork.GetLength());
  305. if(size.cx > n_MaxWidth)
  306. {
  307. n_MaxWidth = (size.cx > r.Width())? r.Width():size.cx;
  308. r2.left = (r.Width()-n_MaxWidth)/2;
  309. r2.right = r2.left + n_MaxWidth;
  310. }
  311. }
  312. CRect rc(r2);
  313. rc.top = rc.bottom-m_nClip;
  314. int x = memDC.DrawText((const char *)m_szWork,m_szWork.GetLength(),&rc,DT_TOP|DT_CENTER|
  315. DT_NOPREFIX | DT_SINGLELINE);
  316. m_bDrawText=FALSE;
  317. if (pOldFont != NULL) memDC.SelectObject(pOldFont);
  318. memDC.SelectObject(pOldMemDCBitmap);
  319. }
  320. void CCreditStatic::OnDestroy() 
  321. {
  322. CStatic::OnDestroy();
  323. m_ArrCredit.RemoveAll();
  324. if(TimerOn)
  325. ASSERT(KillTimer(DISPLAY_TIMER_ID));
  326. }
  327. BOOL CCreditStatic::SetBkImage(UINT nIDResource)
  328. {
  329.     return SetBkImage( (LPCTSTR)nIDResource );
  330. }
  331. BOOL CCreditStatic::SetBkImage(LPCTSTR lpszResourceName)
  332. {
  333.     // If this is not the first call then Delete GDI objects
  334.     if( m_bitmap.m_hObject != NULL )
  335. m_bitmap.DeleteObject();
  336.     if( m_pal.m_hObject != NULL )
  337. m_pal.DeleteObject();
  338.     
  339.     
  340.     HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(), 
  341.             lpszResourceName, IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION );
  342.      if( hBmp == NULL ) 
  343.         return FALSE;
  344. m_bitmap.Attach( hBmp );
  345.     BITMAP bm;
  346.     m_bitmap.GetBitmap( &bm );
  347.     m_cxBitmap = bm.bmWidth;
  348.     m_cyBitmap = bm.bmHeight;
  349.     // Create a logical palette for the bitmap
  350.     DIBSECTION ds;
  351.     BITMAPINFOHEADER &bmInfo = ds.dsBmih;
  352.     m_bitmap.GetObject( sizeof(ds), &ds );
  353.     int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount;
  354.     // Create a halftone palette if colors > 256. 
  355.     CClientDC dc(NULL);             // Desktop DC
  356.     if( nColors > 256 )
  357.         m_pal.CreateHalftonePalette( &dc );
  358.     else
  359.     {
  360.         // Create the palette
  361.         RGBQUAD *pRGB = new RGBQUAD[nColors];
  362.         CDC memDC;
  363.         memDC.CreateCompatibleDC(&dc);
  364.         CBitmap* pOldMemDCBitmap = memDC.SelectObject( &m_bitmap );
  365.         ::GetDIBColorTable( memDC, 0, nColors, pRGB );
  366.         UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
  367.         LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
  368.         pLP->palVersion = 0x300;
  369.         pLP->palNumEntries = nColors;
  370.         for( int i=0; i < nColors; i++)
  371.         {
  372.             pLP->palPalEntry[i].peRed = pRGB[i].rgbRed;
  373.             pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
  374.             pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
  375.             pLP->palPalEntry[i].peFlags = 0;
  376.         }
  377.         m_pal.CreatePalette( pLP );
  378. memDC.SelectObject(pOldMemDCBitmap);
  379.         delete[] pLP;
  380.         delete[] pRGB;
  381.     }
  382. //    Invalidate();
  383.     return TRUE;
  384. }