VC实现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;
}
分析一下:

颜色模型的转化,即将彩色位图转化成灰度图,这个在RGB模型中即R=G=B三色值即可,也有更好HSL,HIV等模型转化,可以看计算机图形学,上面有介绍;

即获得屏幕位图句柄,放入内存DC中处理居灰度图片,反复转换,以求得特效;

本处的色点处理采用了移位处理,即R与B值移位时注意一下移的位数,与我们想的不一样,正确的存储顺序是 BGR,每个8位;

不知道上面的代码算不算简易实现了特效,有这方面兴趣的可以查看代码,另外本人稍感遗憾的是无法与关机的实现在一块,即整个屏幕被

控制住了,不响应鼠标的操作,希望有同仁指出实现方法。谢谢!欢迎交流xuwenq88@126.com

时间: 2024-10-06 21:57:26

VC实现WIN XP关机的特效的相关文章

加快Win XP开机启动的四种方法

一台电脑以及它的相关外接设备到手了,它的硬件实体就固定了,这时候所能操作的只有软件程序了 ,本文从硬件与软件,软件程序的安全与有一定风险,从简单与相对复杂几个方面就如何加快启动XP开机 时间的问题,作一小结,以便让新手菜鸟也能简单安全地操作他. 一.影响启动速度的硬件因素 影响电脑启动速度的主要硬件是主板和硬盘以及内存,而与CPU关系不大. 主板是各种电脑配件的"基地",在开机时要做的工作很多,比如自检.搜索各种端口.各种外接设 备.因此减少自检时间.减少外接设备.提高效率才能提高启动

如何让XP关机自动清理页面文件

  如何让XP关机自动清理页面文件          按键盘上的"Win+R"组合键打开"运行"在对话框中输入"Regedit",然后单击"确定",运行"注册表编辑器". 定位"HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory Management"栏内的"ClearPageFileAtS

45条Win XP必知实用技巧

45条Win XP必知实用技巧 作者:不详 出处:本站整理 时间:2006-7-24 14:13:00 我综合了网上非常适用的Windows XP操作系统应用小技巧,希望对大家有用,如果你有更好的请跟帖子大家共分享!有关注册表修改的,请先备份注册表! 1. 影音文件在xp中无法删除 很多情况下是因为预览功能搞的鬼.开始 运行中输入并执行"REGSVR32 /U SHMEDIA.DLL",取消息预览.恢复时运行"REGSVR32 SHMEDIA.DLL".其实就是去掉

[注册表]三篇玩转Win XP注册表_注册表

  上篇:玩转Win XP注册表之性能优化 Microsoft的Windows XP发布已经很久了,相信有不少朋友也都将自己的操作系统升级成XP.这款号称得上是至今功能最强大的操作系统,在功能与界面上的确比以往的Windows操作系统有了很大的改进,但新安装的Windows XP系统并不是处于最佳的状态,大多数功能与介面都是按照预设值设置的,今天在这里,我将教大家如何通过改造windows XP的神经系统-注册表,使你的windows xp的性能更佳,更具个性化. 1. 加快开机及关机速度 在[

基于Win XP 架设Web服务器和FTP服务器

网络的迅速发展,如何在自己的爱机上建设自己的网站, 那么选择什么系统呢?Win 2000漏洞百出,Win 2003又专门为服务器设计,不太适合普通的家用,相反WinXP 是微软继Win 98后最受欢迎的操作系统,现在就介绍一下,在XP环境中利用IIS架构自己的网站. 很多人借助第3方软件在自己的系统中建站,其实利用Win XP的组件就可以满足建站的要求,而且安全性能不错,为什么还要借助第3方软件呢? IIS的安装 在Windows XP pro 中,IIS并不是默认安装的,而是作为可选的组件,现

Win XP注册表简单还原法

Windows将其配置信息存储在一个称为注册表的数据库中,该数据库包含计算机中每个用户的配置文件.有关系统硬件的信息.安装的程序及属性设置,Windows在其运行中不断引用这些信息.Win XP提供了一个还原注册表的新方法,可以免除你在系统损坏后,重新安装Windows的漫长煎熬. l.重新启动计算机,在看到"选择启动操作系统"消息后,请按"F8"键. 2.使用箭头键突出显示"最后一次正确的配置",然后按Enter键.必须关闭NUM LOCK,数

xp关机后自动重启

xp关机后自动重启? 最近每次我用完电脑关机后,它不关反而又打开了,可我关机的时候明明点的是关机不是重启,怎么回事啊? 让它关机却重启 该故障是Windows XP操作系统关机故障中最容易出现的故障.造成该故障的原因可能有以下几方面原因: 1.系统设置在添乱 Windows XP默认情况下,当系统出现错误时会自动重新启动,这样当用户关机时,如果关机过程中系统出现错误就会重新启动计算机.将该功能关闭往往可以解决自动重启的故障. 在桌面上右键点击"我的电脑",在弹出的右键菜单中选择&quo

Win XP下安装显卡驱动提示不兼容的修复

笔者最近购买的东芝L700-C06W笔记本,预装的是Win 7系统,重装Win XP系统后,却发现安装显卡驱动提示硬件不兼容的问题,为什么重装Win XP后不能正确安装显卡驱动,下面来看看笔者怎么去解决这显卡驱动安装不正确的问题. 1.打开设备管理器,在其他设备中会有一个问号硬件. 2.在有问题硬件上双击,在属性内打开详细信息,记住框线内设备ID. 3.解压驱动文件到C盘,找到C:NVIDIADisplayDriver270.61WinXPInternational Display.Driver

如何更改Win XP系统的桌面图标透明度

  如何更改Win XP系统的桌面图标透明度          在winxp系统中,有个小小的技巧.这个图标透明不是只有win7系统下才有这个效果的,今天大地系统的小编就说下怎么来改这个透明度. XP系统桌面图标的不透明度是可以调整的,适当的调节桌面图标的不透明度可以提高视觉效果,以下是关于桌面图标不透明度的调节方法,希望可以帮助到大家. 一般遇到桌面图标不透明的问题多半是因为使用了自定义桌面或者安装了一些主题桌面的原因,解决的方法也比较简单. 在桌面鼠标右击,选择"属性 -> 桌面 -&