MFC操作——滚动字幕(带资源)

转载自:http://blog.csdn.net/cddchina/article/details/8080183

1,  将CreditStatic.h CreditStatic.cpp文件添加到工程目录下,并加到程序中

2,  在相应的对话框中添加变量:CCreditStatic   m_static;

3,  在相应的对话框中添加静态文本,并修改其ID为:IDC_DISPLAY_STATIC

4,  在相应的对话框的OnInitDialog函数中添加代码如下:

 

 

 m_static.SubclassDlgItem(IDC_DISPLAY_STATIC,this);

      m_static.SetBkImage(IDB_BITMAP1);

      m_static.SetCredits(pArrCredit,'|');

      m_static.SetSpeed(1);

      m_static.SetColor(BACKGROUND_COLOR, RGB(0,0,0));

      m_static.SetTransparent();

          m_static.StartScrolling();

 

 

其中::pArrCreditchar*类型,里边放要显示的字幕,在相应对话框的CDlg中声明并初始化,如::

    char *pArrCredit = { "¸感谢你||购买本书||"

        "本书会让你受益匪浅||本书作者||"

        "BITMAP1^|||"     

        };

[plain]  view plain  copy
 print ?
  1. 1.CreditStatic.cpp 的代码:  
  2.   
  3. // CreditStatic.cpp : implementation file  
  4. //  
  5.   
  6. #include "stdafx.h"  
  7. #include "CreditStatic.h"  
  8.   
  9. #ifdef _DEBUG  
  10. #define new DEBUG_NEW  
  11. #undef THIS_FILE  
  12. static char THIS_FILE[] = __FILE__;  
  13. #endif  
  14.   
  15. #define  DISPLAY_TIMER_ID       150     // timer id  
  16. /  
  17. // CCreditStatic  
  18.   
  19. CCreditStatic::CCreditStatic()  
  20. {  
  21.   
  22.     m_Colors[0] = RGB(0,0,0);       // Black  
  23.     m_Colors[1] = RGB(255,0,0);     // Red  
  24.     m_Colors[2] = RGB(255,255,0);   // Yellow  
  25.     m_Colors[3] = RGB(0,255,255);   // Turquoise  
  26.     m_Colors[4] = RGB(255,255,255); // White  
  27.   
  28.     m_TextHeights[0] = 21;  
  29.     m_TextHeights[1] = 19;  
  30.     m_TextHeights[2] = 17;  
  31.     m_TextHeights[3] = 15;  
  32.     m_nCurrentFontHeight = m_TextHeights[NORMAL_TEXT_HEIGHT];  
  33.   
  34.   
  35.     m_Escapes[0] = '\t';  
  36.     m_Escapes[1] = '\n';  
  37.     m_Escapes[2] = '\r';  
  38.     m_Escapes[3] = '^';  
  39.   
  40.     m_DisplaySpeed[0] = 70;  
  41.     m_DisplaySpeed[1] = 40;  
  42.     m_DisplaySpeed[2] = 10;  
  43.   
  44.     m_CurrentSpeed = 1;  
  45.     m_ScrollAmount = -1;  
  46.     m_bProcessingBitmap = FALSE;  
  47.   
  48.     m_ArrIndex = NULL;  
  49.     m_nCounter = 1;  
  50.     m_nClip = 0;  
  51.   
  52.     m_bFirstTime = TRUE;  
  53.     m_bDrawText = FALSE;  
  54.     m_bFirstTurn = TRUE;  
  55.     m_Gradient = GRADIENT_NONE;  
  56.     m_bTransparent = FALSE;  
  57.     n_MaxWidth = 0;  
  58.     TimerOn = 0;  
  59. }  
  60.   
  61. CCreditStatic::~CCreditStatic()  
  62. {  
  63. }  
  64.   
  65.   
  66. BEGIN_MESSAGE_MAP(CCreditStatic, CStatic)  
  67.     //{{AFX_MSG_MAP(CCreditStatic)  
  68.     ON_WM_PAINT()  
  69.     ON_WM_ERASEBKGND()  
  70.     ON_WM_TIMER()  
  71.     ON_WM_DESTROY()  
  72.     //}}AFX_MSG_MAP  
  73. END_MESSAGE_MAP()  
  74.   
  75. /  
  76. // CCreditStatic message handlers  
  77.   
  78. BOOL CCreditStatic::StartScrolling()  
  79. {  
  80.     //滚动字符为空,返回  
  81.     if(m_ArrCredit.IsEmpty())  
  82.         return FALSE;  
  83.       
  84.     if(m_BmpMain.m_hObject != NULL) {  
  85.         m_BmpMain.DeleteObject();  
  86.         m_BmpMain.m_hObject = NULL;  
  87.     }  
  88.     //设置定时间隔  
  89.     TimerOn = SetTimer(DISPLAY_TIMER_ID,m_DisplaySpeed[m_CurrentSpeed],NULL);  
  90.     ASSERT(TimerOn != 0);  
  91.     m_ArrIndex = m_ArrCredit.GetHeadPosition();  
  92.     m_nCounter = 1;  
  93.     m_nClip = 0;  
  94.     m_bFirstTime = TRUE;  
  95.     m_bDrawText = FALSE;  
  96.     return TRUE;  
  97. }  
  98.   
  99. //结束滚动  
  100. void CCreditStatic::EndScrolling()  
  101. {  
  102.     //结束定时  
  103.     KillTimer(DISPLAY_TIMER_ID);  
  104.     TimerOn = 0;  
  105.     if(m_BmpMain.m_hObject != NULL) {  
  106.         m_BmpMain.DeleteObject();  
  107.         m_BmpMain.m_hObject = NULL;  
  108.     }  
  109. }  
  110. //得到分开的字符串,用来滚动显示  
  111. void CCreditStatic::SetCredits(LPCTSTR credits,char delimiter)  
  112. {  
  113.     char *str,*ptr1,*ptr2;    
  114.     ASSERT(credits);  
  115.     if((str = strdup(credits)) == NULL)  
  116.         return;  
  117.     m_ArrCredit.RemoveAll();  
  118.     ptr1 = str;  
  119.     //得到分开的字符串,其中'/'表示行与行之间的间隔  
  120.     while((ptr2 = strchr(ptr1,delimiter)) != NULL) {  
  121.         *ptr2 = '\0';  
  122.         m_ArrCredit.AddTail(ptr1);  
  123.         ptr1 = ptr2+1;  
  124.     }  
  125.     m_ArrCredit.AddTail(ptr1);  
  126.     free(str);  
  127.     m_ArrIndex = m_ArrCredit.GetHeadPosition();  
  128.     m_nCounter = 1;  
  129.     m_nClip = 0;  
  130.     m_bFirstTime = TRUE;  
  131.     m_bDrawText = FALSE;  
  132. }  
  133.   
  134. void CCreditStatic::SetCredits(UINT nID,char delimiter)  
  135. {  
  136.     CString credits;  
  137.     if(!credits.LoadString(nID))  
  138.         return;  
  139.   
  140.     SetCredits((LPCTSTR)credits, delimiter);  
  141. }  
  142.   
  143. //设置滚动速度  
  144. void CCreditStatic::SetSpeed(UINT index, int speed)  
  145. {  
  146.     ASSERT(index <= DISPLAY_FAST);  
  147.   
  148.     if(speed)  
  149.         m_DisplaySpeed[index] = speed;  
  150.   
  151.     m_CurrentSpeed = index;  
  152. }  
  153.   
  154. //设置颜色,包括前景和背景  
  155. void CCreditStatic::SetColor(UINT index, COLORREF col)  
  156. {  
  157.     ASSERT(index <= NORMAL_TEXT_COLOR);  
  158.   
  159.     m_Colors[index] = col;  
  160. }  
  161.   
  162. //设置字符高度  
  163. void CCreditStatic::SetTextHeight(UINT index, int height)  
  164. {  
  165.     ASSERT(index <= NORMAL_TEXT_HEIGHT);  
  166.   
  167.     m_TextHeights[index] = height;  
  168. }  
  169.   
  170. void CCreditStatic::SetEscape(UINT index, char escape)  
  171. {  
  172.     ASSERT(index <= DISPLAY_BITMAP);  
  173.   
  174.     m_Escapes[index] = escape;  
  175. }  
  176.   
  177. void CCreditStatic::SetGradient(UINT value)  
  178. {  
  179.     ASSERT(value <= GRADIENT_LEFT_LIGHT);  
  180.   
  181.     m_Gradient = value;  
  182. }  
  183.   
  184. //设置是否透明  
  185. void CCreditStatic::SetTransparent(BOOL bTransparent)  
  186. {  
  187.     m_bTransparent = bTransparent;  
  188. }  
  189.   
  190. void CCreditStatic::OnPaint()   
  191. {  
  192.     CPaintDC dc(this); // device context for painting  
  193.       
  194.     if(TimerOn) return;  
  195.   
  196.     CDC memDC;  
  197.     memDC.CreateCompatibleDC(&dc);  
  198.   
  199.     CBitmap *pOldMemDCBitmap = NULL;  
  200.     CRect m_ScrollRect;  
  201.     GetClientRect(&m_ScrollRect);  
  202.   
  203.     if(m_BmpMain.m_hObject == NULL) {  
  204.   
  205.         CDC memDC2;  
  206.         CBitmap bitmap;  
  207.         memDC2.CreateCompatibleDC(&dc);  
  208.         bitmap.CreateCompatibleBitmap( &dc, m_ScrollRect.Width(), m_ScrollRect.Height() );  
  209.         CBitmap *pOldMemDC2Bitmap = (CBitmap*)memDC2.SelectObject(&bitmap);  
  210.           
  211.         DrawCredit(&memDC2, m_ScrollRect);  
  212.         AddBackGround(&memDC2, m_ScrollRect, m_ScrollRect);  
  213.   
  214.         pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);  
  215.         memDC.BitBlt( 0, 0, m_ScrollRect.Width(), m_ScrollRect.Height(),   
  216.                                         &memDC2, 0, 0, SRCCOPY );  
  217.         memDC2.SelectObject(pOldMemDC2Bitmap);  
  218.     }  
  219.     else  
  220.         pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);  
  221.          
  222.     dc.BitBlt( 0, 0, m_ScrollRect.Width(), m_ScrollRect.Height(),   
  223.                &memDC, 0, 0, SRCCOPY );  
  224. }  
  225.   
  226. BOOL CCreditStatic::OnEraseBkgnd(CDC* pDC)   
  227. {  
  228.     return TRUE;  
  229.       
  230. //  return CStatic::OnEraseBkgnd(pDC);  
  231. }  
  232.   
  233. //************************************************************************  
  234. //   OnTimer  
  235. //  
  236. //      On each of the display timers, scroll the window 1 unit. Each 20  
  237. //      units, fetch the next array element and load into work string. Call  
  238. //      Invalidate and UpdateWindow to invoke the OnPaint which will paint   
  239. //      the contents of the newly updated work string.  
  240. //************************************************************************  
  241. void CCreditStatic::OnTimer(UINT nIDEvent)   
  242. {  
  243.     //非设置的定时器ID,返回  
  244.     if (nIDEvent != DISPLAY_TIMER_ID)  
  245.     {  
  246.         CStatic::OnTimer(nIDEvent);  
  247.         return;  
  248.     }  
  249.     BOOL bCheck = FALSE;  
  250.     //如果上次读入的字符串表示的不是位图名字  
  251.     if (!m_bProcessingBitmap) {  
  252.         //根据m_nCurrentFontHeight高度决定需要多少次time响应才换一行字符显示  
  253.         if (m_nCounter++ % m_nCurrentFontHeight == 0)      
  254.         {  
  255.             m_nCounter=1;  
  256.             //读出字符串队列中下一行要显示的字符串  
  257.             m_szWork = m_ArrCredit.GetNext(m_ArrIndex);  
  258.             if(m_bFirstTurn)  
  259.                 bCheck = TRUE;  
  260.             if(m_ArrIndex == NULL) {  
  261.                 m_bFirstTurn = FALSE;  
  262.                 m_ArrIndex = m_ArrCredit.GetHeadPosition();  
  263.             }  
  264.             m_nClip = 0;  
  265.             m_bDrawText=TRUE;  
  266.         }  
  267.     }     
  268.     CClientDC dc(this);  
  269.     CRect m_ScrollRect;  
  270.     GetClientRect(&m_ScrollRect);//得到整个CStatic的客户区坐标  
  271.     CRect m_ClientRect(m_ScrollRect); //用来表示滚动字符的范围  
  272.     m_ClientRect.left = (m_ClientRect.Width()-n_MaxWidth)/2;  
  273.     m_ClientRect.right = m_ClientRect.left + n_MaxWidth;  
  274.     MoveCredit(&dc, m_ScrollRect, m_ClientRect, bCheck);//实现字幕滚动1单元  
  275.     AddBackGround(&dc, m_ScrollRect, m_ClientRect);//添加背景  
  276.     CStatic::OnTimer(nIDEvent);  
  277. }  
  278.   
  279. //设置背景  
  280. void CCreditStatic::AddBackGround(CDC* pDC, CRect& m_ScrollRect, CRect& m_ClientRect)  
  281. {  
  282.     CDC memDC;  
  283.     memDC.CreateCompatibleDC( pDC );  
  284.   
  285.     if( m_bitmap.m_hObject == NULL )  
  286.     {  
  287.         CBitmap* pOldBitmap = memDC.SelectObject( &m_BmpMain );  
  288.         pDC->BitBlt( 0, 0, m_ScrollRect.Width(), m_ScrollRect.Height(),   
  289.                                         &memDC, 0, 0, SRCCOPY );  
  290.         memDC.SelectObject(pOldBitmap);  
  291.         return;  
  292.     }  
  293.   
  294.    // Draw bitmap in the background if one has been set  
  295.                 // Now create a mask  
  296.     CBitmap bitmap;  
  297.     bitmap.CreateCompatibleBitmap( pDC, m_ClientRect.Width(), m_ClientRect.Height() );  
  298.     CBitmap* pOldMemDCBitmap = memDC.SelectObject( &bitmap );  
  299.           
  300.     CDC tempDC;  
  301.     tempDC.CreateCompatibleDC(pDC);  
  302.     CBitmap* pOldTempDCBitmap = tempDC.SelectObject( &m_BmpMain );  
  303.   
  304.     memDC.BitBlt( 0, 0, m_ClientRect.Width(), m_ClientRect.Height(), &tempDC,   
  305.                       m_ClientRect.left, m_ClientRect.top, SRCCOPY );  
  306.     CDC maskDC;  
  307.     maskDC.CreateCompatibleDC(pDC);  
  308.     CBitmap maskBitmap;  
  309.   
  310.     // Create monochrome bitmap for the mask  
  311.     maskBitmap.CreateBitmap( m_ClientRect.Width(), m_ClientRect.Height(), 1, 1, NULL );  
  312.     CBitmap* pOldMaskDCBitmap = maskDC.SelectObject( &maskBitmap );  
  313.     memDC.SetBkColor(m_bTransparent? RGB(192,192,192): m_Colors[BACKGROUND_COLOR]);  
  314.   
  315.     // Create the mask from the memory DC  
  316.     maskDC.BitBlt( 0, 0, m_ClientRect.Width(), m_ClientRect.Height(), &memDC, 0, 0, SRCCOPY );  
  317.   
  318.     tempDC.SelectObject(pOldTempDCBitmap);  
  319.     pOldTempDCBitmap = tempDC.SelectObject( &m_bitmap );  
  320.   
  321.     CDC imageDC;  
  322.     CBitmap bmpImage;  
  323.     imageDC.CreateCompatibleDC( pDC );  
  324.     bmpImage.CreateCompatibleBitmap( pDC, m_ScrollRect.Width(), m_ScrollRect.Height() );  
  325.     CBitmap* pOldImageDCBitmap = imageDC.SelectObject( &bmpImage );  
  326.   
  327.     if( pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE && m_pal.m_hObject != NULL )  
  328.     {  
  329.         pDC->SelectPalette( &m_pal, FALSE );  
  330.         pDC->RealizePalette();  
  331.   
  332.         imageDC.SelectPalette( &m_pal, FALSE );  
  333.     }  
  334.     // Get x and y offset  
  335.     // Draw bitmap in tiled manner to imageDC  
  336.     for( int i = 0; i < m_ScrollRect.right; i += m_cxBitmap )  
  337.         for( int j = 0; j < m_ScrollRect.bottom; j += m_cyBitmap )  
  338.             imageDC.BitBlt( i, j, m_cxBitmap, m_cyBitmap, &tempDC, 0, 0, SRCCOPY );  
  339.   
  340.     // Set the background in memDC to black. Using SRCPAINT with black and any other  
  341.     // color results in the other color, thus making black the transparent color  
  342.     memDC.SetBkColor(RGB(0,0,0));  
  343.     memDC.SetTextColor(RGB(255,255,255));  
  344.     memDC.BitBlt(0, 0, m_ClientRect.Width(), m_ClientRect.Height(), &maskDC, 0, 0, SRCAND);  
  345.   
  346.     // Set the foreground to black. See comment above.  
  347.     imageDC.SetBkColor(RGB(255,255,255));  
  348.     imageDC.SetTextColor(RGB(0,0,0));  
  349.     imageDC.BitBlt(m_ClientRect.left, m_ClientRect.top, m_ClientRect.Width(), m_ClientRect.Height(),   
  350.                     &maskDC, 0, 0, SRCAND);  
  351.   
  352.     // Combine the foreground with the background  
  353.     imageDC.BitBlt(m_ClientRect.left, m_ClientRect.top, m_ClientRect.Width(), m_ClientRect.Height(),   
  354.                     &memDC, 0, 0,SRCPAINT);  
  355.   
  356.     // Draw the final image to the screen     
  357.     pDC->BitBlt( 0, 0, m_ScrollRect.Width(), m_ScrollRect.Height(),   
  358.                     &imageDC, 0, 0, SRCCOPY );  
  359.   
  360.     imageDC.SelectObject(pOldImageDCBitmap);  
  361.     maskDC.SelectObject(pOldMaskDCBitmap);  
  362.     tempDC.SelectObject(pOldTempDCBitmap);  
  363.     memDC.SelectObject(pOldMemDCBitmap);  
  364. }  
  365.   
  366. void CCreditStatic::DrawBitmap(CDC* pDC, CDC* pDC2, CRect *rBitmap)  
  367. {  
  368.     if(!m_bTransparent || m_bitmap.m_hObject != NULL) {  
  369.         pDC->BitBlt( rBitmap->left, rBitmap->top, rBitmap->Width(), rBitmap->Height(),   
  370.                     pDC2, 0, 0, SRCCOPY );  
  371.         return;  
  372.     }  
  373.     //创建与pDC兼容的设备  
  374.     CDC memDC;  
  375.     memDC.CreateCompatibleDC( pDC );  
  376.     // 创建兼容位图并且选进设备  
  377.     CBitmap bitmap;  
  378.     bitmap.CreateCompatibleBitmap( pDC, rBitmap->Width(), rBitmap->Height() );  
  379.     CBitmap* pOldMemDCBitmap = memDC.SelectObject( &bitmap );  
  380.     //将pDC2中的位图拷贝到memDC  
  381.     memDC.BitBlt( 0, 0, rBitmap->Width(), rBitmap->Height(), pDC2, 0, 0, SRCCOPY );  
  382.   
  383.     CDC maskDC;  
  384.     maskDC.CreateCompatibleDC(pDC);  
  385.   
  386.     // 创建单色位图并且选入设备  
  387.     CBitmap maskBitmap;  
  388.     maskBitmap.CreateBitmap( rBitmap->Width(), rBitmap->Height(), 1, 1, NULL );  
  389.     CBitmap* pOldMaskDCBitmap = maskDC.SelectObject( &maskBitmap );  
  390.     memDC.SetBkColor(RGB(192,192,192));//背景为系统色  
  391.   
  392.     // 将memDC中的位图拷贝到maskDC,maskDC中的的1表示位图背景色,0表示前景,即位图  
  393.     maskDC.BitBlt( 0, 0, rBitmap->Width(), rBitmap->Height(), &memDC, 0, 0, SRCCOPY );  
  394.   
  395.   
  396.     CDC imageDC;  
  397.     CBitmap bmpImage;  
  398.     imageDC.CreateCompatibleDC( pDC );  
  399.     bmpImage.CreateCompatibleBitmap( pDC, rBitmap->Width(), rBitmap->Height() );  
  400.     CBitmap* pOldImageDCBitmap = imageDC.SelectObject( &bmpImage );  
  401.   
  402.     //将pDC中对应位图背景区域拷贝到imageDC  
  403.     imageDC.BitBlt(0, 0, rBitmap->Width(), rBitmap->Height(), pDC, rBitmap->left, rBitmap->top, SRCCOPY);  
  404.   
  405.     //下面的代码实现透明位图,见msdn的"Drawing Transparent Bitmaps"  
  406.     // Set the background in memDC to black. Using SRCPAINT with black and any other  
  407.     // color results in the other color, thus making black the transparent color  
  408.     //设置背景为黑色  
  409.     memDC.SetBkColor(RGB(0,0,0));  
  410.     memDC.SetTextColor(RGB(255,255,255));  
  411.     memDC.BitBlt(0, 0, rBitmap->Width(), rBitmap->Height(), &maskDC, 0, 0, SRCAND);  
  412.     // 设置前景为黑色  
  413.     imageDC.SetBkColor(RGB(255,255,255));  
  414.     imageDC.SetTextColor(RGB(0,0,0));  
  415.     imageDC.BitBlt(0, 0, rBitmap->Width(), rBitmap->Height(), &maskDC, 0, 0, SRCAND);  
  416.     //得到透明的位图   
  417.     imageDC.BitBlt(0, 0, rBitmap->Width(), rBitmap->Height(), &memDC, 0, 0,SRCPAINT);  
  418.     // 将位图移动到合适位置  
  419.     pDC->BitBlt( rBitmap->left, rBitmap->top, rBitmap->Width(), rBitmap->Height(),   
  420.                     &imageDC, 0, 0, SRCCOPY );  
  421.     imageDC.SelectObject(pOldImageDCBitmap);  
  422.     maskDC.SelectObject(pOldMaskDCBitmap);  
  423.     memDC.SelectObject(pOldMemDCBitmap);  
  424. }  
  425.   
  426. void CCreditStatic::FillGradient(CDC *pDC, CRect *m_ScrollRect, CRect *m_FillRect, COLORREF color)  
  427. {   
  428.     float fStep,fRStep,fGStep,fBStep;       // How large is each band?  
  429.     int iOnBand;  // Loop index  
  430.   
  431.     WORD R = GetRValue(color);  
  432.     WORD G = GetGValue(color);  
  433.     WORD B = GetBValue(color);  
  434.   
  435.     // Determine how large each band should be in order to cover the  
  436.     // client with 256 bands (one for every color intensity level)  
  437.     if(m_Gradient % 2) {  
  438.         fRStep = (float)R / 255.0f;  
  439.         fGStep = (float)G / 255.0f;  
  440.         fBStep = (float)B / 255.0f;  
  441.     } else {  
  442.         fRStep = (float)(255-R) / 255.0f;  
  443.         fGStep = (float)(255-G) / 255.0f;  
  444.         fBStep = (float)(255-B) / 255.0f;  
  445.     }  
  446.   
  447.     COLORREF OldCol = pDC->GetBkColor();  
  448.     // Start filling bands  
  449.     fStep = (float)m_ScrollRect->Width() / 256.0f;  
  450.     for(iOnBand = (256*m_FillRect->left)/m_ScrollRect->Width();   
  451.         (int)(iOnBand*fStep) < m_FillRect->right && iOnBand < 256; iOnBand++) {  
  452.         CRect r((int)(iOnBand * fStep), m_FillRect->top,  
  453.                 (int)((iOnBand+1) * fStep), m_FillRect->bottom+1);  
  454.         COLORREF col;  
  455.   
  456.         switch(m_Gradient) {  
  457.         case GRADIENT_RIGHT_DARK:  
  458.             col = RGB((int)(R-iOnBand*fRStep),(int)(G-iOnBand*fGStep),(int)(B-iOnBand*fBStep));  
  459.             break;  
  460.         case GRADIENT_RIGHT_LIGHT:  
  461.             col = RGB((int)(R+iOnBand*fRStep),(int)(G+iOnBand*fGStep),(int)(B+iOnBand*fBStep));  
  462.             break;  
  463.         case GRADIENT_LEFT_DARK:  
  464.             col = RGB((int)(iOnBand*fRStep),(int)(iOnBand*fGStep),(int)(iOnBand*fBStep));  
  465.             break;  
  466.         case GRADIENT_LEFT_LIGHT:  
  467.             col = RGB(255-(int)(iOnBand*fRStep),255-(int)(iOnBand*fGStep),255-(int)(iOnBand*fBStep));  
  468.             break;  
  469.         default:  
  470.             return;  
  471.         }  
  472.         pDC->FillSolidRect(&r, col);  
  473.     }  
  474.     pDC->SetBkColor(OldCol);  
  475. }   
  476.   
  477. #define SCROLLDC  
  478.   
  479. void CCreditStatic::MoveCredit(CDC* pDC, CRect& m_ScrollRect, CRect& m_ClientRect, BOOL bCheck)  
  480. {  
  481.     CDC memDC,memDC2;  
  482.     //创建兼容的设备  
  483.     memDC.CreateCompatibleDC(pDC);  
  484.     memDC2.CreateCompatibleDC(pDC);  
  485.     //决定背景颜色,如果初始设置为透明并且有背景位图,就选择系统色,否则选择设置的背景色  
  486.     COLORREF BackColor = (m_bTransparent && m_bitmap.m_hObject != NULL)? RGB(192,192,192) : m_Colors[BACKGROUND_COLOR];  
  487.     CBitmap *pOldMemDCBitmap = NULL;  
  488.     CBitmap *pOldMemDC2Bitmap = NULL;  
  489.   
  490. #ifdef SCROLLDC  
  491.     CRect r1;  
  492. #endif  
  493.     //初始句柄为空  
  494.     if(m_BmpMain.m_hObject == NULL) {  
  495.         //创建与设备兼容的位图  
  496.         m_BmpMain.CreateCompatibleBitmap( pDC, m_ScrollRect.Width(), m_ScrollRect.Height() );  
  497.         //将位图选入设备  
  498.         pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);  
  499.         //选择是用梯度还是背景色填充设备memDC的背景  
  500.         if(m_Gradient && m_bitmap.m_hObject == NULL)  
  501.             FillGradient(&memDC, &m_ScrollRect, &m_ScrollRect,m_Colors[BACKGROUND_COLOR]);  
  502.         else  
  503.             memDC.FillSolidRect(&m_ScrollRect,BackColor);  
  504.     } else   
  505.         pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);  
  506.   
  507.   
  508.     if(m_ClientRect.Width() > 0) {  
  509. #ifndef SCROLLDC //如果不支持设备滚动  
  510.         CBitmap bitmap;  
  511.         bitmap.CreateCompatibleBitmap( pDC, m_ClientRect.Width(), m_ClientRect.Height() );  
  512.         pOldMemDC2Bitmap = memDC2.SelectObject(&bitmap);  
  513.         //memDC向上滚动一行,利用设备拷贝  
  514.         memDC2.BitBlt( 0, 0, m_ClientRect.Width(), m_ClientRect.Height()-abs(m_ScrollAmount),   
  515.              &memDC, m_ClientRect.left, abs(m_ScrollAmount), SRCCOPY );  
  516.         memDC.BitBlt( m_ClientRect.left, 0, m_ClientRect.Width(), m_ClientRect.Height(),   
  517.              &memDC2, 0, 0, SRCCOPY );    
  518.         memDC2.SelectObject(pOldMemDC2Bitmap);  
  519.         pOldMemDC2Bitmap = NULL;  
  520. #else//如果支持设备滚动  
  521.         CRgn RgnUpdate;  
  522.         //memDC向上滚动一行,利用设备拷贝  
  523.         memDC.ScrollDC(0,m_ScrollAmount,(LPCRECT)m_ScrollRect,(LPCRECT)m_ClientRect,&RgnUpdate,  
  524.                         (LPRECT)r1);  
  525.     }  
  526.     else {  
  527.         //r1存储着要更新的区域位置  
  528.         r1 = m_ScrollRect;  
  529.         r1.top = r1.bottom-abs(m_ScrollAmount);  
  530. #endif  
  531.     }  
  532.   
  533.     m_nClip = m_nClip + abs(m_ScrollAmount);      
  534.       
  535.   
  536.     //*********************************************************************  
  537.     //  FONT SELECTION  
  538.     CFont m_fntArial;  
  539.     CFont* pOldFont = NULL;  
  540.     BOOL bSuccess = FALSE;  
  541.       
  542.     BOOL bUnderline;  
  543.     BOOL bItalic;  
  544.     int rmcode = 0;  
  545.     //根据字符串性质决定操作  
  546.     //更新的显示字符串不为空  
  547.     if (!m_szWork.IsEmpty()) {  
  548.         //根据字符串最后一位决定类型  
  549.         char c = m_szWork[m_szWork.GetLength()-1];  
  550.         if(c == m_Escapes[TOP_LEVEL_GROUP]) //类型为最大群组标题  
  551.         {  
  552.             rmcode = 1;  
  553.             bItalic = FALSE;  
  554.             bUnderline = FALSE;  
  555.             m_nCurrentFontHeight = m_TextHeights[TOP_LEVEL_GROUP_HEIGHT];  
  556.             //创建字体  
  557.             bSuccess = m_fntArial.CreateFont(m_TextHeights[TOP_LEVEL_GROUP_HEIGHT], 0, 0, 0,   
  558.                                 FW_BOLD, bItalic, bUnderline, 0,   
  559.                                 ANSI_CHARSET,  
  560.                     OUT_DEFAULT_PRECIS,  
  561.                     CLIP_DEFAULT_PRECIS,  
  562.                     PROOF_QUALITY,  
  563.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,  
  564.                     (LPSTR)"Arial");  
  565.             //设置字体颜色  
  566.             memDC.SetTextColor(m_Colors[TOP_LEVEL_GROUP_COLOR]);  
  567.             //选入设备  
  568.             if (pOldFont != NULL) memDC.SelectObject(pOldFont);  
  569.             pOldFont = memDC.SelectObject(&m_fntArial);  
  570.               
  571.         }  
  572.         else if(c == m_Escapes[GROUP_TITLE]) { //类型为组标题  
  573.             rmcode = 1;  
  574.             bItalic = FALSE;  
  575.             bUnderline = FALSE;  
  576.             m_nCurrentFontHeight = m_TextHeights[GROUP_TITLE_HEIGHT];  
  577.             bSuccess = m_fntArial.CreateFont(m_TextHeights[GROUP_TITLE_HEIGHT], 0, 0, 0,   
  578.                                 FW_BOLD, bItalic, bUnderline, 0,   
  579.                                 ANSI_CHARSET,  
  580.                     OUT_DEFAULT_PRECIS,  
  581.                     CLIP_DEFAULT_PRECIS,  
  582.                     PROOF_QUALITY,  
  583.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,  
  584.                     (LPSTR)"Arial");  
  585.             memDC.SetTextColor(m_Colors[GROUP_TITLE_COLOR]);  
  586.             if (pOldFont != NULL) memDC.SelectObject(pOldFont);  
  587.             pOldFont = memDC.SelectObject(&m_fntArial);  
  588.         }  
  589.         else if(c == m_Escapes[TOP_LEVEL_TITLE]) { //类型为最大标题  
  590.             rmcode = 1;  
  591.             bItalic = FALSE;  
  592. //          bUnderline = TRUE;  
  593.             bUnderline = FALSE;  
  594.             m_nCurrentFontHeight = m_TextHeights[TOP_LEVEL_TITLE_HEIGHT];  
  595.             bSuccess = m_fntArial.CreateFont(m_TextHeights[TOP_LEVEL_TITLE_HEIGHT], 0, 0, 0,   
  596.                                 FW_BOLD, bItalic, bUnderline, 0,   
  597.                                 ANSI_CHARSET,  
  598.                     OUT_DEFAULT_PRECIS,  
  599.                     CLIP_DEFAULT_PRECIS,  
  600.                     PROOF_QUALITY,  
  601.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,  
  602.                     (LPSTR)"Arial");  
  603.             memDC.SetTextColor(m_Colors[TOP_LEVEL_TITLE_COLOR]);  
  604.             if (pOldFont != NULL) memDC.SelectObject(pOldFont);  
  605.             pOldFont = memDC.SelectObject(&m_fntArial);  
  606.         }  
  607.         else if(c == m_Escapes[DISPLAY_BITMAP]) { //类型为位图  
  608.             if (!m_bProcessingBitmap)  
  609.             {  
  610.                 CString szBitmap = m_szWork.Left(m_szWork.GetLength()-1);//得到位图名字  
  611.                 if(m_bmpWork.LoadBitmap((const char *)szBitmap)) { //载入位图  
  612.                     BITMAP      m_bmpInfo;  
  613.                     m_bmpWork.GetObject(sizeof(BITMAP), &m_bmpInfo);          
  614.                     m_size.cx = m_bmpInfo.bmWidth;  // width  of dest rect  
  615.                     m_size.cy = m_bmpInfo.bmHeight;  
  616.                     //得到要显示位图的左上角坐标  
  617.                     m_pt.x = (m_ClientRect.right -   
  618.                             ((m_ClientRect.Width())/2) - (m_size.cx/2));  
  619.                     m_pt.y = m_ClientRect.bottom;  
  620.                   
  621.                     m_bProcessingBitmap = TRUE;  
  622.                     if (pOldMemDC2Bitmap != NULL) memDC2.SelectObject(pOldMemDC2Bitmap);  
  623.                     pOldMemDC2Bitmap = memDC2.SelectObject(&m_bmpWork);//位图选入设备memDC2  
  624.                 }  
  625.                 else  
  626.                     c = ' ';  
  627.             }  
  628.             else {  
  629.                 if (pOldMemDC2Bitmap != NULL) memDC2.SelectObject(pOldMemDC2Bitmap);  
  630.                 pOldMemDC2Bitmap = memDC2.SelectObject(&m_bmpWork);  
  631.             }  
  632.         }  
  633.         else {  
  634.             bItalic = FALSE;  
  635.             bUnderline = FALSE;  
  636.             m_nCurrentFontHeight = m_TextHeights[NORMAL_TEXT_HEIGHT];  
  637.             bSuccess = m_fntArial.CreateFont(m_TextHeights[NORMAL_TEXT_HEIGHT], 0, 0, 0,   
  638.                                 FW_THIN, bItalic, bUnderline, 0,   
  639.                                 ANSI_CHARSET,  
  640.                     OUT_DEFAULT_PRECIS,  
  641.                     CLIP_DEFAULT_PRECIS,  
  642.                     PROOF_QUALITY,  
  643.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,  
  644.                     (LPSTR)"Arial");  
  645.             memDC.SetTextColor(m_Colors[NORMAL_TEXT_COLOR]);  
  646.             if (pOldFont != NULL) memDC.SelectObject(pOldFont);  
  647.             pOldFont = memDC.SelectObject(&m_fntArial);  
  648.         }  
  649.     }  
  650.   
  651. #ifndef SCROLLDC  
  652.     CRect r1(m_ScrollRect);  
  653.     r1.top = r1.bottom-abs(m_ScrollAmount);  
  654. #endif  
  655.   
  656.     //填充背景  
  657.     if(m_Gradient && m_bitmap.m_hObject == NULL)  
  658.         FillGradient(&memDC, &m_ScrollRect, &r1, m_Colors[BACKGROUND_COLOR]);  
  659.     else  
  660.         memDC.FillSolidRect(&r1,BackColor);  
  661.     memDC.SetBkMode(TRANSPARENT);  
  662.   
  663.     if (!m_bProcessingBitmap) //如果不是位图  
  664.     {  
  665.         if(bCheck) { //对于单独一行字符的第一次滚动,需要先确定滚动区域范围  
  666.             CSize size = memDC.GetTextExtent((LPCTSTR)m_szWork,m_szWork.GetLength()-rmcode);  
  667.             if(size.cx > n_MaxWidth) {  
  668.                 n_MaxWidth = (size.cx > m_ScrollRect.Width())? m_ScrollRect.Width():size.cx;  
  669.                 m_ClientRect.left = (m_ScrollRect.Width()-n_MaxWidth)/2;  
  670.                 m_ClientRect.right = m_ClientRect.left + n_MaxWidth;  
  671.             }  
  672.                   
  673.         }  
  674.         CRect r(m_ClientRect);  
  675.         r.top = r.bottom-m_nClip;  
  676.         //在要更新的区域显示字符  
  677.         int x = memDC.DrawText((const char *)m_szWork,m_szWork.GetLength()-rmcode,&r,DT_TOP|DT_CENTER|  
  678.                     DT_NOPREFIX | DT_SINGLELINE);     
  679.         m_bDrawText=FALSE;  
  680.     }  
  681.     else  
  682.     {  
  683.         if(bCheck) {  
  684.             CSize size = memDC.GetTextExtent((LPCTSTR)m_szWork,m_szWork.GetLength()-rmcode);  
  685.             if(m_size.cx > n_MaxWidth) {  
  686.                 n_MaxWidth = (m_size.cx > m_ScrollRect.Width())? m_ScrollRect.Width():m_size.cx;  
  687.                 m_ClientRect.left = (m_ScrollRect.Width()-n_MaxWidth)/2;  
  688.                 m_ClientRect.right = m_ClientRect.left + n_MaxWidth;  
  689.             }  
  690.         }  
  691.         CRect r( m_pt.x, m_pt.y-m_nClip, m_pt.x+ m_size.cx, m_pt.y);  
  692.         //如果是位图,根据背景memDC和位图设备memDC2,在更新区域显示部分位图  
  693.         DrawBitmap(&memDC, &memDC2, &r);  
  694. //      memDC.BitBlt( m_pt.x, m_pt.y-m_nClip, m_size.cx, m_nClip,   
  695. //                  &memDC2, 0, 0, SRCCOPY );  
  696.         if (m_nClip >= m_size.cy)  
  697.         {  
  698.             m_bmpWork.DeleteObject();  
  699.             m_bProcessingBitmap = FALSE;  
  700.             m_nClip=0;  
  701.             m_szWork.Empty();  
  702.             m_nCounter=1;  
  703.         }  
  704.     }  
  705.     //恢复设备  
  706.     if (pOldMemDC2Bitmap != NULL) memDC2.SelectObject(pOldMemDC2Bitmap);  
  707.     if (pOldFont != NULL) memDC.SelectObject(pOldFont);  
  708.     memDC.SelectObject(pOldMemDCBitmap);  
  709. }  
  710.   
  711. void CCreditStatic::DrawCredit(CDC* pDC, CRect& m_ScrollRect)  
  712. {  
  713.     if(m_BmpMain.m_hObject != NULL) return;  
  714.   
  715.     CDC memDC,memDC2;  
  716.     memDC.CreateCompatibleDC(pDC);  
  717.     memDC2.CreateCompatibleDC(pDC);  
  718.     COLORREF BackColor = (m_bTransparent && m_bitmap.m_hObject != NULL)? RGB(192,192,192) : m_Colors[BACKGROUND_COLOR];  
  719.       
  720.     CBitmap *pOldMemDCBitmap = NULL;  
  721.   
  722.     m_BmpMain.CreateCompatibleBitmap( pDC, m_ScrollRect.Width(), m_ScrollRect.Height() );  
  723.     pOldMemDCBitmap = (CBitmap*)memDC.SelectObject(&m_BmpMain);  
  724.   
  725.     if(m_Gradient && m_bitmap.m_hObject == NULL)  
  726.         FillGradient(&memDC, &m_ScrollRect, &m_ScrollRect, m_Colors[BACKGROUND_COLOR]);  
  727.     else  
  728.         memDC.FillSolidRect(&m_ScrollRect, BackColor);  
  729.   
  730.     POSITION pos = m_ArrCredit.GetHeadPosition();  
  731.     int height = 0;  
  732.     while(pos != NULL && height <= m_ScrollRect.Height()) {  
  733.         CString m_szWork = m_ArrCredit.GetNext(pos);  
  734.         CFont   m_fntArial;  
  735.         CFont   *pOldFont = NULL;  
  736.         CBitmap *pOldMemDC2Bitmap = NULL;  
  737.           
  738.         CDC memDC2;  
  739.         memDC2.CreateCompatibleDC(pDC);  
  740.         //*********************************************************************  
  741.         //  FONT SELECTION  
  742.       
  743.       
  744.         BOOL bSuccess = FALSE;  
  745.         BOOL bIsBitmap = FALSE;  
  746.           
  747.         BOOL bUnderline;  
  748.         BOOL bItalic;  
  749.         int rmcode = 0;  
  750.         CBitmap bitmap;  
  751.   
  752.         if (!m_szWork.IsEmpty()) {  
  753.             char c = m_szWork[m_szWork.GetLength()-1];  
  754.             if(c == m_Escapes[TOP_LEVEL_GROUP]) {  
  755.                 rmcode = 1;  
  756.                 bItalic = FALSE;  
  757.                 bUnderline = FALSE;  
  758.                 m_nCurrentFontHeight = m_TextHeights[TOP_LEVEL_GROUP_HEIGHT];  
  759.                 bSuccess = m_fntArial.CreateFont(m_TextHeights[TOP_LEVEL_GROUP_HEIGHT], 0, 0, 0,   
  760.                                 FW_BOLD, bItalic, bUnderline, 0,   
  761.                                 ANSI_CHARSET,  
  762.                     OUT_DEFAULT_PRECIS,  
  763.                     CLIP_DEFAULT_PRECIS,  
  764.                     PROOF_QUALITY,  
  765.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,  
  766.                     (LPSTR)"Arial");  
  767.                 memDC.SetTextColor(m_Colors[TOP_LEVEL_GROUP_COLOR]);  
  768.                 pOldFont = memDC.SelectObject(&m_fntArial);  
  769.           
  770.             }  
  771.             else if(c == m_Escapes[GROUP_TITLE]) {  
  772.                 rmcode = 1;  
  773.                 bItalic = FALSE;  
  774.                 bUnderline = FALSE;  
  775.                 m_nCurrentFontHeight = m_TextHeights[GROUP_TITLE_HEIGHT];  
  776.                 bSuccess = m_fntArial.CreateFont(m_TextHeights[GROUP_TITLE_HEIGHT], 0, 0, 0,   
  777.                                 FW_BOLD, bItalic, bUnderline, 0,   
  778.                                 ANSI_CHARSET,  
  779.                     OUT_DEFAULT_PRECIS,  
  780.                     CLIP_DEFAULT_PRECIS,  
  781.                     PROOF_QUALITY,  
  782.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,  
  783.                     (LPSTR)"Arial");  
  784.                 memDC.SetTextColor(m_Colors[GROUP_TITLE_COLOR]);  
  785.                 pOldFont = memDC.SelectObject(&m_fntArial);  
  786.             }  
  787.             else if(c == m_Escapes[TOP_LEVEL_TITLE]) {  
  788.                 rmcode = 1;  
  789.                 bItalic = FALSE;  
  790.     //          bUnderline = TRUE;  
  791.                 bUnderline = FALSE;  
  792.                 m_nCurrentFontHeight = m_TextHeights[TOP_LEVEL_TITLE_HEIGHT];  
  793.                 bSuccess = m_fntArial.CreateFont(m_TextHeights[TOP_LEVEL_TITLE_HEIGHT], 0, 0, 0,   
  794.                                 FW_BOLD, bItalic, bUnderline, 0,   
  795.                                 ANSI_CHARSET,  
  796.                     OUT_DEFAULT_PRECIS,  
  797.                     CLIP_DEFAULT_PRECIS,  
  798.                     PROOF_QUALITY,  
  799.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,  
  800.                     (LPSTR)"Arial");  
  801.                 memDC.SetTextColor(m_Colors[TOP_LEVEL_TITLE_COLOR]);  
  802.                 pOldFont = memDC.SelectObject(&m_fntArial);  
  803.             }  
  804.             else if(c == m_Escapes[DISPLAY_BITMAP]) {  
  805.                 CString szBitmap = m_szWork.Left(m_szWork.GetLength()-1);  
  806.                 if(bitmap.LoadBitmap((const char *)szBitmap)) {  
  807.                     BITMAP      m_bmpInfo;  
  808.   
  809.                     bitmap.GetObject(sizeof(BITMAP), &m_bmpInfo);  
  810.               
  811.                     m_size.cx = m_bmpInfo.bmWidth;  // width  of dest rect  
  812.                     m_size.cy = m_bmpInfo.bmHeight;  
  813.                     // upper left point of dest  
  814.                     m_pt.x = (m_ScrollRect.right -   
  815.                         ((m_ScrollRect.Width())/2) - (m_size.cx/2));  
  816.                     m_pt.y = height;  
  817.                     pOldMemDC2Bitmap = memDC2.SelectObject(&bitmap);  
  818.                     bIsBitmap = TRUE;  
  819.                 }  
  820.                 else  
  821.                         c = ' ';  
  822.             }  
  823.             else {  
  824.                 bItalic = FALSE;  
  825.                 bUnderline = FALSE;  
  826.                 m_nCurrentFontHeight = m_TextHeights[NORMAL_TEXT_HEIGHT];  
  827.                 bSuccess = m_fntArial.CreateFont(m_TextHeights[NORMAL_TEXT_HEIGHT], 0, 0, 0,   
  828.                                 FW_THIN, bItalic, bUnderline, 0,   
  829.                                 ANSI_CHARSET,  
  830.                     OUT_DEFAULT_PRECIS,  
  831.                     CLIP_DEFAULT_PRECIS,  
  832.                     PROOF_QUALITY,  
  833.                     VARIABLE_PITCH | 0x04 | FF_DONTCARE,  
  834.                     (LPSTR)"Arial");  
  835.                 memDC.SetTextColor(m_Colors[NORMAL_TEXT_COLOR]);  
  836.                 pOldFont = memDC.SelectObject(&m_fntArial);  
  837.             }  
  838.         }  
  839.   
  840.         memDC.SetBkMode(TRANSPARENT);  
  841.   
  842.         if (!bIsBitmap)  
  843.         {                 
  844.             CRect r(m_ScrollRect);  
  845.             r.top = height;  
  846.             CSize size;  
  847.             if(m_szWork.GetLength()-rmcode != 0)   
  848.             {  
  849.                 int x = memDC.DrawText((const char *)m_szWork,m_szWork.GetLength()-rmcode,&r,DT_TOP|DT_CENTER|  
  850.                         DT_NOPREFIX | DT_SINGLELINE);     
  851.                 size = memDC.GetTextExtent((LPCTSTR)m_szWork,m_szWork.GetLength()-rmcode);  
  852.             }  
  853.             else  
  854.                 size = memDC.GetTextExtent((LPCTSTR)"W",1);  
  855.             height += size.cy;  
  856.         }  
  857.         else  
  858.         {  
  859.             CRect r( m_pt.x, m_pt.y, m_pt.x + m_size.cx, m_pt.y + m_size.cy);  
  860.             DrawBitmap(&memDC, &memDC2, &r);  
  861. //          memDC.BitBlt( m_pt.x, m_pt.y, m_size.cx, m_size.cy, &memDC2, 0, 0, SRCCOPY );  
  862.             height += m_size.cy;  
  863.         }  
  864.         if (pOldMemDC2Bitmap != NULL) memDC2.SelectObject(pOldMemDC2Bitmap);  
  865.         if (pOldFont != NULL) memDC.SelectObject(pOldFont);  
  866.     }  
  867.     memDC.SelectObject(pOldMemDCBitmap);  
  868. }  
  869.   
  870. void CCreditStatic::OnDestroy()   
  871. {  
  872.     CStatic::OnDestroy();  
  873.   
  874.     m_ArrCredit.RemoveAll();  
  875.   
  876.     if(TimerOn)  
  877.         ASSERT(KillTimer(DISPLAY_TIMER_ID));      
  878. }  
  879.   
  880. BOOL CCreditStatic::SetBkImage(UINT nIDResource)  
  881. {  
  882.     return SetBkImage( (LPCTSTR)nIDResource );  
  883. }  
  884.   
  885. //设置背景图片  
  886. BOOL CCreditStatic::SetBkImage(LPCTSTR lpszResourceName)  
  887. {  
  888.   
  889.     //删除以前的GDI对象  
  890.     if( m_bitmap.m_hObject != NULL )  
  891.         m_bitmap.DeleteObject();  
  892.     if( m_pal.m_hObject != NULL )  
  893.         m_pal.DeleteObject();    
  894.     //载入位图  
  895.     HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(),   
  896.             lpszResourceName, IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION );  
  897.      if( hBmp == NULL )   
  898.         return FALSE;  
  899.     m_bitmap.Attach( hBmp );  
  900.     BITMAP bm;  
  901.     m_bitmap.GetBitmap( &bm );  
  902.     m_cxBitmap = bm.bmWidth;  
  903.     m_cyBitmap = bm.bmHeight;  
  904.     // 为位图创建逻辑调色板  
  905.     DIBSECTION ds;  
  906.     BITMAPINFOHEADER &bmInfo = ds.dsBmih;  
  907.     m_bitmap.GetObject( sizeof(ds), &ds );  
  908.     int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount;  
  909.     // 如果颜色大于> 256色,创建Halftone调色板   
  910.     CClientDC dc(NULL);             // Desktop DC  
  911.     if( nColors > 256 )  
  912.         m_pal.CreateHalftonePalette( &dc );  
  913.     else  
  914.     {  
  915.         //否则,创建调色板  
  916.   
  917.         RGBQUAD *pRGB = new RGBQUAD[nColors];  
  918.         CDC memDC;  
  919.         memDC.CreateCompatibleDC(&dc);  
  920.   
  921.         CBitmap* pOldMemDCBitmap = memDC.SelectObject( &m_bitmap );  
  922.         ::GetDIBColorTable( memDC, 0, nColors, pRGB );  
  923.         UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);  
  924.         LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];  
  925.         pLP->palVersion = 0x300;  
  926.         pLP->palNumEntries = nColors;  
  927.         for( int i=0; i < nColors; i++)  
  928.         {  
  929.             pLP->palPalEntry[i].peRed = pRGB[i].rgbRed;  
  930.             pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen;  
  931.             pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue;  
  932.             pLP->palPalEntry[i].peFlags = 0;  
  933.         }  
  934.         m_pal.CreatePalette( pLP );  
  935.         memDC.SelectObject(pOldMemDCBitmap);  
  936.         delete[] pLP;  
  937.         delete[] pRGB;  
  938.     }  
  939.     return TRUE;  
  940. }  
  941.   
  942.   
  943. 2.CreditStatic.h  的头文件代码  
  944. #if !defined(AFX_CREDITSTATIC_H__4ABD7701_49F5_11D1_9E3C_00A0245800CF__INCLUDED_)  
  945. #define AFX_CREDITSTATIC_H__4ABD7701_49F5_11D1_9E3C_00A0245800CF__INCLUDED_  
  946.   
  947. #if _MSC_VER >= 1000  
  948. #pragma once  
  949. #endif // _MSC_VER >= 1000  
  950. // CreditStatic.h : header file  
  951. //  
  952.   
  953. #define DISPLAY_SLOW        0  
  954. #define DISPLAY_MEDIUM      1  
  955. #define DISPLAY_FAST        2  
  956.   
  957. #define BACKGROUND_COLOR        0  
  958. #define TOP_LEVEL_TITLE_COLOR   1  
  959. #define TOP_LEVEL_GROUP_COLOR   2  
  960. #define GROUP_TITLE_COLOR       3  
  961. #define NORMAL_TEXT_COLOR       4  
  962.   
  963. #define TOP_LEVEL_TITLE_HEIGHT  0         
  964. #define TOP_LEVEL_GROUP_HEIGHT  1       
  965. #define GROUP_TITLE_HEIGHT      2       
  966. #define NORMAL_TEXT_HEIGHT      3  
  967.   
  968. #define TOP_LEVEL_TITLE         0   // '\t'  
  969. #define TOP_LEVEL_GROUP         1   // '\n'  
  970. #define GROUP_TITLE             2   // '\r'  
  971. #define DISPLAY_BITMAP          3   // '^'  
  972.   
  973. #define GRADIENT_NONE           0  
  974. #define GRADIENT_RIGHT_DARK     1  
  975. #define GRADIENT_RIGHT_LIGHT    2  
  976. #define GRADIENT_LEFT_DARK      3  
  977. #define GRADIENT_LEFT_LIGHT     4  
  978.   
  979. class CCreditStatic : public CStatic  
  980. {  
  981. protected:  
  982.     COLORREF    m_Colors[5];  
  983.     int         m_TextHeights[4];  
  984.         TCHAR       m_Escapes[4];  
  985.     int         m_DisplaySpeed[3],m_CurrentSpeed;  
  986. //  CRect       m_ScrollRect;          // rect of Static Text frame  
  987.     CStringList m_ArrCredit;  
  988.     CString     m_szWork;  
  989.     int         m_nCounter;        // work ints  
  990.     POSITION    m_ArrIndex;  
  991.     BOOL        m_bFirstTime;  
  992.     BOOL        m_bDrawText;  
  993.     int         m_nClip,m_ScrollAmount;  
  994.     int         m_nCurrentFontHeight;  
  995.   
  996.     CBitmap     m_bmpWork;                  // bitmap holder  
  997.     CBitmap     m_BmpMain;                  // bitmap holder  
  998.   
  999.     CSize       m_size;                     // drawing helpers  
  1000.     CPoint      m_pt;  
  1001.     BOOL        m_bProcessingBitmap;  
  1002.     CPalette    m_pal;  
  1003.     CBitmap     m_bitmap;  
  1004.     int m_cxBitmap, m_cyBitmap;  
  1005.     BOOL        m_bFirstTurn;  
  1006.     UINT        m_Gradient;  
  1007.     BOOL        m_bTransparent;  
  1008.     int         n_MaxWidth;  
  1009.     UINT        TimerOn;  
  1010. // Construction  
  1011. public:  
  1012.     CCreditStatic();  
  1013.   
  1014. // Attributes  
  1015. public:  
  1016.   
  1017. // Operations  
  1018. public:  
  1019.     BOOL StartScrolling();  
  1020.     void EndScrolling();  
  1021.     void SetCredits(LPCTSTR credits, char delimiter = '|');  
  1022.     void SetCredits(UINT nID, char delimiter = '|');  
  1023.     void SetSpeed(UINT index, int speed = 0);  
  1024.     void SetColor(UINT index, COLORREF col);  
  1025.     void SetTextHeight(UINT index, int height);  
  1026.     void SetEscape(UINT index, char escape);  
  1027.     void SetGradient(UINT value = GRADIENT_RIGHT_DARK);  
  1028.     BOOL SetBkImage(UINT nIDResource);  
  1029.     BOOL SetBkImage(LPCTSTR lpszResourceName);  
  1030.     void SetTransparent(BOOL bTransparent = TRUE);  
  1031. // Overrides  
  1032.     // ClassWizard generated virtual function overrides  
  1033.     //{{AFX_VIRTUAL(CCreditStatic)  
  1034.     //}}AFX_VIRTUAL  
  1035.   
  1036. // Implementation  
  1037. public:  
  1038.     virtual ~CCreditStatic();  
  1039.   
  1040.     // Generated message map functions  
  1041. protected:  
  1042.     void MoveCredit(CDC *pDC, CRect& r, CRect& r2, BOOL bCheck);  
  1043.     void AddBackGround(CDC* pDC, CRect& m_ScrollRect, CRect& m_ClientRect);  
  1044.     void DrawCredit(CDC* pDC, CRect& m_ScrollRect);  
  1045.     void FillGradient(CDC *pDC, CRect *m_ScrollRect, CRect *m_FillRect, COLORREF color);  
  1046.     void DrawBitmap(CDC* pDC, CDC* pDC2, CRect *rBitmap);  
  1047.   
  1048.     //{{AFX_MSG(CCreditStatic)  
  1049.     afx_msg void OnPaint();  
  1050.     afx_msg BOOL OnEraseBkgnd(CDC* pDC);  
  1051.     afx_msg void OnTimer(UINT nIDEvent);  
  1052.     afx_msg void OnDestroy();  
  1053.     //}}AFX_MSG  
  1054.   
  1055.     DECLARE_MESSAGE_MAP()  
  1056. };  
  1057.   
  1058. /  
  1059.   
  1060. //{{AFX_INSERT_LOCATION}}  
  1061. // Microsoft Developer Studio will insert additional declarations immediately before the previous line.  
  1062.   
  1063. #endif // !defined(AFX_CREDITSTATIC_H__4ABD7701_49F5_11D1_9E3C_00A0245800CF__INCLUDED_)  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值