zoukankan      html  css  js  c++  java
  • MFC用GDI+动感歌词的制作

    源代码:http://download.csdn.net/detail/nuptboyzhb/4219669

     

    源代码:

    1.       插入一个对话框的资源,删除默认控件,并为对话框创建一个类,命名为ClyricDlg;

    2.       在对话框的头文件中添加GDI+相关的头文件和动态库

    #define UNICODE

    #ifndef ULONG_PTR

    #define ULONG_PTR unsigned long*

    #endif

    #include "GDIPlus\Includes\GdiPlus.h"   ////Modify your path

    using namespace Gdiplus; 

    #pragma comment(lib, "GDIPlus\Lib\gdiplus.lib") //Modify your lib path

    3.       新增公有成员变量:

    int m_kind;

    int cx;

    BOOL UpdateDisplay(int Transparent=255);

             HINSTANCE hFuncInst ;

    typedef BOOL (WINAPI *MYFUNC)(HWND,HDC,

    POINT*,SIZE*,HDC,POINT*,COLORREF,BLENDFUNCTION*,DWORD);         

    MYFUNC UpdateLayeredWindow;

    BLENDFUNCTION m_Blend;

            HDC m_hdcMemory;

    4.       新增私有成员变量:

    BOOL m_bBack;

    GdiplusStartupInput gdiplusStartupInput;

         ULONG_PTR           gdiplusToken;

    5.       在构造函数中初始化如下成员变量:

    m_bBack=false;

    m_kind=cx=0;

         GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    6.       为对话框添加OnCreate函数,并编辑代码如下:

    hFuncInst = LoadLibrary("User32.DLL");

    BOOL bRet=FALSE;

    if(hFuncInst)

               UpdateLayeredWindow=(MYFUNC)GetProcAddress(hFuncInst, "UpdateLayeredWindow");

    else

    {

               AfxMessageBox("User32.dll ERROR!");

               exit(0);

    }

    // Initialize GDI+.

    m_Blend.BlendOp=0; //theonlyBlendOpdefinedinWindows2000

    m_Blend.BlendFlags=0; //nothingelseisspecial...

    m_Blend.AlphaFormat=1; //...

    m_Blend.SourceConstantAlpha=255;//AC_SRC_ALPHA

    7.       实现其成员函数UpdataDisplay

    1. BOOL CLyricDlg::UpdateDisplay(int Transparent)  
    2.   
    3. {  
    4.   
    5. //获得DC,创建兼容DC  
    6.   
    7. HDC hdcTemp=GetDC()->m_hDC;  
    8.   
    9. m_hdcMemory=CreateCompatibleDC(hdcTemp);  
    10.   
    11. HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp,755,350);  
    12.   
    13. SelectObject(m_hdcMemory,hBitMap);  
    14.   
    15. //设置透明度最大值为100  
    16.   
    17. if(Transparent<0||Transparent>100)      Transparent=100;  
    18.   
    19.     //将透明度参数,传递给BLENDFUNCTION;  
    20.   
    21. m_Blend.SourceConstantAlpha=int(Transparent*2.55);//1~255  
    22.   
    23. RECT rct;  
    24.   
    25. //获取窗口的屏幕位置  
    26.   
    27. GetWindowRect(&rct);  
    28.   
    29. //窗口左上角的坐标  
    30.   
    31. POINT ptWinPos={rct.left,rct.top};  
    32.   
    33.     //创建2个兼容DC的画笔,Graphics类在GDI+中定义  
    34.   
    35. Graphics graph(m_hdcMemory);  
    36.   
    37. Graphics graphics(m_hdcMemory);  
    38.   
    39.     //设置平滑模式  
    40.   
    41. graphics.SetSmoothingMode(SmoothingModeAntiAlias);  
    42.   
    43. graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);  
    44.   
    45.     //设置字体,FontFamily也在GDI+中定义  
    46.   
    47. FontFamily fontFamily(L"Arial Black");  
    48.   
    49. StringFormat strformat;  
    50.   
    51. //获取系统时间  
    52.   
    53. CTime time=CTime::GetCurrentTime();  
    54.   
    55. CString timestr=time.Format("%H-%M-%M");  
    56.   
    57. wchar_t pszbuf[][80]={{L"http://blog.csdn.net/nuptboyzhb"},  
    58.   
    59. {L"南京邮电大学郑海波"},  
    60.   
    61. {L"I wish you will lead a  happy life!"},  
    62.   
    63. {L"zhb931706659@126.com"},  
    64.   
    65. {L"NUPT"}  
    66.   
    67. };  
    68.   
    69.     //创建一个画笔的路径  
    70.   
    71. GraphicsPath path;  
    72.   
    73. path.AddString(pszbuf[m_kind],wcslen(pszbuf[m_kind]),&fontFamily,  
    74.   
    75.            FontStyleRegular,38,Point(10,10),&strformat);  
    76.   
    77.     //创建一支画笔  
    78.   
    79. Pen pen(Color(155,215,215,215),3);  
    80.   
    81.     //画笔画出已经创建的路径  
    82.   
    83. graphics.DrawPath(&pen,&path);  
    84.   
    85. /*画出字体的边缘部分*/  
    86.   
    87. for(int i=1; i<9; i+=1)  
    88.   
    89.     {  
    90.   
    91.         Pen pen(Color(62, 0, 2, 2),(float)i);  
    92.   
    93.         pen.SetLineJoin(LineJoinRound);  
    94.   
    95.         graphics.DrawPath(&pen, &path);  
    96.   
    97.     }   
    98.   
    99.   
    100. SolidBrush brush(Color(25,228,228,228));  
    101.   
    102. Pen pen1(Color(155,223,223,223));  
    103.   
    104. Pen pen2(Color(55,223,223,223));    
    105.   
    106. Image image(L"1.png");  
    107.   
    108. if(m_bBack)//画背景和图片  
    109.   
    110. {  
    111.   
    112.            graphics.FillRectangle(&brush,3,5,750,90);  
    113.   
    114.            graphics.DrawRectangle(&pen1,2,6,751,91);  
    115.   
    116.            graphics.DrawRectangle(&pen2,1,5,753,93);  
    117.   
    118.            graphics.DrawImage(&image,600,5);  
    119.   
    120. }  
    121.   
    122. //创建线性渐变画刷  
    123.   
    124. LinearGradientBrush linGrBrush(  
    125.   
    126.            Point(0,0),Point(0,90),  
    127.   
    128.            Color(255,255,255,255),  
    129.   
    130.            Color(255,30,120,195));  
    131.   
    132. LinearGradientBrush linGrBrushW(  
    133.   
    134.            Point(0,10),Point(0,60),  
    135.   
    136.            Color(255,255,255,255),  
    137.   
    138.            Color(15,1,1,1));  
    139.   
    140. //用线性渐变画刷填充路径  
    141.   
    142. graphics.FillPath(&linGrBrush,&path);  
    143.   
    144. graphics.FillPath(&linGrBrushW,&path);  
    145.   
    146. //设置窗口的风格  
    147.   
    148. DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);  
    149.   
    150. if((dwExStyle&0x80000)!=0x80000)  
    151.   
    152.            SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);  
    153.   
    154. //更新窗口层  
    155.   
    156. SIZE sizeWindow={755,350};  
    157.   
    158. POINT ptSrc={0,0};  
    159.   
    160. BOOL bRet=FALSE;  
    161.   
    162. HDC hdcScreen=::GetDC (m_hWnd);  
    163.   
    164. //UpdateLayeredWindow功能是更新一个窗口的位置、大小、形状、内容和透明度  
    165.   
    166. bRet= UpdateLayeredWindow( m_hWnd,hdcScreen,&ptWinPos,  
    167.   
    168.            &sizeWindow,m_hdcMemory,&ptSrc,0,&m_Blend,2);  
    169.   
    170. graph.ReleaseHDC(m_hdcMemory);  
    171.   
    172. ::ReleaseDC(m_hWnd,hdcScreen);  
    173.   
    174. hdcScreen=NULL;  
    175.   
    176. ::ReleaseDC(m_hWnd,hdcTemp);  
    177.   
    178. hdcTemp=NULL;  
    179.   
    180. DeleteObject(hBitMap);  
    181.   
    182. DeleteDC(m_hdcMemory);  
    183.   
    184. m_hdcMemory=NULL;  
    185.   
    186. return bRet;  
    187.   
    188. }  


     

    8.       添加OnTimer(UINT nIDEvent)消息响应函数,编辑代码如下:

    cx+=1;

    if(cx>20)

    {

               m_kind++;

               m_bBack=false;

               UpdateDisplay();

               cx=0; 

    }                

    if(m_kind>3)

               m_kind=0;

    9.       编辑OnInitDialog()函数

    // TODO: Add extra initialization here

    UpdateDisplay();

          SetTimer(1,50,NULL);

  • 相关阅读:
    企业应用的互联网化(2010年2月)
    Flex的危局,还是HTML5的盛宴?
    在MBP上自由切换显卡
    Django的中文编码问题
    Jenkins+Maven+SVN快速搭建持续集成环境(转)
    解决 phpmyadmin #2002 无法登录 MySQL 服务器
    Spring框架中获得DataSource对象的方法(转)
    jetty 源代码地址
    eclipse中js文件报missing semicolon
    等额本息贷款月付款额的推导公式
  • 原文地址:https://www.cnblogs.com/lidabo/p/3501332.html
Copyright © 2011-2022 走看看