且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

MFC用GDI+动感歌词的制作

更新时间:2022-09-13 10:27:37

源代码: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);