CreditStatic.cpp
上传用户:zhenlu1001
上传日期:2007-01-02
资源大小:131k
文件大小:28k
源码类别:

Static控件

开发平台:

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,255,255); // White
  20. m_TextHeights[0] = 21;
  21. m_TextHeights[1] = 19;
  22. m_TextHeights[2] = 17;
  23. m_TextHeights[3] = 15;
  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_PAINT()
  52. ON_WM_ERASEBKGND()
  53. ON_WM_TIMER()
  54. ON_WM_DESTROY()
  55. //}}AFX_MSG_MAP
  56. END_MESSAGE_MAP()
  57. /////////////////////////////////////////////////////////////////////////////
  58. // CCreditStatic message handlers
  59. BOOL CCreditStatic::StartScrolling()
  60. {
  61. if(m_ArrCredit.IsEmpty())
  62. return FALSE;
  63. if(m_BmpMain.m_hObject != NULL) {
  64. m_BmpMain.DeleteObject();
  65. m_BmpMain.m_hObject = NULL;
  66. }
  67. TimerOn = SetTimer(DISPLAY_TIMER_ID,m_DisplaySpeed[m_CurrentSpeed],NULL);
  68.     ASSERT(TimerOn != 0);
  69. m_ArrIndex = m_ArrCredit.GetHeadPosition();
  70. m_nCounter = 1;
  71. m_nClip = 0;
  72. m_bFirstTime = TRUE;
  73. m_bDrawText = FALSE;
  74. return TRUE;
  75. }
  76. void CCreditStatic::EndScrolling()
  77. {
  78. KillTimer(DISPLAY_TIMER_ID);
  79. TimerOn = 0;
  80. if(m_BmpMain.m_hObject != NULL) {
  81. m_BmpMain.DeleteObject();
  82. m_BmpMain.m_hObject = NULL;
  83. }
  84. }
  85. void CCreditStatic::SetCredits(LPCTSTR credits,char delimiter)
  86. {
  87. char *str,*ptr1,*ptr2;
  88.     
  89. ASSERT(credits);
  90. if((str = strdup(credits)) == NULL)
  91. return;
  92. m_ArrCredit.RemoveAll();
  93. ptr1 = str;
  94. while((ptr2 = strchr(ptr1,delimiter)) != NULL) {
  95. *ptr2 = '';
  96. m_ArrCredit.AddTail(ptr1);
  97. ptr1 = ptr2+1;
  98. }
  99. m_ArrCredit.AddTail(ptr1);
  100. free(str);
  101. m_ArrIndex = m_ArrCredit.GetHeadPosition();
  102. m_nCounter = 1;
  103. m_nClip = 0;
  104. m_bFirstTime = TRUE;
  105. m_bDrawText = FALSE;
  106. }
  107. void CCreditStatic::SetCredits(UINT nID,char delimiter)
  108. {
  109. CString credits;
  110. if(!credits.LoadString(nID))
  111. return;
  112. SetCredits((LPCTSTR)credits, delimiter);
  113. }
  114. void CCreditStatic::SetSpeed(UINT index, int speed)
  115. {
  116. ASSERT(index <= DISPLAY_FAST);
  117. if(speed)
  118. m_DisplaySpeed[index] = speed;
  119. m_CurrentSpeed = index;
  120. }
  121. void CCreditStatic::SetColor(UINT index, COLORREF col)
  122. {
  123. ASSERT(index <= NORMAL_TEXT_COLOR);
  124. m_Colors[index] = col;
  125. }
  126. void CCreditStatic::SetTextHeight(UINT index, int height)
  127. {
  128. ASSERT(index <= NORMAL_TEXT_HEIGHT);
  129. m_TextHeights[index] = height;
  130. }
  131. void CCreditStatic::SetEscape(UINT index, char escape)
  132. {
  133. ASSERT(index <= DISPLAY_BITMAP);
  134. m_Escapes[index] = escape;
  135. }
  136. void CCreditStatic::SetGradient(UINT value)
  137. {
  138. ASSERT(value <= GRADIENT_LEFT_LIGHT);
  139. m_Gradient = value;
  140. }
  141. void CCreditStatic::SetTransparent(BOOL bTransparent)
  142. {
  143. m_bTransparent = bTransparent;
  144. }
  145. void CCreditStatic::OnPaint() 
  146. {
  147. CPaintDC dc(this); // device context for painting
  148. if(TimerOn) return;
  149. CDC memDC;
  150. memDC.CreateCompatibleDC(&dc);
  151. CBitmap *pOldMemDCBitmap = NULL;
  152. CRect m_ScrollRect;
  153. GetClientRect(&m_ScrollRect);
  154. if(m_BmpMain.m_hObject == NULL) {
  155. CDC memDC2;
  156. CBitmap bitmap;
  157. memDC2.CreateCompatibleDC(&dc);
  158. bitmap.CreateCompatibleBitmap( &dc, m_ScrollRect.Width(), m_ScrollRect.Height() );
  159. CBitmap *pOldMemDC2Bitmap = (CBitmap*)memDC2.SelectObject(&bitmap);
  160. DrawCredit(&memDC2, m_ScrollRect);
  161. AddBackGround(&memDC2, m_ScrollRect, m_ScrollRect);
  162. pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);
  163.         memDC.BitBlt( 0, 0, m_ScrollRect.Width(), m_ScrollRect.Height(), 
  164.                                         &memDC2, 0, 0, SRCCOPY );
  165. memDC2.SelectObject(pOldMemDC2Bitmap);
  166. }
  167. else
  168. pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);
  169.        
  170. dc.BitBlt( 0, 0, m_ScrollRect.Width(), m_ScrollRect.Height(), 
  171.                &memDC, 0, 0, SRCCOPY );
  172. }
  173. BOOL CCreditStatic::OnEraseBkgnd(CDC* pDC) 
  174. {
  175. return TRUE;
  176. // return CStatic::OnEraseBkgnd(pDC);
  177. }
  178. //************************************************************************
  179. //  OnTimer
  180. //
  181. //   On each of the display timers, scroll the window 1 unit. Each 20
  182. //      units, fetch the next array element and load into work string. Call
  183. //      Invalidate and UpdateWindow to invoke the OnPaint which will paint 
  184. //      the contents of the newly updated work string.
  185. //************************************************************************
  186. void CCreditStatic::OnTimer(UINT nIDEvent) 
  187. {
  188. if (nIDEvent != DISPLAY_TIMER_ID)
  189. {
  190. CStatic::OnTimer(nIDEvent);
  191. return;
  192. }
  193. BOOL bCheck = FALSE;
  194. if (!m_bProcessingBitmap) {
  195. if (m_nCounter++ % m_nCurrentFontHeight == 0)  // every x timer events, show new line
  196. {
  197. m_nCounter=1;
  198. m_szWork = m_ArrCredit.GetNext(m_ArrIndex);
  199. if(m_bFirstTurn)
  200. bCheck = TRUE;
  201. if(m_ArrIndex == NULL) {
  202. m_bFirstTurn = FALSE;
  203. m_ArrIndex = m_ArrCredit.GetHeadPosition();
  204. }
  205. m_nClip = 0;
  206. m_bDrawText=TRUE;
  207. }
  208. }
  209.     CClientDC dc(this);
  210. CRect m_ScrollRect;
  211. GetClientRect(&m_ScrollRect);
  212.  
  213. CRect m_ClientRect(m_ScrollRect);
  214. m_ClientRect.left = (m_ClientRect.Width()-n_MaxWidth)/2;
  215. m_ClientRect.right = m_ClientRect.left + n_MaxWidth;
  216. MoveCredit(&dc, m_ScrollRect, m_ClientRect, bCheck);
  217. AddBackGround(&dc, m_ScrollRect, m_ClientRect);
  218. CStatic::OnTimer(nIDEvent);
  219. }
  220. void CCreditStatic::AddBackGround(CDC* pDC, CRect& m_ScrollRect, CRect& m_ClientRect)
  221. {
  222. CDC memDC;
  223. memDC.CreateCompatibleDC( pDC );
  224.     if( m_bitmap.m_hObject == NULL )
  225. {
  226.         CBitmap* pOldBitmap = memDC.SelectObject( &m_BmpMain );
  227.         pDC->BitBlt( 0, 0, m_ScrollRect.Width(), m_ScrollRect.Height(), 
  228.                                         &memDC, 0, 0, SRCCOPY );
  229. memDC.SelectObject(pOldBitmap);
  230. return;
  231. }
  232.    // Draw bitmap in the background if one has been set
  233.                 // Now create a mask
  234. CBitmap bitmap;
  235. bitmap.CreateCompatibleBitmap( pDC, m_ClientRect.Width(), m_ClientRect.Height() );
  236. CBitmap* pOldMemDCBitmap = memDC.SelectObject( &bitmap );
  237. CDC tempDC;
  238. tempDC.CreateCompatibleDC(pDC);
  239. CBitmap* pOldTempDCBitmap = tempDC.SelectObject( &m_BmpMain );
  240. memDC.BitBlt( 0, 0, m_ClientRect.Width(), m_ClientRect.Height(), &tempDC, 
  241.                       m_ClientRect.left, m_ClientRect.top, SRCCOPY );
  242. CDC maskDC;
  243. maskDC.CreateCompatibleDC(pDC);
  244. CBitmap maskBitmap;
  245. // Create monochrome bitmap for the mask
  246. maskBitmap.CreateBitmap( m_ClientRect.Width(), m_ClientRect.Height(), 1, 1, NULL );
  247. CBitmap* pOldMaskDCBitmap = maskDC.SelectObject( &maskBitmap );
  248.     memDC.SetBkColor(m_bTransparent? RGB(192,192,192): m_Colors[BACKGROUND_COLOR]);
  249. // Create the mask from the memory DC
  250. maskDC.BitBlt( 0, 0, m_ClientRect.Width(), m_ClientRect.Height(), &memDC, 0, 0, SRCCOPY );
  251. tempDC.SelectObject(pOldTempDCBitmap);
  252. pOldTempDCBitmap = tempDC.SelectObject( &m_bitmap );
  253. CDC imageDC;
  254. CBitmap bmpImage;
  255. imageDC.CreateCompatibleDC( pDC );
  256. bmpImage.CreateCompatibleBitmap( pDC, m_ScrollRect.Width(), m_ScrollRect.Height() );
  257. CBitmap* pOldImageDCBitmap = imageDC.SelectObject( &bmpImage );
  258. if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE && m_pal.m_hObject != NULL )
  259. {
  260. pDC->SelectPalette( &m_pal, FALSE );
  261. pDC->RealizePalette();
  262. imageDC.SelectPalette( &m_pal, FALSE );
  263. }
  264. // Get x and y offset
  265. // Draw bitmap in tiled manner to imageDC
  266. for( int i = 0; i < m_ScrollRect.right; i += m_cxBitmap )
  267. for( int j = 0; j < m_ScrollRect.bottom; j += m_cyBitmap )
  268. imageDC.BitBlt( i, j, m_cxBitmap, m_cyBitmap, &tempDC, 0, 0, SRCCOPY );
  269. // Set the background in memDC to black. Using SRCPAINT with black and any other
  270. // color results in the other color, thus making black the transparent color
  271. memDC.SetBkColor(RGB(0,0,0));
  272. memDC.SetTextColor(RGB(255,255,255));
  273. memDC.BitBlt(0, 0, m_ClientRect.Width(), m_ClientRect.Height(), &maskDC, 0, 0, SRCAND);
  274. // Set the foreground to black. See comment above.
  275. imageDC.SetBkColor(RGB(255,255,255));
  276. imageDC.SetTextColor(RGB(0,0,0));
  277. imageDC.BitBlt(m_ClientRect.left, m_ClientRect.top, m_ClientRect.Width(), m_ClientRect.Height(), 
  278. &maskDC, 0, 0, SRCAND);
  279. // Combine the foreground with the background
  280.     imageDC.BitBlt(m_ClientRect.left, m_ClientRect.top, m_ClientRect.Width(), m_ClientRect.Height(), 
  281. &memDC, 0, 0,SRCPAINT);
  282. // Draw the final image to the screen   
  283. pDC->BitBlt( 0, 0, m_ScrollRect.Width(), m_ScrollRect.Height(), 
  284. &imageDC, 0, 0, SRCCOPY );
  285. imageDC.SelectObject(pOldImageDCBitmap);
  286. maskDC.SelectObject(pOldMaskDCBitmap);
  287. tempDC.SelectObject(pOldTempDCBitmap);
  288. memDC.SelectObject(pOldMemDCBitmap);
  289. }
  290. void CCreditStatic::DrawBitmap(CDC* pDC, CDC* pDC2, CRect *rBitmap)
  291. {
  292. if(!m_bTransparent || m_bitmap.m_hObject != NULL) {
  293.      pDC->BitBlt( rBitmap->left, rBitmap->top, rBitmap->Width(), rBitmap->Height(), 
  294.             pDC2, 0, 0, SRCCOPY );
  295. return;
  296. }
  297. CDC memDC;
  298. memDC.CreateCompatibleDC( pDC );
  299.     // Now create a mask
  300. CBitmap bitmap;
  301. bitmap.CreateCompatibleBitmap( pDC, rBitmap->Width(), rBitmap->Height() );
  302. CBitmap* pOldMemDCBitmap = memDC.SelectObject( &bitmap );
  303. memDC.BitBlt( 0, 0, rBitmap->Width(), rBitmap->Height(), pDC2, 0, 0, SRCCOPY );
  304. CDC maskDC;
  305. maskDC.CreateCompatibleDC(pDC);
  306. // Create monochrome bitmap for the mask
  307. CBitmap maskBitmap;
  308. maskBitmap.CreateBitmap( rBitmap->Width(), rBitmap->Height(), 1, 1, NULL );
  309. CBitmap* pOldMaskDCBitmap = maskDC.SelectObject( &maskBitmap );
  310.     memDC.SetBkColor(RGB(192,192,192));
  311. // Create the mask from the memory DC
  312. maskDC.BitBlt( 0, 0, rBitmap->Width(), rBitmap->Height(), &memDC, 0, 0, SRCCOPY );
  313. CDC imageDC;
  314. CBitmap bmpImage;
  315. imageDC.CreateCompatibleDC( pDC );
  316. bmpImage.CreateCompatibleBitmap( pDC, rBitmap->Width(), rBitmap->Height() );
  317. CBitmap* pOldImageDCBitmap = imageDC.SelectObject( &bmpImage );
  318. imageDC.BitBlt(0, 0, rBitmap->Width(), rBitmap->Height(), pDC, rBitmap->left, rBitmap->top, SRCCOPY);
  319. // Set the background in memDC to black. Using SRCPAINT with black and any other
  320. // color results in the other color, thus making black the transparent color
  321. memDC.SetBkColor(RGB(0,0,0));
  322. memDC.SetTextColor(RGB(255,255,255));
  323. memDC.BitBlt(0, 0, rBitmap->Width(), rBitmap->Height(), &maskDC, 0, 0, SRCAND);
  324. // Set the foreground to black. See comment above.
  325. imageDC.SetBkColor(RGB(255,255,255));
  326. imageDC.SetTextColor(RGB(0,0,0));
  327. imageDC.BitBlt(0, 0, rBitmap->Width(), rBitmap->Height(), &maskDC, 0, 0, SRCAND);
  328. // Combine the foreground with the background
  329.     imageDC.BitBlt(0, 0, rBitmap->Width(), rBitmap->Height(), &memDC, 0, 0,SRCPAINT);
  330. // Draw the final image to the screen   
  331. pDC->BitBlt( rBitmap->left, rBitmap->top, rBitmap->Width(), rBitmap->Height(), 
  332. &imageDC, 0, 0, SRCCOPY );
  333. imageDC.SelectObject(pOldImageDCBitmap);
  334. maskDC.SelectObject(pOldMaskDCBitmap);
  335. memDC.SelectObject(pOldMemDCBitmap);
  336. }
  337. void CCreditStatic::FillGradient(CDC *pDC, CRect *m_ScrollRect, CRect *m_FillRect, COLORREF color)
  338. float fStep,fRStep,fGStep,fBStep;     // How large is each band?
  339. int iOnBand;  // Loop index
  340. WORD R = GetRValue(color);
  341. WORD G = GetGValue(color);
  342. WORD B = GetBValue(color);
  343. // Determine how large each band should be in order to cover the
  344. // client with 256 bands (one for every color intensity level)
  345. if(m_Gradient % 2) {
  346. fRStep = (float)R / 255.0f;
  347. fGStep = (float)G / 255.0f;
  348. fBStep = (float)B / 255.0f;
  349. } else {
  350. fRStep = (float)(255-R) / 255.0f;
  351. fGStep = (float)(255-G) / 255.0f;
  352. fBStep = (float)(255-B) / 255.0f;
  353. }
  354. COLORREF OldCol = pDC->GetBkColor();
  355. // Start filling bands
  356. fStep = (float)m_ScrollRect->Width() / 256.0f;
  357. for(iOnBand = (256*m_FillRect->left)/m_ScrollRect->Width(); 
  358. (int)(iOnBand*fStep) < m_FillRect->right && iOnBand < 256; iOnBand++) {
  359. CRect r((int)(iOnBand * fStep), m_FillRect->top,
  360. (int)((iOnBand+1) * fStep), m_FillRect->bottom+1);
  361. COLORREF col;
  362. switch(m_Gradient) {
  363. case GRADIENT_RIGHT_DARK:
  364. col = RGB((int)(R-iOnBand*fRStep),(int)(G-iOnBand*fGStep),(int)(B-iOnBand*fBStep));
  365. break;
  366. case GRADIENT_RIGHT_LIGHT:
  367. col = RGB((int)(R+iOnBand*fRStep),(int)(G+iOnBand*fGStep),(int)(B+iOnBand*fBStep));
  368. break;
  369. case GRADIENT_LEFT_DARK:
  370. col = RGB((int)(iOnBand*fRStep),(int)(iOnBand*fGStep),(int)(iOnBand*fBStep));
  371. break;
  372. case GRADIENT_LEFT_LIGHT:
  373. col = RGB(255-(int)(iOnBand*fRStep),255-(int)(iOnBand*fGStep),255-(int)(iOnBand*fBStep));
  374. break;
  375. default:
  376. return;
  377. }
  378. pDC->FillSolidRect(&r, col);
  379. }
  380. pDC->SetBkColor(OldCol);
  381. #define SCROLLDC
  382. void CCreditStatic::MoveCredit(CDC* pDC, CRect& m_ScrollRect, CRect& m_ClientRect, BOOL bCheck)
  383. {
  384. CDC memDC,memDC2;
  385.     memDC.CreateCompatibleDC(pDC);
  386.     memDC2.CreateCompatibleDC(pDC);
  387.     
  388. COLORREF BackColor = (m_bTransparent && m_bitmap.m_hObject != NULL)? RGB(192,192,192) : m_Colors[BACKGROUND_COLOR];
  389. CBitmap *pOldMemDCBitmap = NULL;
  390. CBitmap *pOldMemDC2Bitmap = NULL;
  391. #ifdef SCROLLDC
  392. CRect r1;
  393. #endif
  394. if(m_BmpMain.m_hObject == NULL) {
  395. m_BmpMain.CreateCompatibleBitmap( pDC, m_ScrollRect.Width(), m_ScrollRect.Height() );
  396. pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);
  397. if(m_Gradient && m_bitmap.m_hObject == NULL)
  398. FillGradient(&memDC, &m_ScrollRect, &m_ScrollRect,m_Colors[BACKGROUND_COLOR]);
  399. else
  400. memDC.FillSolidRect(&m_ScrollRect,BackColor);
  401. } else 
  402. pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);
  403. if(m_ClientRect.Width() > 0) {
  404. #ifndef SCROLLDC
  405. CBitmap bitmap;
  406. bitmap.CreateCompatibleBitmap( pDC, m_ClientRect.Width(), m_ClientRect.Height() );
  407. pOldMemDC2Bitmap = memDC2.SelectObject(&bitmap);
  408. memDC2.BitBlt( 0, 0, m_ClientRect.Width(), m_ClientRect.Height()-abs(m_ScrollAmount), 
  409.              &memDC, m_ClientRect.left, abs(m_ScrollAmount), SRCCOPY );
  410. memDC.BitBlt( m_ClientRect.left, 0, m_ClientRect.Width(), m_ClientRect.Height(), 
  411.              &memDC2, 0, 0, SRCCOPY );
  412. memDC2.SelectObject(pOldMemDC2Bitmap);
  413. pOldMemDC2Bitmap = NULL;
  414. #else
  415. CRgn RgnUpdate;
  416. memDC.ScrollDC(0,m_ScrollAmount,(LPCRECT)m_ScrollRect,(LPCRECT)m_ClientRect,&RgnUpdate,
  417. (LPRECT)r1);
  418.     }
  419. else {
  420. r1 = m_ScrollRect;
  421. r1.top = r1.bottom-abs(m_ScrollAmount);
  422. #endif
  423. }
  424. m_nClip = m_nClip + abs(m_ScrollAmount);
  425. //*********************************************************************
  426. // FONT SELECTION
  427.     CFont m_fntArial;
  428. CFont* pOldFont = NULL;
  429. BOOL bSuccess = FALSE;
  430. BOOL bUnderline;
  431. BOOL bItalic;
  432.     int rmcode = 0;
  433. if (!m_szWork.IsEmpty()) {
  434. char c = m_szWork[m_szWork.GetLength()-1];
  435. if(c == m_Escapes[TOP_LEVEL_GROUP]) {
  436. rmcode = 1;
  437. bItalic = FALSE;
  438. bUnderline = FALSE;
  439. m_nCurrentFontHeight = m_TextHeights[TOP_LEVEL_GROUP_HEIGHT];
  440.     bSuccess = m_fntArial.CreateFont(m_TextHeights[TOP_LEVEL_GROUP_HEIGHT], 0, 0, 0, 
  441.     FW_BOLD, bItalic, bUnderline, 0, 
  442.     ANSI_CHARSET,
  443.                     OUT_DEFAULT_PRECIS,
  444.                     CLIP_DEFAULT_PRECIS,
  445.                     PROOF_QUALITY,
  446.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  447.                     (LPSTR)"Arial");
  448. memDC.SetTextColor(m_Colors[TOP_LEVEL_GROUP_COLOR]);
  449. if (pOldFont != NULL) memDC.SelectObject(pOldFont);
  450. pOldFont = memDC.SelectObject(&m_fntArial);
  451. }
  452. else if(c == m_Escapes[GROUP_TITLE]) {
  453. rmcode = 1;
  454. bItalic = FALSE;
  455. bUnderline = FALSE;
  456. m_nCurrentFontHeight = m_TextHeights[GROUP_TITLE_HEIGHT];
  457.     bSuccess = m_fntArial.CreateFont(m_TextHeights[GROUP_TITLE_HEIGHT], 0, 0, 0, 
  458.     FW_BOLD, bItalic, bUnderline, 0, 
  459.     ANSI_CHARSET,
  460.                     OUT_DEFAULT_PRECIS,
  461.                     CLIP_DEFAULT_PRECIS,
  462.                     PROOF_QUALITY,
  463.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  464.                     (LPSTR)"Arial");
  465. memDC.SetTextColor(m_Colors[GROUP_TITLE_COLOR]);
  466. if (pOldFont != NULL) memDC.SelectObject(pOldFont);
  467. pOldFont = memDC.SelectObject(&m_fntArial);
  468. }
  469. else if(c == m_Escapes[TOP_LEVEL_TITLE]) {
  470. rmcode = 1;
  471. bItalic = FALSE;
  472. // bUnderline = TRUE;
  473. bUnderline = FALSE;
  474. m_nCurrentFontHeight = m_TextHeights[TOP_LEVEL_TITLE_HEIGHT];
  475. bSuccess = m_fntArial.CreateFont(m_TextHeights[TOP_LEVEL_TITLE_HEIGHT], 0, 0, 0, 
  476. FW_BOLD, bItalic, bUnderline, 0, 
  477. ANSI_CHARSET,
  478.                 OUT_DEFAULT_PRECIS,
  479.                 CLIP_DEFAULT_PRECIS,
  480.                 PROOF_QUALITY,
  481.                 VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  482.                 (LPSTR)"Arial");
  483. memDC.SetTextColor(m_Colors[TOP_LEVEL_TITLE_COLOR]);
  484. if (pOldFont != NULL) memDC.SelectObject(pOldFont);
  485. pOldFont = memDC.SelectObject(&m_fntArial);
  486. }
  487. else if(c == m_Escapes[DISPLAY_BITMAP]) {
  488. if (!m_bProcessingBitmap)
  489. {
  490. CString szBitmap = m_szWork.Left(m_szWork.GetLength()-1);
  491. if(m_bmpWork.LoadBitmap((const char *)szBitmap)) {
  492. BITMAP  m_bmpInfo;
  493.     m_bmpWork.GetObject(sizeof(BITMAP), &m_bmpInfo);
  494. m_size.cx = m_bmpInfo.bmWidth; // width  of dest rect
  495. m_size.cy = m_bmpInfo.bmHeight;
  496. // upper left point of dest
  497. m_pt.x = (m_ClientRect.right - 
  498. ((m_ClientRect.Width())/2) - (m_size.cx/2));
  499. m_pt.y = m_ClientRect.bottom;
  500. m_bProcessingBitmap = TRUE;
  501. if (pOldMemDC2Bitmap != NULL) memDC2.SelectObject(pOldMemDC2Bitmap);
  502. pOldMemDC2Bitmap = memDC2.SelectObject(&m_bmpWork);
  503. }
  504. else
  505. c = ' ';
  506. }
  507. else {
  508. if (pOldMemDC2Bitmap != NULL) memDC2.SelectObject(pOldMemDC2Bitmap);
  509. pOldMemDC2Bitmap = memDC2.SelectObject(&m_bmpWork);
  510. }
  511. }
  512. else {
  513. bItalic = FALSE;
  514. bUnderline = FALSE;
  515. m_nCurrentFontHeight = m_TextHeights[NORMAL_TEXT_HEIGHT];
  516.     bSuccess = m_fntArial.CreateFont(m_TextHeights[NORMAL_TEXT_HEIGHT], 0, 0, 0, 
  517.     FW_THIN, bItalic, bUnderline, 0, 
  518.     ANSI_CHARSET,
  519.                     OUT_DEFAULT_PRECIS,
  520.                     CLIP_DEFAULT_PRECIS,
  521.                     PROOF_QUALITY,
  522.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  523.                     (LPSTR)"Arial");
  524. memDC.SetTextColor(m_Colors[NORMAL_TEXT_COLOR]);
  525. if (pOldFont != NULL) memDC.SelectObject(pOldFont);
  526. pOldFont = memDC.SelectObject(&m_fntArial);
  527. }
  528. }
  529. #ifndef SCROLLDC
  530. CRect r1(m_ScrollRect);
  531. r1.top = r1.bottom-abs(m_ScrollAmount);
  532. #endif
  533. if(m_Gradient && m_bitmap.m_hObject == NULL)
  534. FillGradient(&memDC, &m_ScrollRect, &r1, m_Colors[BACKGROUND_COLOR]);
  535. else
  536. memDC.FillSolidRect(&r1,BackColor);
  537. memDC.SetBkMode(TRANSPARENT);
  538. if (!m_bProcessingBitmap)
  539. {
  540. if(bCheck) {
  541. CSize size = memDC.GetTextExtent((LPCTSTR)m_szWork,m_szWork.GetLength()-rmcode);
  542. if(size.cx > n_MaxWidth) {
  543. n_MaxWidth = (size.cx > m_ScrollRect.Width())? m_ScrollRect.Width():size.cx;
  544. m_ClientRect.left = (m_ScrollRect.Width()-n_MaxWidth)/2;
  545. m_ClientRect.right = m_ClientRect.left + n_MaxWidth;
  546. }
  547. }
  548. CRect r(m_ClientRect);
  549. r.top = r.bottom-m_nClip;
  550. int x = memDC.DrawText((const char *)m_szWork,m_szWork.GetLength()-rmcode,&r,DT_TOP|DT_CENTER|
  551. DT_NOPREFIX | DT_SINGLELINE);
  552. m_bDrawText=FALSE;
  553. }
  554. else
  555. {
  556. if(bCheck) {
  557. CSize size = memDC.GetTextExtent((LPCTSTR)m_szWork,m_szWork.GetLength()-rmcode);
  558. if(m_size.cx > n_MaxWidth) {
  559. n_MaxWidth = (m_size.cx > m_ScrollRect.Width())? m_ScrollRect.Width():m_size.cx;
  560. m_ClientRect.left = (m_ScrollRect.Width()-n_MaxWidth)/2;
  561. m_ClientRect.right = m_ClientRect.left + n_MaxWidth;
  562. }
  563. }
  564. CRect r( m_pt.x, m_pt.y-m_nClip, m_pt.x+ m_size.cx, m_pt.y);
  565. DrawBitmap(&memDC, &memDC2, &r);
  566. //     memDC.BitBlt( m_pt.x, m_pt.y-m_nClip, m_size.cx, m_nClip, 
  567. //            &memDC2, 0, 0, SRCCOPY );
  568. if (m_nClip >= m_size.cy)
  569. {
  570. m_bmpWork.DeleteObject();
  571. m_bProcessingBitmap = FALSE;
  572. m_nClip=0;
  573. m_szWork.Empty();
  574. m_nCounter=1;
  575. }
  576. }
  577. if (pOldMemDC2Bitmap != NULL) memDC2.SelectObject(pOldMemDC2Bitmap);
  578. if (pOldFont != NULL) memDC.SelectObject(pOldFont);
  579. memDC.SelectObject(pOldMemDCBitmap);
  580. }
  581. void CCreditStatic::DrawCredit(CDC* pDC, CRect& m_ScrollRect)
  582. {
  583. if(m_BmpMain.m_hObject != NULL) return;
  584. CDC memDC,memDC2;
  585.     memDC.CreateCompatibleDC(pDC);
  586.     memDC2.CreateCompatibleDC(pDC);
  587. COLORREF BackColor = (m_bTransparent && m_bitmap.m_hObject != NULL)? RGB(192,192,192) : m_Colors[BACKGROUND_COLOR];
  588.     
  589. CBitmap *pOldMemDCBitmap = NULL;
  590. m_BmpMain.CreateCompatibleBitmap( pDC, m_ScrollRect.Width(), m_ScrollRect.Height() );
  591. pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);
  592. if(m_Gradient && m_bitmap.m_hObject == NULL)
  593. FillGradient(&memDC, &m_ScrollRect, &m_ScrollRect, m_Colors[BACKGROUND_COLOR]);
  594. else
  595. memDC.FillSolidRect(&m_ScrollRect, BackColor);
  596. POSITION pos = m_ArrCredit.GetHeadPosition();
  597. int height = 0;
  598. while(pos != NULL && height <= m_ScrollRect.Height()) {
  599. CString m_szWork = m_ArrCredit.GetNext(pos);
  600. CFont m_fntArial;
  601. CFont *pOldFont = NULL;
  602. CBitmap *pOldMemDC2Bitmap = NULL;
  603. CDC memDC2;
  604. memDC2.CreateCompatibleDC(pDC);
  605. //*********************************************************************
  606. // FONT SELECTION
  607. BOOL bSuccess = FALSE;
  608. BOOL bIsBitmap = FALSE;
  609. BOOL bUnderline;
  610. BOOL bItalic;
  611. int rmcode = 0;
  612.         CBitmap bitmap;
  613. if (!m_szWork.IsEmpty()) {
  614. char c = m_szWork[m_szWork.GetLength()-1];
  615. if(c == m_Escapes[TOP_LEVEL_GROUP]) {
  616. rmcode = 1;
  617. bItalic = FALSE;
  618. bUnderline = FALSE;
  619. m_nCurrentFontHeight = m_TextHeights[TOP_LEVEL_GROUP_HEIGHT];
  620.     bSuccess = m_fntArial.CreateFont(m_TextHeights[TOP_LEVEL_GROUP_HEIGHT], 0, 0, 0, 
  621.     FW_BOLD, bItalic, bUnderline, 0, 
  622.     ANSI_CHARSET,
  623.                     OUT_DEFAULT_PRECIS,
  624.                     CLIP_DEFAULT_PRECIS,
  625.                     PROOF_QUALITY,
  626.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  627.                     (LPSTR)"Arial");
  628. memDC.SetTextColor(m_Colors[TOP_LEVEL_GROUP_COLOR]);
  629. pOldFont = memDC.SelectObject(&m_fntArial);
  630. }
  631. else if(c == m_Escapes[GROUP_TITLE]) {
  632. rmcode = 1;
  633. bItalic = FALSE;
  634. bUnderline = FALSE;
  635. m_nCurrentFontHeight = m_TextHeights[GROUP_TITLE_HEIGHT];
  636.     bSuccess = m_fntArial.CreateFont(m_TextHeights[GROUP_TITLE_HEIGHT], 0, 0, 0, 
  637.     FW_BOLD, bItalic, bUnderline, 0, 
  638.     ANSI_CHARSET,
  639.                     OUT_DEFAULT_PRECIS,
  640.                     CLIP_DEFAULT_PRECIS,
  641.                     PROOF_QUALITY,
  642.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  643.                     (LPSTR)"Arial");
  644. memDC.SetTextColor(m_Colors[GROUP_TITLE_COLOR]);
  645. pOldFont = memDC.SelectObject(&m_fntArial);
  646. }
  647. else if(c == m_Escapes[TOP_LEVEL_TITLE]) {
  648. rmcode = 1;
  649. bItalic = FALSE;
  650. // bUnderline = TRUE;
  651. bUnderline = FALSE;
  652. m_nCurrentFontHeight = m_TextHeights[TOP_LEVEL_TITLE_HEIGHT];
  653. bSuccess = m_fntArial.CreateFont(m_TextHeights[TOP_LEVEL_TITLE_HEIGHT], 0, 0, 0, 
  654. FW_BOLD, bItalic, bUnderline, 0, 
  655. ANSI_CHARSET,
  656.                 OUT_DEFAULT_PRECIS,
  657.                 CLIP_DEFAULT_PRECIS,
  658.                 PROOF_QUALITY,
  659.                 VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  660.                 (LPSTR)"Arial");
  661. memDC.SetTextColor(m_Colors[TOP_LEVEL_TITLE_COLOR]);
  662. pOldFont = memDC.SelectObject(&m_fntArial);
  663. }
  664. else if(c == m_Escapes[DISPLAY_BITMAP]) {
  665. CString szBitmap = m_szWork.Left(m_szWork.GetLength()-1);
  666. if(bitmap.LoadBitmap((const char *)szBitmap)) {
  667. BITMAP  m_bmpInfo;
  668.     bitmap.GetObject(sizeof(BITMAP), &m_bmpInfo);
  669. m_size.cx = m_bmpInfo.bmWidth; // width  of dest rect
  670. m_size.cy = m_bmpInfo.bmHeight;
  671. // upper left point of dest
  672. m_pt.x = (m_ScrollRect.right - 
  673. ((m_ScrollRect.Width())/2) - (m_size.cx/2));
  674. m_pt.y = height;
  675. pOldMemDC2Bitmap = memDC2.SelectObject(&bitmap);
  676. bIsBitmap = TRUE;
  677. }
  678. else
  679. c = ' ';
  680. }
  681. else {
  682. bItalic = FALSE;
  683. bUnderline = FALSE;
  684. m_nCurrentFontHeight = m_TextHeights[NORMAL_TEXT_HEIGHT];
  685.     bSuccess = m_fntArial.CreateFont(m_TextHeights[NORMAL_TEXT_HEIGHT], 0, 0, 0, 
  686.     FW_THIN, bItalic, bUnderline, 0, 
  687.     ANSI_CHARSET,
  688.                     OUT_DEFAULT_PRECIS,
  689.                     CLIP_DEFAULT_PRECIS,
  690.                     PROOF_QUALITY,
  691.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  692.                     (LPSTR)"Arial");
  693. memDC.SetTextColor(m_Colors[NORMAL_TEXT_COLOR]);
  694. pOldFont = memDC.SelectObject(&m_fntArial);
  695. }
  696. }
  697. memDC.SetBkMode(TRANSPARENT);
  698. if (!bIsBitmap)
  699. {
  700. CRect r(m_ScrollRect);
  701. r.top = height;
  702. CSize size;
  703. if(m_szWork.GetLength()-rmcode != 0) 
  704. {
  705. int x = memDC.DrawText((const char *)m_szWork,m_szWork.GetLength()-rmcode,&r,DT_TOP|DT_CENTER|
  706. DT_NOPREFIX | DT_SINGLELINE);
  707. size = memDC.GetTextExtent((LPCTSTR)m_szWork,m_szWork.GetLength()-rmcode);
  708. }
  709. else
  710. size = memDC.GetTextExtent((LPCTSTR)"W",1);
  711. height += size.cy;
  712. }
  713. else
  714. {
  715. CRect r( m_pt.x, m_pt.y, m_pt.x + m_size.cx, m_pt.y + m_size.cy);
  716. DrawBitmap(&memDC, &memDC2, &r);
  717. //     memDC.BitBlt( m_pt.x, m_pt.y, m_size.cx, m_size.cy, &memDC2, 0, 0, SRCCOPY );
  718. height += m_size.cy;
  719. }
  720. if (pOldMemDC2Bitmap != NULL) memDC2.SelectObject(pOldMemDC2Bitmap);
  721. if (pOldFont != NULL) memDC.SelectObject(pOldFont);
  722. }
  723. memDC.SelectObject(pOldMemDCBitmap);
  724. }
  725. void CCreditStatic::OnDestroy() 
  726. {
  727. CStatic::OnDestroy();
  728. m_ArrCredit.RemoveAll();
  729. if(TimerOn)
  730. ASSERT(KillTimer(DISPLAY_TIMER_ID));
  731. }
  732. BOOL CCreditStatic::SetBkImage(UINT nIDResource)
  733. {
  734.     return SetBkImage( (LPCTSTR)nIDResource );
  735. }
  736. BOOL CCreditStatic::SetBkImage(LPCTSTR lpszResourceName)
  737. {
  738.     // If this is not the first call then Delete GDI objects
  739.     if( m_bitmap.m_hObject != NULL )
  740. m_bitmap.DeleteObject();
  741.     if( m_pal.m_hObject != NULL )
  742. m_pal.DeleteObject();
  743.     
  744.     
  745.     HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(), 
  746.             lpszResourceName, IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION );
  747.      if( hBmp == NULL ) 
  748.         return FALSE;
  749. m_bitmap.Attach( hBmp );
  750.     BITMAP bm;
  751.     m_bitmap.GetBitmap( &bm );
  752.     m_cxBitmap = bm.bmWidth;
  753.     m_cyBitmap = bm.bmHeight;
  754.     // Create a logical palette for the bitmap
  755.     DIBSECTION ds;
  756.     BITMAPINFOHEADER &bmInfo = ds.dsBmih;
  757.     m_bitmap.GetObject( sizeof(ds), &ds );
  758.     int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount;
  759.     // Create a halftone palette if colors > 256. 
  760.     CClientDC dc(NULL);             // Desktop DC
  761.     if( nColors > 256 )
  762.         m_pal.CreateHalftonePalette( &dc );
  763.     else
  764.     {
  765.         // Create the palette
  766.         RGBQUAD *pRGB = new RGBQUAD[nColors];
  767.         CDC memDC;
  768.         memDC.CreateCompatibleDC(&dc);
  769.         CBitmap* pOldMemDCBitmap = memDC.SelectObject( &m_bitmap );
  770.         ::GetDIBColorTable( memDC, 0, nColors, pRGB );
  771.         UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
  772.         LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
  773.         pLP->palVersion = 0x300;
  774.         pLP->palNumEntries = nColors;
  775.         for( int i=0; i < nColors; i++)
  776.         {
  777.             pLP->palPalEntry[i].peRed = pRGB[i].rgbRed;
  778.             pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
  779.             pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
  780.             pLP->palPalEntry[i].peFlags = 0;
  781.         }
  782.         m_pal.CreatePalette( pLP );
  783. memDC.SelectObject(pOldMemDCBitmap);
  784.         delete[] pLP;
  785.         delete[] pRGB;
  786.     }
  787. //    Invalidate();
  788.     return TRUE;
  789. }