`
wsql
  • 浏览: 11797516 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

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

BOOL CLyricDlg::UpdateDisplay(int Transparent)

{

//获得DC,创建兼容DC

HDC hdcTemp=GetDC()->m_hDC;

m_hdcMemory=CreateCompatibleDC(hdcTemp);

HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp,755,350);

SelectObject(m_hdcMemory,hBitMap);

//设置透明度最大值为100

if(Transparent<0||Transparent>100)      Transparent=100;

    //将透明度参数,传递给BLENDFUNCTION;

m_Blend.SourceConstantAlpha=int(Transparent*2.55);//1~255

RECT rct;

//获取窗口的屏幕位置

GetWindowRect(&rct);

//窗口左上角的坐标

POINT ptWinPos={rct.left,rct.top};

    //创建2个兼容DC的画笔,Graphics类在GDI+中定义

Graphics graph(m_hdcMemory);

Graphics graphics(m_hdcMemory);

    //设置平滑模式

graphics.SetSmoothingMode(SmoothingModeAntiAlias);

graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);

    //设置字体,FontFamily也在GDI+中定义

FontFamily fontFamily(L"Arial Black");

StringFormat strformat;

//获取系统时间

CTime time=CTime::GetCurrentTime();

CString timestr=time.Format("%H-%M-%M");

wchar_t pszbuf[][80]={{L"http://blog.csdn.net/nuptboyzhb"},

{L"南京邮电大学郑海波"},

{L"I wish you will lead a  happy life!"},

{L"zhb931706659@126.com"},

{L"NUPT"}

};

    //创建一个画笔的路径

GraphicsPath path;

path.AddString(pszbuf[m_kind],wcslen(pszbuf[m_kind]),&fontFamily,

           FontStyleRegular,38,Point(10,10),&strformat);

    //创建一支画笔

Pen pen(Color(155,215,215,215),3);

    //画笔画出已经创建的路径

graphics.DrawPath(&pen,&path);

/*画出字体的边缘部分*/

for(int i=1; i<9; i+=1)

    {

        Pen pen(Color(62, 0, 2, 2),(float)i);

        pen.SetLineJoin(LineJoinRound);

        graphics.DrawPath(&pen, &path);

    } 


SolidBrush brush(Color(25,228,228,228));

Pen pen1(Color(155,223,223,223));

Pen pen2(Color(55,223,223,223));  

Image image(L"1.png");

if(m_bBack)//画背景和图片

{

           graphics.FillRectangle(&brush,3,5,750,90);

           graphics.DrawRectangle(&pen1,2,6,751,91);

           graphics.DrawRectangle(&pen2,1,5,753,93);

           graphics.DrawImage(&image,600,5);

}

//创建线性渐变画刷

LinearGradientBrush linGrBrush(

           Point(0,0),Point(0,90),

           Color(255,255,255,255),

           Color(255,30,120,195));

LinearGradientBrush linGrBrushW(

           Point(0,10),Point(0,60),

           Color(255,255,255,255),

           Color(15,1,1,1));

//用线性渐变画刷填充路径

graphics.FillPath(&linGrBrush,&path);

graphics.FillPath(&linGrBrushW,&path);

//设置窗口的风格

DWORD dwExStyle=GetWindowLong(m_hWnd,GWL_EXSTYLE);

if((dwExStyle&0x80000)!=0x80000)

           SetWindowLong(m_hWnd,GWL_EXSTYLE,dwExStyle^0x80000);

//更新窗口层

SIZE sizeWindow={755,350};

POINT ptSrc={0,0};

BOOL bRet=FALSE;

HDC hdcScreen=::GetDC (m_hWnd);

//UpdateLayeredWindow功能是更新一个窗口的位置、大小、形状、内容和透明度

bRet= UpdateLayeredWindow( m_hWnd,hdcScreen,&ptWinPos,

           &sizeWindow,m_hdcMemory,&ptSrc,0,&m_Blend,2);

graph.ReleaseHDC(m_hdcMemory);

::ReleaseDC(m_hWnd,hdcScreen);

hdcScreen=NULL;

::ReleaseDC(m_hWnd,hdcTemp);

hdcTemp=NULL;

DeleteObject(hBitMap);

DeleteDC(m_hdcMemory);

m_hdcMemory=NULL;

return bRet;

}


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);

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics