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);
MFC用GDI+动感歌词的制作的更多相关文章
- MFC 用gdi绘制填充多边形区域
MFC 用gdi绘制填充多边形区域 这里的代码是实现一个三角形的绘制,并用刷子填充颜色 在OnPaint()函数里面 运用的是给定的三角形的三个点,很多个点可以绘制多边形 CBrush br(RGB( ...
- mfc配置GDI+有106个错误
mfc配置GDI+有106个错误,处理如下,参考http://bbs.csdn.net/topics/380054079 一开始#include...放在stdafx.h里有错误,后来上面修改好了,放 ...
- VS2010 MFC 使用GDI+给图片添加汉字
1.配置GDI+ VS2010自带GDI+,直接使用. (1)首先要添加头文件和库 #pragma comment( lib, "gdiplus.lib" ) #include & ...
- MFC和GDI+一起使用
VS2010,新建MFC项目,在头文件stdafx.h中添加: #include <gdiplus.h> using namespace Gdiplus; #pragma comment ...
- 基于MFC的Media Player播放器制作的SetTimer函数介绍
| 版权声明:本文为博主原创文章,未经博主允许不得转载. SetTimer是一种API函数,位于user32.dll中.你想每隔一段时间执行一件事的的时候,你可以使用它. 使用定时器的方法比 较简 ...
- MFC GDI绘图基础
一.关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Wind ...
- scxml 图像展示器 (基于C++ MFC GDI tinyxpath的实现)
以前的时候学习新东西没有总结的习惯,周末把以前研究的东西翻了翻,稍微总结下. Scxml是w3c出来的基于状态机的对话脚本语言标准,具体内容可以谷歌到,这里讲述自己开发的一个把scxml转化为可交互图 ...
- 巧妙运用Camtasia制作爱豆的动感影集
对于追星族来说,收集爱豆的图片.视频是日常必做的事情,而对于进阶型的追星族来说,为爱豆自制各种精美的视频.影集等,会让自己追星之路显得更为充实. 我们可以借助Camtasia教程录制软件为爱豆制作各种 ...
- GDI+编程说明及小结
原文地址:http://blog.csdn.net/byxdaz/article/details/5972759 GDI+(Graphics Device Interface Plus图形设备接口加) ...
随机推荐
- C#实现多人语音聊天
在上一篇文章 实现一个简单的语音聊天室(多人语音聊天系统)中,我用C#实现了一个简单的语音聊天室,并给出了源代码下载.尽管有源代码,可是非常多朋友反映,理解起来还是有些模糊.不够清楚.如今想来,是由于 ...
- 探索Android中的Parcel机制(上)
一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化……,其作用是能将数据对象存入字节流其中,在须要时又一次生成对象.主要应用是利用外部存储设备保存对象状态 ...
- 轻量级数据库sqlite的接口说明
原文地址:http://www.cnblogs.com/kfqcome/archive/2011/06/27/2136999.html 一.使用流程 要使用sqlite,需要从sqlite官网下载到三 ...
- Oracle统计之like,or关键字
有的时候我们统计需要like多个条件,比如某个字段中含有 “银行”或者“投资公司”,这个时候就用like多个字段. 如下是统计某个地区的2015年入院的病种诊断中带有 “癌”或者“肿瘤”的情况, 正确 ...
- [转]apache的源码安装详细过程全纪录
原文链接:http://www.jb51.net/article/59474.htm 文中 开机启动需要修改 而且特别麻烦 还的配置php 否则不认识php文件 郁闷!只能做参考了!
- CentOS6.5 服务器+apache5.3绑定多个域名+SELinux设置
下面简单的介绍了如何通过设置Apache的http.conf文件,进行多个域名以及其相关的二级域名的绑定(假设我们要绑定的域名是minidx.com和ntt.cc,二级域名是blog.minidx.c ...
- Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)
Internationalization with Qt 应用程序的国际化就是使得程序能在国际间可用而不仅仅是在本国可用的过程. Relevant Qt Classes andAPIs 以下的类支持Q ...
- (step8.2.6)hdu 1848(Fibonacci again and again——组合博弈)
题目大意:输入3个整数m,n,p,分别表示3堆石头中的石头个数 解题思路: 1)斐波那契数列的第16个数fib[16] == 1597 2)(sg[m]^sg[n]^sg[p]) .一定要加括号, ...
- UVALive 6584 Escape (Regionals 2013 >> Europe - Central)
题目 给出一棵树,每个节点有一个怪物或血药,遇到怪物必须打,打完后扣掉一定的血量. 一开始英雄的血量为\(0\),当血量小于\(0\)时就挂了. 给出英雄的起点和终点,问能否成功到达终点. 算法 这题 ...
- Jquery progressbar通过Ajax请求获取后台进度演示
项目源代码下载:http://download.csdn.net/detail/nuptboyzhb/6262253 1.简介 本文主要演示Jquery progressbar的进度条功能.js通过a ...