当前位置: 首页 > 图文教程 > 开发语言 > VC++ > WIN XP关机的特效实现

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 WIN XP关机的特效实现


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 48 ::
收藏到网摘: n/a

WIN XP关机的特效实现

作者:小帅

下载源代码

  本人在网上搜罗过一些与关机有的代码,发现关机的代码差不多都一样,而对关机前的特效的代码几科没有,只有一个WIN2000的,其方法如:制造一个刷子,用灰色刷屏幕!以下这部分为网上的一个老版本的关机效果代码,不是很好。

HBITMAP hbm=CreateBitmap(8, 8, 1, 1, pbit);HBRUSH hbr=CreatePatternBrush(hbm);HDC hdc=CreateDC(_T("DISPLAY"), NULL, NULL, NULL);HDC hdc0=::GetDC(0);SelectObject(hdc,hbr);	PatBlt(hdc, 0, 0, GetDeviceCaps(hdc, VERTRES),	GetDeviceCaps(hdc, HORZRES ),	0xa000c9);	
  用到了一个刷子函数:PatBlt,这个还是在VB的书上看到的,各大网上相互用上了,试了一下,效果不是很理想!(主要是屏幕颜色静止不变化,XP的关机前屏幕是逐渐变化至白化的,这个过程是动态随时间而变化的)无意中在CODEPROJECT站上经人指点,获得了一个比较好的,与大家分享一下,主要是仿XP关机的渐变屏幕的特效!
 ///////////////////////// 核心函数,将屏幕变暗HBITMAP CMyFade::FadeBitmap(HBITMAP hBmp, double dfTrans){	HBITMAP hRetBmp = NULL;	if (hBmp)	{	HDC hBufferDC = CreateCompatibleDC(NULL);	HGDIOBJ hPrevBufObject = SelectObject(hBufferDC, hBmp);	HDC hDirectDC = CreateCompatibleDC(NULL);	// DC for working	if (hDirectDC)	{	BITMAP bm;	GetObject(hBmp, sizeof(bm), &bm);	BITMAPINFO bmInfo;	ZeroMemory(&bmInfo,sizeof(bmInfo));	bmInfo.bmiHeader.biSize	= sizeof(BITMAPINFOHEADER);	bmInfo.bmiHeader.biWidth	= bm.bmWidth;	bmInfo.bmiHeader.biHeight	= bm.bmHeight;	bmInfo.bmiHeader.biPlanes	= 1;	bmInfo.bmiHeader.biBitCount	= 32;	UINT* ptPixels;	HBITMAP hDirectBitmap = CreateDIBSection(hDirectDC,	(BITMAPINFO*)&bmInfo,	DIB_RGB_COLORS,(void**)&ptPixels, NULL, 0);	if (hDirectBitmap)	{	// 将hDirectBitmap放入hDirectDC中处理	HGDIOBJ hPrevBufDirObject = SelectObject(hDirectDC, hDirectBitmap);	// 当前将原hBmp即屏幕的所有像素写入到hDirectDC	// 即需要对像素灰度处理的DC中	BitBlt(hDirectDC,0,0,bm.bmWidth,bm.bmHeight,hBufferDC,0,0,SRCCOPY);	int iAlpha = (int)(255.0 * dfTrans / 100.0);	int nSize = bm.bmWidth * bm.bmHeight;	for (int i=0; i<nSize; i++)	{	// 0.212671 * R + 0.715160 * G + 0.072169 * B	int iSrcR = (ptPixels[i]) & 0x00ff0000 >> 16;	int iSrcG = ptPixels[i] & 0x0000ff00 >> 8;	int iSrcB = ptPixels[i] & 0x000000ff;	int iGrey = (iSrcR * 54 + iSrcG * 182 + iSrcB * 19) >> 8;	COLORREF Col =iGrey ; //RGB(iGrey, iGrey, iGrey) ;	ptPixels[i] = RGB(	(GetBValue( Col ) * iAlpha + iSrcB * (255 - iAlpha)) >> 8,	(GetGValue( Col ) * iAlpha + iSrcG * (255 - iAlpha)) >> 8,	(GetRValue( Col ) * iAlpha + iSrcR * (255 - iAlpha)) >> 8 );	}	SelectObject(hDirectDC,hPrevBufDirObject);	hRetBmp = hDirectBitmap;	}	DeleteDC(hDirectDC);	}	SelectObject(hBufferDC, hPrevBufObject);	DeleteDC(hBufferDC);	}	return hRetBmp;}
分析一下:
  1. 颜色模型的转化,即将彩色位图转化成灰度图,这个在RGB模型中即R=G=B三色值即可,也有更好HSL,HIV等模型转化,可以看计算机图形学
    上面有介绍;
  2. 即获得屏幕位图句柄,放入内存DC中处理居灰度图片,反复转换,以求得特效;
  3. 本处的色点处理采用了移位处理,即R与B值移位时注意一下移的位数,与我们想的不一样,正确的存储顺序是 BGR,每个8位;

  不知道上面的代码算不算简易实现了特效,有这方面兴趣的可以查看代码,另外本人稍感遗憾的是无法与关机的实现在一块,即整个屏幕被
控制住了,不响应鼠标的操作,希望有同仁指出实现方法。谢谢!欢迎交流[email protected]