设为首页 加入收藏

TOP

利用Visual C++编程实现异型窗口(二)
2012-11-04 15:15:39 来源: 作者: 【 】 浏览:363
Tags:利用 Visual 编程 实现 异型 窗口
  有了上述的工作,剩下的核心工作就是根据掩模位图来确定最终显示的位图区域,也就是说,"扣除"的区域将以透明效果显示。下面的代码实现了这一功能:

/////////////////////////////////////////////////////////////////////////////
// 获得窗体矩形
CRect rectWnd;
this->GetWindowRect(rectWnd);
// 读取"掩模"位图资源
CBitmap myBitmap,*pOldBitmap;
myBitmap.LoadBitmap(nMaskId);
// 创建"内存一致"设备
CDC memDC;
memDC.CreateCompatibleDC(pDC);
// 选择绘图设备
pOldBitmap = memDC.SelectObject(&myBitmap);
// 创建窗体的初始区域
CRgn rgnWnd,rgnTemp;
rgnWnd.CreateRectRgn(0,0,rectWnd.Width(),rectWnd.Height());
int nWidth,nHeight;
COLORREF color;
//下面的两层循环为检查背景位图象素颜色,进行透明区域处理;
//当象素颜色为指定的透明值时,即将该点从区域中剪裁掉。
for (nWidth = 0;nWidth <= rectWnd.Width()-1;nWidth++)
{
 for (nHeight = 0;nHeight <= rectWnd.Height();nHeight++)
 {
  color = memDC.GetPixel(nWidth,nHeight);
  // 当象素是白色时,去掉该点
  if (color == RGB(255,255,255))
  {
   //象素颜色为指定的透明色,创建透明"微区域"
   rgnTemp.CreateRectRgn(nWidth,nHeight,nWidth+1,nHeight+1);
   //"扣像",从完整的区域中"扣除"透明的"微区域"
   rgnWnd.CombineRgn(&rgnWnd,&rgnTemp,RGN_XOR);
   //删除刚创建的透明"微区域",释放系统资源
   rgnTemp.DeleteObject();
  }
 }
}
memDC.SelectObject(pOldBitmap);
SetWindowRgn((HRGN)rgnWnd,TRUE); //用最终设定窗口的显示区域为指定区域

  为了最终显示透明效果的窗体,还需要重置系统默认的背景擦除操作,即添加WM_ERASEBKGND消息处理过程,在其中实现背景位图的显示功能,这一步可以借助ClassWizard来实现。

  四、小结

  这种异形窗口的创建方法适应于所有的基于CWnd类的派生窗口,采用这一方法,读者朋友可以创建出任何只要你能够画出的窗体。我想微软提供的"Agent"(精灵)也只不过是在此基础上增添了更复杂的动作、声音处理罢了,相信读者朋友也可以在此基础上实现自己的"Agent"。


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Visual C++编程实现全屏幕显示 下一篇DirectShow组件原理分析及应用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: