
Visual C++实现WinXP关机特效
发布时间:2006-09-10 10:45:08 来源:vckbase 网友评论 0 条
本人在网上搜罗过一些与关机有的代码,发现关机的代码差不多都一样,而对关机前的特效的代码几乎没有,只有一个WIN2000的,其方法如:制造一个刷子,用灰色刷屏幕!以下这部分为网上的一个老版本的关机效果代码,不是很好。
用到了一个刷子函数:PatBlt,这个还是在VB的书上看到的,各大网上相互用上了,试了一下,效果不是很理想!(主要是屏幕颜色静止不变化,XP的关机前屏幕是逐渐变化至白化的,这个过程是动态随时间而变化的)无意中在CODEPROJECT站上经人指点,获得了一个比较好的,与大家分享一下,主要是仿XP关机的渐变屏幕的特效!
分析一下:
颜色模型的转化,即将彩色位图转化成灰度图,这个在RGB模型中即R=G=B三色值即可,也有更好HSL,HIV等模型转化,可以看计算机图形学上面有介绍;即获得屏幕位图句柄,放入内存DC中处理居灰度图片,反复转换,以求得特效;本处的色点处理采用了移位处理,即R与B值移位时注意一下移的位数,与我们想的不一样,正确的存储顺序是 BGR,每个8位;不知道上面的代码算不算简易实现了特效,有这方面兴趣的可以查看代码,另外本人稍感遗憾的是无法与关机的实现在一块,即整个屏幕被控制住了,不响应鼠标的操作,希望有同仁指出实现方法。
| 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; } |
分析一下:
颜色模型的转化,即将彩色位图转化成灰度图,这个在RGB模型中即R=G=B三色值即可,也有更好HSL,HIV等模型转化,可以看计算机图形学上面有介绍;即获得屏幕位图句柄,放入内存DC中处理居灰度图片,反复转换,以求得特效;本处的色点处理采用了移位处理,即R与B值移位时注意一下移的位数,与我们想的不一样,正确的存储顺序是 BGR,每个8位;不知道上面的代码算不算简易实现了特效,有这方面兴趣的可以查看代码,另外本人稍感遗憾的是无法与关机的实现在一块,即整个屏幕被控制住了,不响应鼠标的操作,希望有同仁指出实现方法。
推荐阅讯
- C++箴言:只要有可能就推迟变量定义
- C++启蒙之C++中的类
- 伪随机数生成及在VC++中的实现
- 用BCB开发有身份认证功能的Email程序
- C++的救赎 C++开源程序库评话
- 四种程序启动画面的制作方法(VC)
- 基于VC++的OpenGL编程讲座之曲线和曲面
- Windows Sockets:使用带存档的套接字
- VC与Matlab接口编程之Matcom安装配置
- Windows Sockets:端口和套接字地址
阅读排行
- 1.Borland 发布C++ Builder 2006 RAD 环境
- 2.C/C++程序员应聘常见面试题深入剖析
- 3.Visual C++常用数据类型转换详解
- 4.C++中的 static 关键字
- 5.利用VC++实现局域网实时视频传输
- 6.浅谈C/C++内存泄漏及其检测工具
- 7.英国投票否决C++/CLI 微软强攻ISO标准受挫
- 8.VC++下用MSComm控件实现串口通讯
- 9.伪随机数生成及在VC++中的实现
- 10.VC++编程实现对波形数据的频谱分析
专题教程
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
- Picasa中文版_Picasa教程 专题:清除流氓软件
- Firefox专题 seo搜索引擎优化专区
- 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
