桌面精灵制作解析

本文涉及的产品
公共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,如需转载请自行联系原作者

目录
相关文章
|
8月前
微信小游戏制作工具中关于背景图的设置
微信小游戏制作工具中关于背景图的设置
233 0
|
C#
WPF中桌面屏保的制作(主要代码)
原文:WPF中桌面屏保的制作(主要代码) 制作要点:(1) 使用System.Windows.Threading.DispatcherTimer;(2) 将Window属性设置为:      this.WindowState = WindowState.Maximized;      this.WindowStyle = WindowStyle.None;      this.ResizeMode = ResizeMode.NoResize;(3) 按ESC键时,关闭窗口。
848 0
|
前端开发
精美高清壁纸:2014年1月桌面日历壁纸免费下载
  告别2013,迎接2014,祝大家在新的一年里,马到成功。这篇文章向大家分享一组精美的2014年1月桌面日历壁纸供大家免费下载。这些高清日历桌面壁纸都是精心挑选的,赶紧挑选一张为你的桌面换上吧。 您可能感兴趣的相关文章 2013年高清新年桌面壁纸免费下载 20款精美的2013年元旦桌...
1437 0
|
Web App开发 iOS开发
23套新鲜出炉的网站和手机界面 PSD 素材
  Web 用户界面,移动用户界面和线框套件对设计师很有用,因为这些套件让他们使用快速和有效的方式复制用户界面。这些类型的工具包提供了一个基本的用户界面元素,用于它们需要制作的网站或软件模型。   在这篇文章中,我们展示的是自由和清新的 UI 设计素材套件。
1014 0
高清精美壁纸:2013年12月桌面日历壁纸免费下载
  光阴似箭,日夜如梭,不知不觉又快到十二月了。桌面壁纸是电脑桌面所使用的背景图片,可以根据大小和分辨率来做相应调整。 壁纸让我们的电脑看起来更好看,更漂亮,更有个性。   这篇文章向大家分享一组精美的2013年12月桌面日历壁纸供大家免费下载。
1570 0
|
前端开发 Shell
精品素材:15套免费的 Photoshop 自定义图形集
  网上到处都是 Photoshop 笔刷,图案,纹理素材,最缺少的就是 Photoshop 形状。寻找定制的 Photoshop 形状是真的很难,因为很少有人提供这样的 Photoshop 形状的集合。
1139 0
|
前端开发
高清精美壁纸:2013年11月桌面日历壁纸免费下载
  十一月是属于秋的季节,大自然的颜色在这个特殊的时节神奇变化。进入秋季,太阳高度角渐低,温度渐降;秋风送爽、炎暑顿消、硕果满枝、田野金黄。这篇文章向大家分享一组精美的2013年11月桌面日历壁纸供大家免费下载。
992 0
|
前端开发
高清精美壁纸:2013年10月桌面日历壁纸免费下载
  十月应该是一年中除了春节外最让人期待月份了。这个月有让上班族们期盼的国庆长假,可以外出好好玩一番。十月天气也逐渐转凉,非常舒适。   这篇文章向大家分享一组精美的2013年10月桌面日历壁纸供大家免费下载。
904 0
高清精美壁纸:2013年9月桌面日历壁纸免费下载
  按照罗马旧历,March 为第一个月,September 就是第七个月。September 这一名称源自意为“七”的拉丁文 septem。当罗马人采用了儒略历之后,他们保留了原先的好几个月名,September 就成了“九月”。
994 0