新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → Visual C++实现WinXP关机特效 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 5397 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: Visual C++实现WinXP关机特效 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 Visual C++实现WinXP关机特效

    其方法如:制造一个刷子,用灰色刷屏幕!以下这部分为网上的一个老版本的关机效果代码,不是很好。

    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位;不知道上面的代码算不算简易实现了特效,有这方面兴趣的可以查看代码,另外本人稍感遗憾的是无法与关机的实现在一块,即整个屏幕被控制住了,不响应鼠标的操作,希望有同仁指出实现方法。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/9/13 10:50:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/23 1:09:14

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    42.969ms