CREDITSTATIC.CPP
上传用户:hydatong
上传日期:2022-08-07
资源大小:219k
文件大小:28k
源码类别:

游戏

开发平台:

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(0,255,0);   // Yellow
  18. m_Colors[3] = RGB(0, 255, 255);   // Turquoise
  19. m_Colors[4] = RGB(0, 0, 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. //以下由王文利Modified--UNDO
  267. imageDC.StretchBlt(0, 0, m_ScrollRect.right, m_ScrollRect.bottom,
  268. &tempDC, 0, 0, m_cxBitmap, m_cyBitmap, SRCCOPY );
  269. // for( int i = 0; i < m_ScrollRect.right; i += m_cxBitmap )
  270. // for( int j = 0; j < m_ScrollRect.bottom; j += m_cyBitmap )
  271. // imageDC.BitBlt( i, j, m_cxBitmap, m_cyBitmap, &tempDC, 0, 0, SRCCOPY );
  272. // Set the background in memDC to black. Using SRCPAINT with black and any other
  273. // color results in the other color, thus making black the transparent color
  274. memDC.SetBkColor(RGB(0,0,0));
  275. memDC.SetTextColor(RGB(255,255,255));
  276. memDC.BitBlt(0, 0, m_ClientRect.Width(), m_ClientRect.Height(), &maskDC, 0, 0, SRCAND);
  277. // Set the foreground to black. See comment above.
  278. imageDC.SetBkColor(RGB(255,255,255));
  279. imageDC.SetTextColor(RGB(0,0,0));
  280. imageDC.BitBlt(m_ClientRect.left, m_ClientRect.top, m_ClientRect.Width(), m_ClientRect.Height(), 
  281. &maskDC, 0, 0, SRCAND);
  282. // Combine the foreground with the background
  283.     imageDC.BitBlt(m_ClientRect.left, m_ClientRect.top, m_ClientRect.Width(), m_ClientRect.Height(), 
  284. &memDC, 0, 0,SRCPAINT);
  285. // Draw the final image to the screen   
  286. pDC->BitBlt( 0, 0, m_ScrollRect.Width(), m_ScrollRect.Height(), 
  287. &imageDC, 0, 0, SRCCOPY );
  288. imageDC.SelectObject(pOldImageDCBitmap);
  289. maskDC.SelectObject(pOldMaskDCBitmap);
  290. tempDC.SelectObject(pOldTempDCBitmap);
  291. memDC.SelectObject(pOldMemDCBitmap);
  292. }
  293. void CCreditStatic::DrawBitmap(CDC* pDC, CDC* pDC2, CRect *rBitmap)
  294. {
  295. if(!m_bTransparent || m_bitmap.m_hObject != NULL) {
  296.      pDC->BitBlt( rBitmap->left, rBitmap->top, rBitmap->Width(), rBitmap->Height(), 
  297.             pDC2, 0, 0, SRCCOPY );
  298. return;
  299. }
  300. CDC memDC;
  301. memDC.CreateCompatibleDC( pDC );
  302.     // Now create a mask
  303. CBitmap bitmap;
  304. bitmap.CreateCompatibleBitmap( pDC, rBitmap->Width(), rBitmap->Height() );
  305. CBitmap* pOldMemDCBitmap = memDC.SelectObject( &bitmap );
  306. memDC.BitBlt( 0, 0, rBitmap->Width(), rBitmap->Height(), pDC2, 0, 0, SRCCOPY );
  307. CDC maskDC;
  308. maskDC.CreateCompatibleDC(pDC);
  309. // Create monochrome bitmap for the mask
  310. CBitmap maskBitmap;
  311. maskBitmap.CreateBitmap( rBitmap->Width(), rBitmap->Height(), 1, 1, NULL );
  312. CBitmap* pOldMaskDCBitmap = maskDC.SelectObject( &maskBitmap );
  313.     memDC.SetBkColor(RGB(192,192,192));
  314. // Create the mask from the memory DC
  315. maskDC.BitBlt( 0, 0, rBitmap->Width(), rBitmap->Height(), &memDC, 0, 0, SRCCOPY );
  316. CDC imageDC;
  317. CBitmap bmpImage;
  318. imageDC.CreateCompatibleDC( pDC );
  319. bmpImage.CreateCompatibleBitmap( pDC, rBitmap->Width(), rBitmap->Height() );
  320. CBitmap* pOldImageDCBitmap = imageDC.SelectObject( &bmpImage );
  321. imageDC.BitBlt(0, 0, rBitmap->Width(), rBitmap->Height(), pDC, rBitmap->left, rBitmap->top, SRCCOPY);
  322. // Set the background in memDC to black. Using SRCPAINT with black and any other
  323. // color results in the other color, thus making black the transparent color
  324. memDC.SetBkColor(RGB(0,0,0));
  325. memDC.SetTextColor(RGB(255,255,255));
  326. memDC.BitBlt(0, 0, rBitmap->Width(), rBitmap->Height(), &maskDC, 0, 0, SRCAND);
  327. // Set the foreground to black. See comment above.
  328. imageDC.SetBkColor(RGB(255,255,255));
  329. imageDC.SetTextColor(RGB(0,0,0));
  330. imageDC.BitBlt(0, 0, rBitmap->Width(), rBitmap->Height(), &maskDC, 0, 0, SRCAND);
  331. // Combine the foreground with the background
  332.     imageDC.BitBlt(0, 0, rBitmap->Width(), rBitmap->Height(), &memDC, 0, 0,SRCPAINT);
  333. // Draw the final image to the screen   
  334. pDC->BitBlt( rBitmap->left, rBitmap->top, rBitmap->Width(), rBitmap->Height(), 
  335. &imageDC, 0, 0, SRCCOPY );
  336. imageDC.SelectObject(pOldImageDCBitmap);
  337. maskDC.SelectObject(pOldMaskDCBitmap);
  338. memDC.SelectObject(pOldMemDCBitmap);
  339. }
  340. void CCreditStatic::FillGradient(CDC *pDC, CRect *m_ScrollRect, CRect *m_FillRect, COLORREF color)
  341. float fStep,fRStep,fGStep,fBStep;     // How large is each band?
  342. int iOnBand;  // Loop index
  343. WORD R = GetRValue(color);
  344. WORD G = GetGValue(color);
  345. WORD B = GetBValue(color);
  346. // Determine how large each band should be in order to cover the
  347. // client with 256 bands (one for every color intensity level)
  348. if(m_Gradient % 2) {
  349. fRStep = (float)R / 255.0f;
  350. fGStep = (float)G / 255.0f;
  351. fBStep = (float)B / 255.0f;
  352. } else {
  353. fRStep = (float)(255-R) / 255.0f;
  354. fGStep = (float)(255-G) / 255.0f;
  355. fBStep = (float)(255-B) / 255.0f;
  356. }
  357. COLORREF OldCol = pDC->GetBkColor();
  358. // Start filling bands
  359. fStep = (float)m_ScrollRect->Width() / 256.0f;
  360. for(iOnBand = (256*m_FillRect->left)/m_ScrollRect->Width(); 
  361. (int)(iOnBand*fStep) < m_FillRect->right && iOnBand < 256; iOnBand++) {
  362. CRect r((int)(iOnBand * fStep), m_FillRect->top,
  363. (int)((iOnBand+1) * fStep), m_FillRect->bottom+1);
  364. COLORREF col;
  365. switch(m_Gradient) {
  366. case GRADIENT_RIGHT_DARK:
  367. col = RGB((int)(R-iOnBand*fRStep),(int)(G-iOnBand*fGStep),(int)(B-iOnBand*fBStep));
  368. break;
  369. case GRADIENT_RIGHT_LIGHT:
  370. col = RGB((int)(R+iOnBand*fRStep),(int)(G+iOnBand*fGStep),(int)(B+iOnBand*fBStep));
  371. break;
  372. case GRADIENT_LEFT_DARK:
  373. col = RGB((int)(iOnBand*fRStep),(int)(iOnBand*fGStep),(int)(iOnBand*fBStep));
  374. break;
  375. case GRADIENT_LEFT_LIGHT:
  376. col = RGB(255-(int)(iOnBand*fRStep),255-(int)(iOnBand*fGStep),255-(int)(iOnBand*fBStep));
  377. break;
  378. default:
  379. return;
  380. }
  381. pDC->FillSolidRect(&r, col);
  382. }
  383. pDC->SetBkColor(OldCol);
  384. #define SCROLLDC
  385. void CCreditStatic::MoveCredit(CDC* pDC, CRect& m_ScrollRect, CRect& m_ClientRect, BOOL bCheck)
  386. {
  387. CDC memDC,memDC2;
  388.     memDC.CreateCompatibleDC(pDC);
  389.     memDC2.CreateCompatibleDC(pDC);
  390.     
  391. COLORREF BackColor = (m_bTransparent && m_bitmap.m_hObject != NULL)? RGB(192,192,192) : m_Colors[BACKGROUND_COLOR];
  392. CBitmap *pOldMemDCBitmap = NULL;
  393. CBitmap *pOldMemDC2Bitmap = NULL;
  394. #ifdef SCROLLDC
  395. CRect r1;
  396. #endif
  397. if(m_BmpMain.m_hObject == NULL) {
  398. m_BmpMain.CreateCompatibleBitmap( pDC, m_ScrollRect.Width(), m_ScrollRect.Height() );
  399. pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);
  400. if(m_Gradient && m_bitmap.m_hObject == NULL)
  401. FillGradient(&memDC, &m_ScrollRect, &m_ScrollRect,m_Colors[BACKGROUND_COLOR]);
  402. else
  403. memDC.FillSolidRect(&m_ScrollRect,BackColor);
  404. } else 
  405. pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);
  406. if(m_ClientRect.Width() > 0) {
  407. #ifndef SCROLLDC
  408. CBitmap bitmap;
  409. bitmap.CreateCompatibleBitmap( pDC, m_ClientRect.Width(), m_ClientRect.Height() );
  410. pOldMemDC2Bitmap = memDC2.SelectObject(&bitmap);
  411. memDC2.BitBlt( 0, 0, m_ClientRect.Width(), m_ClientRect.Height()-abs(m_ScrollAmount), 
  412.              &memDC, m_ClientRect.left, abs(m_ScrollAmount), SRCCOPY );
  413. memDC.BitBlt( m_ClientRect.left, 0, m_ClientRect.Width(), m_ClientRect.Height(), 
  414.              &memDC2, 0, 0, SRCCOPY );
  415. memDC2.SelectObject(pOldMemDC2Bitmap);
  416. pOldMemDC2Bitmap = NULL;
  417. #else
  418. CRgn RgnUpdate;
  419. memDC.ScrollDC(0,m_ScrollAmount,(LPCRECT)m_ScrollRect,(LPCRECT)m_ClientRect,&RgnUpdate,
  420. (LPRECT)r1);
  421.     }
  422. else {
  423. r1 = m_ScrollRect;
  424. r1.top = r1.bottom-abs(m_ScrollAmount);
  425. #endif
  426. }
  427. m_nClip = m_nClip + abs(m_ScrollAmount);
  428. //*********************************************************************
  429. // FONT SELECTION
  430.     CFont m_fntArial;
  431. CFont* pOldFont = NULL;
  432. BOOL bSuccess = FALSE;
  433. BOOL bUnderline;
  434. BOOL bItalic;
  435.     int rmcode = 0;
  436. if (!m_szWork.IsEmpty()) {
  437. char c = m_szWork[m_szWork.GetLength()-1];
  438. if(c == m_Escapes[TOP_LEVEL_GROUP]) {
  439. rmcode = 1;
  440. bItalic = FALSE;
  441. bUnderline = FALSE;
  442. m_nCurrentFontHeight = m_TextHeights[TOP_LEVEL_GROUP_HEIGHT];
  443.     bSuccess = m_fntArial.CreateFont(m_TextHeights[TOP_LEVEL_GROUP_HEIGHT], 0, 0, 0, 
  444.     FW_BOLD, bItalic, bUnderline, 0, 
  445.     ANSI_CHARSET,
  446.                     OUT_DEFAULT_PRECIS,
  447.                     CLIP_DEFAULT_PRECIS,
  448.                     PROOF_QUALITY,
  449.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  450.                     (LPSTR)"Arial");
  451. memDC.SetTextColor(m_Colors[TOP_LEVEL_GROUP_COLOR]);
  452. if (pOldFont != NULL) memDC.SelectObject(pOldFont);
  453. pOldFont = memDC.SelectObject(&m_fntArial);
  454. }
  455. else if(c == m_Escapes[GROUP_TITLE]) {
  456. rmcode = 1;
  457. bItalic = FALSE;
  458. bUnderline = FALSE;
  459. m_nCurrentFontHeight = m_TextHeights[GROUP_TITLE_HEIGHT];
  460.     bSuccess = m_fntArial.CreateFont(m_TextHeights[GROUP_TITLE_HEIGHT], 0, 0, 0, 
  461.     FW_BOLD, bItalic, bUnderline, 0, 
  462.     ANSI_CHARSET,
  463.                     OUT_DEFAULT_PRECIS,
  464.                     CLIP_DEFAULT_PRECIS,
  465.                     PROOF_QUALITY,
  466.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  467.                     (LPSTR)"Arial");
  468. memDC.SetTextColor(m_Colors[GROUP_TITLE_COLOR]);
  469. if (pOldFont != NULL) memDC.SelectObject(pOldFont);
  470. pOldFont = memDC.SelectObject(&m_fntArial);
  471. }
  472. else if(c == m_Escapes[TOP_LEVEL_TITLE]) {
  473. rmcode = 1;
  474. bItalic = FALSE;
  475. // bUnderline = TRUE;
  476. bUnderline = FALSE;
  477. m_nCurrentFontHeight = m_TextHeights[TOP_LEVEL_TITLE_HEIGHT];
  478. bSuccess = m_fntArial.CreateFont(m_TextHeights[TOP_LEVEL_TITLE_HEIGHT], 0, 0, 0, 
  479. FW_BOLD, bItalic, bUnderline, 0, 
  480. ANSI_CHARSET,
  481.                 OUT_DEFAULT_PRECIS,
  482.                 CLIP_DEFAULT_PRECIS,
  483.                 PROOF_QUALITY,
  484.                 VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  485.                 (LPSTR)"Arial");
  486. memDC.SetTextColor(m_Colors[TOP_LEVEL_TITLE_COLOR]);
  487. if (pOldFont != NULL) memDC.SelectObject(pOldFont);
  488. pOldFont = memDC.SelectObject(&m_fntArial);
  489. }
  490. else if(c == m_Escapes[DISPLAY_BITMAP]) {
  491. if (!m_bProcessingBitmap)
  492. {
  493. CString szBitmap = m_szWork.Left(m_szWork.GetLength()-1);
  494. if(m_bmpWork.LoadBitmap((const char *)szBitmap)) {
  495. BITMAP  m_bmpInfo;
  496.     m_bmpWork.GetObject(sizeof(BITMAP), &m_bmpInfo);
  497. m_size.cx = m_bmpInfo.bmWidth; // width  of dest rect
  498. m_size.cy = m_bmpInfo.bmHeight;
  499. // upper left point of dest
  500. m_pt.x = (m_ClientRect.right - 
  501. ((m_ClientRect.Width())/2) - (m_size.cx/2));
  502. m_pt.y = m_ClientRect.bottom;
  503. m_bProcessingBitmap = TRUE;
  504. if (pOldMemDC2Bitmap != NULL) memDC2.SelectObject(pOldMemDC2Bitmap);
  505. pOldMemDC2Bitmap = memDC2.SelectObject(&m_bmpWork);
  506. }
  507. else
  508. c = ' ';
  509. }
  510. else {
  511. if (pOldMemDC2Bitmap != NULL) memDC2.SelectObject(pOldMemDC2Bitmap);
  512. pOldMemDC2Bitmap = memDC2.SelectObject(&m_bmpWork);
  513. }
  514. }
  515. else {
  516. bItalic = FALSE;
  517. bUnderline = FALSE;
  518. m_nCurrentFontHeight = m_TextHeights[NORMAL_TEXT_HEIGHT];
  519.     bSuccess = m_fntArial.CreateFont(m_TextHeights[NORMAL_TEXT_HEIGHT], 0, 0, 0, 
  520.     FW_THIN, bItalic, bUnderline, 0, 
  521.     ANSI_CHARSET,
  522.                     OUT_DEFAULT_PRECIS,
  523.                     CLIP_DEFAULT_PRECIS,
  524.                     PROOF_QUALITY,
  525.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  526.                     (LPSTR)"Arial");
  527. memDC.SetTextColor(m_Colors[NORMAL_TEXT_COLOR]);
  528. if (pOldFont != NULL) memDC.SelectObject(pOldFont);
  529. pOldFont = memDC.SelectObject(&m_fntArial);
  530. }
  531. }
  532. #ifndef SCROLLDC
  533. CRect r1(m_ScrollRect);
  534. r1.top = r1.bottom-abs(m_ScrollAmount);
  535. #endif
  536. if(m_Gradient && m_bitmap.m_hObject == NULL)
  537. FillGradient(&memDC, &m_ScrollRect, &r1, m_Colors[BACKGROUND_COLOR]);
  538. else
  539. memDC.FillSolidRect(&r1,BackColor);
  540. memDC.SetBkMode(TRANSPARENT);
  541. if (!m_bProcessingBitmap)
  542. {
  543. if(bCheck) {
  544. CSize size = memDC.GetTextExtent((LPCTSTR)m_szWork,m_szWork.GetLength()-rmcode);
  545. if(size.cx > n_MaxWidth) {
  546. n_MaxWidth = (size.cx > m_ScrollRect.Width())? m_ScrollRect.Width():size.cx;
  547. m_ClientRect.left = (m_ScrollRect.Width()-n_MaxWidth)/2;
  548. m_ClientRect.right = m_ClientRect.left + n_MaxWidth;
  549. }
  550. }
  551. CRect r(m_ClientRect);
  552. r.top = r.bottom-m_nClip;
  553. int x = memDC.DrawText((const char *)m_szWork,m_szWork.GetLength()-rmcode,&r,DT_TOP|DT_CENTER|
  554. DT_NOPREFIX | DT_SINGLELINE);
  555. m_bDrawText=FALSE;
  556. }
  557. else
  558. {
  559. if(bCheck) {
  560. CSize size = memDC.GetTextExtent((LPCTSTR)m_szWork,m_szWork.GetLength()-rmcode);
  561. if(m_size.cx > n_MaxWidth) {
  562. n_MaxWidth = (m_size.cx > m_ScrollRect.Width())? m_ScrollRect.Width():m_size.cx;
  563. m_ClientRect.left = (m_ScrollRect.Width()-n_MaxWidth)/2;
  564. m_ClientRect.right = m_ClientRect.left + n_MaxWidth;
  565. }
  566. }
  567. CRect r( m_pt.x, m_pt.y-m_nClip, m_pt.x+ m_size.cx, m_pt.y);
  568. DrawBitmap(&memDC, &memDC2, &r);
  569. //     memDC.BitBlt( m_pt.x, m_pt.y-m_nClip, m_size.cx, m_nClip, 
  570. //            &memDC2, 0, 0, SRCCOPY );
  571. if (m_nClip >= m_size.cy)
  572. {
  573. m_bmpWork.DeleteObject();
  574. m_bProcessingBitmap = FALSE;
  575. m_nClip=0;
  576. m_szWork.Empty();
  577. m_nCounter=1;
  578. }
  579. }
  580. if (pOldMemDC2Bitmap != NULL) memDC2.SelectObject(pOldMemDC2Bitmap);
  581. if (pOldFont != NULL) memDC.SelectObject(pOldFont);
  582. memDC.SelectObject(pOldMemDCBitmap);
  583. }
  584. void CCreditStatic::DrawCredit(CDC* pDC, CRect& m_ScrollRect)
  585. {
  586. if(m_BmpMain.m_hObject != NULL) return;
  587. CDC memDC,memDC2;
  588.     memDC.CreateCompatibleDC(pDC);
  589.     memDC2.CreateCompatibleDC(pDC);
  590. COLORREF BackColor = (m_bTransparent && m_bitmap.m_hObject != NULL)? RGB(192,192,192) : m_Colors[BACKGROUND_COLOR];
  591.     
  592. CBitmap *pOldMemDCBitmap = NULL;
  593. m_BmpMain.CreateCompatibleBitmap( pDC, m_ScrollRect.Width(), m_ScrollRect.Height() );
  594. pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);
  595. if(m_Gradient && m_bitmap.m_hObject == NULL)
  596. FillGradient(&memDC, &m_ScrollRect, &m_ScrollRect, m_Colors[BACKGROUND_COLOR]);
  597. else
  598. memDC.FillSolidRect(&m_ScrollRect, BackColor);
  599. POSITION pos = m_ArrCredit.GetHeadPosition();
  600. int height = 0;
  601. while(pos != NULL && height <= m_ScrollRect.Height()) {
  602. CString m_szWork = m_ArrCredit.GetNext(pos);
  603. CFont m_fntArial;
  604. CFont *pOldFont = NULL;
  605. CBitmap *pOldMemDC2Bitmap = NULL;
  606. CDC memDC2;
  607. memDC2.CreateCompatibleDC(pDC);
  608. //*********************************************************************
  609. // FONT SELECTION
  610. BOOL bSuccess = FALSE;
  611. BOOL bIsBitmap = FALSE;
  612. BOOL bUnderline;
  613. BOOL bItalic;
  614. int rmcode = 0;
  615.         CBitmap bitmap;
  616. if (!m_szWork.IsEmpty()) {
  617. char c = m_szWork[m_szWork.GetLength()-1];
  618. if(c == m_Escapes[TOP_LEVEL_GROUP]) {
  619. rmcode = 1;
  620. bItalic = FALSE;
  621. bUnderline = FALSE;
  622. m_nCurrentFontHeight = m_TextHeights[TOP_LEVEL_GROUP_HEIGHT];
  623.     bSuccess = m_fntArial.CreateFont(m_TextHeights[TOP_LEVEL_GROUP_HEIGHT], 0, 0, 0, 
  624.     FW_BOLD, bItalic, bUnderline, 0, 
  625.     ANSI_CHARSET,
  626.                     OUT_DEFAULT_PRECIS,
  627.                     CLIP_DEFAULT_PRECIS,
  628.                     PROOF_QUALITY,
  629.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  630.                     (LPSTR)"Arial");
  631. memDC.SetTextColor(m_Colors[TOP_LEVEL_GROUP_COLOR]);
  632. pOldFont = memDC.SelectObject(&m_fntArial);
  633. }
  634. else if(c == m_Escapes[GROUP_TITLE]) {
  635. rmcode = 1;
  636. bItalic = FALSE;
  637. bUnderline = FALSE;
  638. m_nCurrentFontHeight = m_TextHeights[GROUP_TITLE_HEIGHT];
  639.     bSuccess = m_fntArial.CreateFont(m_TextHeights[GROUP_TITLE_HEIGHT], 0, 0, 0, 
  640.     FW_BOLD, bItalic, bUnderline, 0, 
  641.     ANSI_CHARSET,
  642.                     OUT_DEFAULT_PRECIS,
  643.                     CLIP_DEFAULT_PRECIS,
  644.                     PROOF_QUALITY,
  645.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  646.                     (LPSTR)"Arial");
  647. memDC.SetTextColor(m_Colors[GROUP_TITLE_COLOR]);
  648. pOldFont = memDC.SelectObject(&m_fntArial);
  649. }
  650. else if(c == m_Escapes[TOP_LEVEL_TITLE]) {
  651. rmcode = 1;
  652. bItalic = FALSE;
  653. // bUnderline = TRUE;
  654. bUnderline = FALSE;
  655. m_nCurrentFontHeight = m_TextHeights[TOP_LEVEL_TITLE_HEIGHT];
  656. bSuccess = m_fntArial.CreateFont(m_TextHeights[TOP_LEVEL_TITLE_HEIGHT], 0, 0, 0, 
  657. FW_BOLD, bItalic, bUnderline, 0, 
  658. ANSI_CHARSET,
  659.                 OUT_DEFAULT_PRECIS,
  660.                 CLIP_DEFAULT_PRECIS,
  661.                 PROOF_QUALITY,
  662.                 VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  663.                 (LPSTR)"Arial");
  664. memDC.SetTextColor(m_Colors[TOP_LEVEL_TITLE_COLOR]);
  665. pOldFont = memDC.SelectObject(&m_fntArial);
  666. }
  667. else if(c == m_Escapes[DISPLAY_BITMAP]) {
  668. CString szBitmap = m_szWork.Left(m_szWork.GetLength()-1);
  669. if(bitmap.LoadBitmap((const char *)szBitmap)) {
  670. BITMAP  m_bmpInfo;
  671.     bitmap.GetObject(sizeof(BITMAP), &m_bmpInfo);
  672. m_size.cx = m_bmpInfo.bmWidth; // width  of dest rect
  673. m_size.cy = m_bmpInfo.bmHeight;
  674. // upper left point of dest
  675. m_pt.x = (m_ScrollRect.right - 
  676. ((m_ScrollRect.Width())/2) - (m_size.cx/2));
  677. m_pt.y = height;
  678. pOldMemDC2Bitmap = memDC2.SelectObject(&bitmap);
  679. bIsBitmap = TRUE;
  680. }
  681. else
  682. c = ' ';
  683. }
  684. else {
  685. bItalic = FALSE;
  686. bUnderline = FALSE;
  687. m_nCurrentFontHeight = m_TextHeights[NORMAL_TEXT_HEIGHT];
  688.     bSuccess = m_fntArial.CreateFont(m_TextHeights[NORMAL_TEXT_HEIGHT], 0, 0, 0, 
  689.     FW_THIN, bItalic, bUnderline, 0, 
  690.     ANSI_CHARSET,
  691.                     OUT_DEFAULT_PRECIS,
  692.                     CLIP_DEFAULT_PRECIS,
  693.                     PROOF_QUALITY,
  694.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,
  695.                     (LPSTR)"Arial");
  696. memDC.SetTextColor(m_Colors[NORMAL_TEXT_COLOR]);
  697. pOldFont = memDC.SelectObject(&m_fntArial);
  698. }
  699. }
  700. memDC.SetBkMode(TRANSPARENT);
  701. if (!bIsBitmap)
  702. {
  703. CRect r(m_ScrollRect);
  704. r.top = height;
  705. CSize size;
  706. if(m_szWork.GetLength()-rmcode != 0) 
  707. {
  708. int x = memDC.DrawText((const char *)m_szWork,m_szWork.GetLength()-rmcode,&r,DT_TOP|DT_CENTER|
  709. DT_NOPREFIX | DT_SINGLELINE);
  710. size = memDC.GetTextExtent((LPCTSTR)m_szWork,m_szWork.GetLength()-rmcode);
  711. }
  712. else
  713. size = memDC.GetTextExtent((LPCTSTR)"W",1);
  714. height += size.cy;
  715. }
  716. else
  717. {
  718. CRect r( m_pt.x, m_pt.y, m_pt.x + m_size.cx, m_pt.y + m_size.cy);
  719. DrawBitmap(&memDC, &memDC2, &r);
  720. //     memDC.BitBlt( m_pt.x, m_pt.y, m_size.cx, m_size.cy, &memDC2, 0, 0, SRCCOPY );
  721. height += m_size.cy;
  722. }
  723. if (pOldMemDC2Bitmap != NULL) memDC2.SelectObject(pOldMemDC2Bitmap);
  724. if (pOldFont != NULL) memDC.SelectObject(pOldFont);
  725. }
  726. memDC.SelectObject(pOldMemDCBitmap);
  727. }
  728. void CCreditStatic::OnDestroy() 
  729. {
  730. CStatic::OnDestroy();
  731. m_ArrCredit.RemoveAll();
  732. if(TimerOn)
  733. ASSERT(KillTimer(DISPLAY_TIMER_ID));
  734. }
  735. BOOL CCreditStatic::SetBkImage(UINT nIDResource)
  736. {
  737.     return SetBkImage( (LPCTSTR)nIDResource );
  738. }
  739. BOOL CCreditStatic::SetBkImage(LPCTSTR lpszResourceName)
  740. {
  741.     // If this is not the first call then Delete GDI objects
  742.     if( m_bitmap.m_hObject != NULL )
  743. m_bitmap.DeleteObject();
  744.     if( m_pal.m_hObject != NULL )
  745. m_pal.DeleteObject();
  746.     
  747.     
  748.     HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(), 
  749.             lpszResourceName, IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION );
  750.      if( hBmp == NULL ) 
  751.         return FALSE;
  752. m_bitmap.Attach( hBmp );
  753.     BITMAP bm;
  754.     m_bitmap.GetBitmap( &bm );
  755.     m_cxBitmap = bm.bmWidth;
  756.     m_cyBitmap = bm.bmHeight;
  757.     // Create a logical palette for the bitmap
  758.     DIBSECTION ds;
  759.     BITMAPINFOHEADER &bmInfo = ds.dsBmih;
  760.     m_bitmap.GetObject( sizeof(ds), &ds );
  761.     int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount;
  762.     // Create a halftone palette if colors > 256. 
  763.     CClientDC dc(NULL);             // Desktop DC
  764.     if( nColors > 256 )
  765.         m_pal.CreateHalftonePalette( &dc );
  766.     else
  767.     {
  768.         // Create the palette
  769.         RGBQUAD *pRGB = new RGBQUAD[nColors];
  770.         CDC memDC;
  771.         memDC.CreateCompatibleDC(&dc);
  772.         CBitmap* pOldMemDCBitmap = memDC.SelectObject( &m_bitmap );
  773.         ::GetDIBColorTable( memDC, 0, nColors, pRGB );
  774.         UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
  775.         LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
  776.         pLP->palVersion = 0x300;
  777.         pLP->palNumEntries = nColors;
  778.         for( int i=0; i < nColors; i++)
  779.         {
  780.             pLP->palPalEntry[i].peRed = pRGB[i].rgbRed;
  781.             pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
  782.             pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
  783.             pLP->palPalEntry[i].peFlags = 0;
  784.         }
  785.         m_pal.CreatePalette( pLP );
  786. memDC.SelectObject(pOldMemDCBitmap);
  787.         delete[] pLP;
  788.         delete[] pRGB;
  789.     }
  790. //    Invalidate();
  791.     return TRUE;
  792. }