桌面精灵制作解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介:
最近一直在做一个涉及到很多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月前
|
前端开发 JavaScript 测试技术
如何制作网页
创建自己的网站涉及多个步骤,从确定主题到最终测试和发布。本文详细介绍了每个步骤:首先明确网站目的和受众;其次设计直观易用的布局;选择符合主题的颜色和字体;撰写清晰简洁的内容;优化加载速度;全面测试功能和兼容性;选择托管服务并注册域名;最后通过SEO、社交媒体和广告进行推广。注意事项包括关注用户体验、学习基本编码知识,并考虑网站的扩展性和可维护性。遵循这些步骤,你将能创建一个美观且实用的网站。
|
9月前
微信小游戏制作工具中关于背景图的设置
微信小游戏制作工具中关于背景图的设置
262 0
|
关系型数据库 MySQL 应用服务中间件
通过cpolar分享本地电脑上有趣的照片:部署piwigo网页轻松向游友分享照片。
我们可以使用cpolar+piwigo的组合,只需在游戏聊天框粘贴一个网址,就能轻松向游友分享照片。
 通过cpolar分享本地电脑上有趣的照片:部署piwigo网页轻松向游友分享照片。
|
iOS开发
如何制作游戏微端
如何制作游戏微端
134 0
|
Ubuntu Linux Shell
buntu 20.04桌面美化
buntu 20.04桌面美化
204 0
|
Java 开发工具 C++
电脑技巧:推荐一款非常棒的截图软件X-Snip
X-Snip是一款可以解决不同类型用户在不同场景下使用截图工具时所面临的问题,并且适配了所有的Windows版本系统,整个软件只有一个exe文件,不涉及任何依赖项。
电脑技巧:推荐一款非常棒的截图软件X-Snip
|
数据可视化 程序员 开发者
零基础如何自己制作游戏?
首先我们来看一下这个问题本身,能问出这个问题的基本上就是新手,小白,零基础,对于游戏开发这个领域没有任何的了解的人。为什么这么说呢?因为只有当你对于一个领域没有任何了解的时候,才会问出这么宽泛的问题。 所以你看,但凡问那种很宽泛的问题的,基本上都是对于这个领域没有任何了解的,也就是新手小白。但是新手小白也没有什么可丢人的,毕竟谁在接触一个新领域的时候不是新手小白呢?
362 0
|
前端开发 定位技术 图形学
Unity3D制作塔防类游戏
Unity3D制作塔防类游戏
|
机器学习/深度学习 人工智能 算法
photoshop2023永久电脑版下载 一款强大的图片创意编辑工具
说到Adobe相信大家最熟悉的就是ps了,因此今日为大家介绍下ps2023全称为photoshop2023,这是一款强大的图片创意编辑工具,全新的ps2023与上个版本相比,该版本为大家带来了更多的新功能及优化,例如添加了一个“Neural Gallery”的滤镜功能,而翻译为中文就是神经画廊滤镜,也许听名字感觉很奇妙,但根据功能来说,其叫做神经网络智能滤镜(AI滤镜)比较合适,它应该是利用人工神经网络算法,根据图片内容进行智能修饰,让修图变得更加简单。另外,在ps2023这种还提供了一个自动抠天空和替换天空功能,
261 0
|
移动开发 前端开发 JavaScript
Dreamweaver制作网页的步骤
Dreamweaver软件制作网页的步骤
232 0