桌面精灵制作解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 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 前端开发
使用WbbGPU制作爱心
7月更文挑战第9天
30 0
|
6月前
|
安全 Android开发 数据安全/隐私保护
制作系统签名
五月打卡
52 0
|
11月前
水晶头制作
水晶头制作。
161 44
|
6月前
微信小游戏制作工具中关于背景图的设置
微信小游戏制作工具中关于背景图的设置
208 0
|
Ubuntu Linux Shell
buntu 20.04桌面美化
buntu 20.04桌面美化
183 0
|
机器学习/深度学习 人工智能 算法
photoshop2023永久电脑版下载 一款强大的图片创意编辑工具
说到Adobe相信大家最熟悉的就是ps了,因此今日为大家介绍下ps2023全称为photoshop2023,这是一款强大的图片创意编辑工具,全新的ps2023与上个版本相比,该版本为大家带来了更多的新功能及优化,例如添加了一个“Neural Gallery”的滤镜功能,而翻译为中文就是神经画廊滤镜,也许听名字感觉很奇妙,但根据功能来说,其叫做神经网络智能滤镜(AI滤镜)比较合适,它应该是利用人工神经网络算法,根据图片内容进行智能修饰,让修图变得更加简单。另外,在ps2023这种还提供了一个自动抠天空和替换天空功能,
250 0
|
JavaScript 安全 Windows
GLS-地平仪ADI制作
文章目录 制作ADI 目的 设置工作环境 GL仪表单元开发 创建遮光板 Texture Chooser的省略号按钮 Texture Chooser对话框 纹理的贴图效果 创建ADI Ball 创造一个光源 创建水平bar 编译并运行 代码开发 添加测试属性 添加属性来处理Pitch/Roll 计算 包含glsutil.h的效用函数 编译+运行+测试 包含glsutil.h的效用函数 编译+运行+测试
149 0
GLS-地平仪ADI制作
GLS-高度表制作
文章目录 制作高度计 目的 配置工作环境 Object的设计 创建背光板(Bezel) 创建电动/气动开关 创建气压设定旋钮 创建高度计指针 创建高度计的里程表 创建气压计表 创建电动/气动显示标识 创建仪表的阴影 编译测试 代码开发 添加测试属性 添加属性来处理Altitude和Barometer Initialize Calculate 添加效用函数的头文件. Object的回调
212 0
GLS-高度表制作