源代码: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+使用双缓存绘图,避免闪烁,提高绘图效率。
MFC GDI+缩放图片示例
介绍在VC++的MFC中利用GDI+进行编程,包括画图、路径、变换、打开图像等,CHM格式,便于查看
这段时间做项目用到GDI+绘制图形,在网上找了很多关于双缓存的资料大多是讲图片方面的,关于绘图的讲的很少。自己做了个希望对大家有帮助
GDI+开发的帮助文档,讲得清晰浅显,而且是中文的.如果学习GDI+开发的话,特别是初学者,强烈推荐下载. 对于初学者,还有一个问题就是,如果想要进行GDI+开发, 需要下载一个GDI+的开发包(SDK). 网上搜到的一般只包含一个...
基于MFC、GDI+ 的粒子系统:实现玫瑰花飞舞 玫瑰花在电脑桌面满屏飞舞
Bitmap b(image.GetWidth(),image.GetHeight());如何使用GDI+制作圆形图片(类似QQ圆形头像)(MFC,VC)
【初学者】通过GDI+PNG,实现MFC控件透明,看不懂GDI的配置请百度。
VS/VC环境下 MFC+GDI 绘制倾斜的椭圆
一个LED显示控件 自己看吧..
资源里面是一个工程。简单的使用GDI进行绘图(图片)。使用C++语言,基于mfc的对话框实现。
光剑程序 vc源码 使用了mfc opencv gdi+
MFC GDI+ 用png图片做的异形窗口,渐显渐隐启动退出,可以用来做启动画面。
用VS2005基于MFC采用GDI+技术实现的一个图片查看器,支持gif、bmp、jpg、png等常见格式,尤其是对gif动画的支持,很很给力哦,尤其是初学者。
开发环境VS2013代码中btn项目为GDI按钮重绘,btnDemo为GDI+按钮重绘
介绍GDI+的特点和新增功能,以及GDI+ API的具体使用方法,包括二维矢量图形的绘制、图像处理的应用、以及文字的显示。
后来通过对网上资料的分析,和对SDK,MFC的学习,实现了VC6下GDI+双缓冲的效果,把它写出来与大家分享,希望可以找到更好地实现方法。 想必大家对双缓冲的原理有了一定的了解,以前我也做过GDI双缓冲的项目,网上的...