桌面精灵制作解析

简介:
最近一直在做一个涉及到很多Windows Region区域处理的项目,在开展的过程中,另我想起了几年前看到的一篇讲制作桌面精灵的文章( [url]http://www.vckbase.com/vckbase/vckbase12/vc/nonctrls/multimedia_22/1222001.htm[/url]),里面使用的技巧就是区域操作,但由于当时的水平不够,该文章的作者解释得又不是很详细,一直没有看懂,此番重读此代码,终于理解了,在这里记录下来。
那个代码(参见上面的连接)例子的主要部分如下:
首先要说明的是,桌面精灵图片是由中间一个人物和四周是白色象素的一个合成的矩形。这个也可以参见链接提供的源码中的资源文件。
void TransparentWnd::SetupRegion(CDC *pDC)
{
 CDC     memDC;
 CBitmap   &cBitmap=m_bmpDraw;
 CBitmap*  pOldMemBmp = NULL;
 COLORREF  col,colMask;
 CRect    cRect;
 int     x, y;
 CRgn    wndRgn, rgnTemp;
 GetWindowRect(&cRect);
 CPoint ptOrg=cRect.TopLeft();
 BITMAP bmInfo;
 cBitmap.GetObject(sizeof(bmInfo),&bmInfo);
 CRect rcNewWnd=CRect(ptOrg,CSize(bmInfo.bmWidth,bmInfo.bmHeight));
 memDC.CreateCompatibleDC(pDC);
 pOldMemBmp = memDC.SelectObject(&cBitmap);
 colMask=memDC.GetPixel(0,0);//这里取得左上角的象素,为白色。
 wndRgn.CreateRectRgn(0, 0, rcNewWnd.Width(), rcNewWnd.Height());
 for(x=0; x<=rcNewWnd.Width(); x++)
 {
  for(y=0; y<=rcNewWnd.Height(); y++)
  {
   //这里比较图片每一点上的象素,如果和左上角的象素相同,即也是白色,就做异或运算,结果为0,意即扣去了这一点,如此这般就扣去了整个矩形图片中所有白色的部分,剩余的部分就是精灵人物了。
   col = memDC.GetPixel(x, y);
   if(col == colMask)
   {
    rgnTemp.CreateRectRgn(x, y, x+1, y+1);
    wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_XOR);
    rgnTemp.DeleteObject(); 
   }
  }
 }
 if (pOldMemBmp) memDC.SelectObject(pOldMemBmp);
 SetWindowRgn((HRGN)wndRgn, TRUE);//这句话是将窗口的形状设置为剩余区域的大小。
 MoveWindow(rcNewWnd);
}
//然后在重绘窗口函数中,调用位拷贝函数BitBlt来贴图。该重绘窗口函数由Invalidate()触发。
BOOL TransparentWnd::OnEraseBkgnd(CDC* pDC) 
{
    CRect rect;
 GetWindowRect(&rect);
 CDC memDC;
 CBitmap   &cBitmap=m_bmpDraw;;
 CBitmap*  pOldMemBmp = NULL;
 CFont* pOldMemFont=NULL;
 memDC.CreateCompatibleDC(pDC);
 pOldMemBmp = memDC.SelectObject(&cBitmap);
 pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
 if (pOldMemBmp) memDC.SelectObject( pOldMemBmp );
 return TRUE; 
// return CWnd::OnEraseBkgnd(pDC);
}
 









本文转自 xchsp 51CTO博客,原文链接:http://blog.51cto.com/freebird/88476,如需转载请自行联系原作者

目录
相关文章
|
4月前
微信小游戏制作工具中关于背景图的设置
微信小游戏制作工具中关于背景图的设置
104 0
|
11月前
|
开发工具 UED 开发者
在微信小游戏制作工具中实现各种效果和功能的按钮
在游戏设计中有一个名词叫“反馈”,大体就是指当玩家在进行游戏时,游戏所给予玩家的一些东西,比如常见的在点击按钮时,按钮会变换颜色,或进行缩放,或播放音效等等。总之,不论玩家在游戏中进行任何的操作,游戏都应该给予玩家一个合理的反馈。让玩家能够明白他的操作所获得的结果是什么。
267 0
手把手教你在显示设备上制作一个菜单
**摘要**:程序中菜单的种类与菜单化程序具有明显的优势,程序的实现方式通常有两种:&lt;u&gt;一种是基于命令行方式,即通过输入指令驱动程序实现相应的功能;二是基于菜单方式,即通过选择不同的菜单实现程序的不同功能。&lt;/u&gt;前者的最大缺点是必须精确掌握指令,对操作者而言,它不是十分方便;后者,则只要通过选择不同的菜单项,就可以实现不同的功能,因此,它便于操作,成为程序实现的主流方式。
156 0
手把手教你在显示设备上制作一个菜单
|
JavaScript 安全 Windows
制作网站快捷方式
制作网站快捷方式
98 0
制作网站快捷方式
GLS-高度表制作
文章目录 制作高度计 目的 配置工作环境 Object的设计 创建背光板(Bezel) 创建电动/气动开关 创建气压设定旋钮 创建高度计指针 创建高度计的里程表 创建气压计表 创建电动/气动显示标识 创建仪表的阴影 编译测试 代码开发 添加测试属性 添加属性来处理Altitude和Barometer Initialize Calculate 添加效用函数的头文件. Object的回调
173 0
GLS-高度表制作
|
Android开发
【请教问题】kanzi如何实现类似安卓手机桌面滑动切换界面效果?
目前想用kanzi实现类似安卓手机的左右滑动切换桌面的效果。尝试了以下两种方法都没有实现。 方法一: 仿造例子程序album切换效果,将Trajectory List Box 3D中切换改为AngleTrajectory方式,可以实现切换,但是两个图片的间距太大,设置spacing参数到最小也还是有间距。
1194 0
|
存储 Shell
制作开机动画
前言:产品爆出开机动画不流畅的bug,于是和美工切了108个罗汉来,接下来就要看一下如何制作开机动画了 1.建立三个文件夹 temp_bootanimation.
1072 0