CREDITSTATIC.CPP
上传用户:shgx688
上传日期:2009-12-27
资源大小:855k
文件大小:24k
源码类别:

SNMP编程

开发平台:

MultiPlatform

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