| 
 | 
 
 
 楼主 |
发表于 2005-9-28 11:31:51
|
显示全部楼层
 
 
 
< >  </P> 
< >图二、项目中用到的图像资源</P> 
< >有了上述的工作,剩下的核心工作就是根据掩模位图来确定最终显示的位图区域,也就是说,"扣除"的区域将以透明效果显示。下面的代码实现了这一功能:<BR> 
<TABLE width="100%" bgColor=#ffffff> 
<TBODY> 
<TR> 
<TD>/////////////////////////////////////////////////////////////////////////////<BR>// 获得窗体矩形 <BR>CRect rectWnd;<BR>this->GetWindowRect(rectWnd);<BR>// 读取"掩模"位图资源<BR>CBitmap myBitmap,*pOldBitmap;<BR>myBitmap.LoadBitmap(nMaskId);<BR>// 创建"内存一致"设备<BR>CDC memDC;<BR>memDC.CreateCompatibleDC(pDC);<BR>// 选择绘图设备<BR>pOldBitmap = memDC.SelectObject(&myBitmap);<BR>// 创建窗体的初始区域<BR>CRgn rgnWnd,rgnTemp;<BR>rgnWnd.CreateRectRgn(0,0,rectWnd.Width(),rectWnd.Height());<BR>int nWidth,nHeight;<BR>COLORREF color; <BR>//下面的两层循环为检查背景位图象素颜色,进行透明区域处理;<BR>//当象素颜色为指定的透明值时,即将该点从区域中剪裁掉。<BR>for (nWidth = 0;nWidth <= rectWnd.Width()-1;nWidth++)<BR>{<BR> for (nHeight = 0;nHeight <= rectWnd.Height();nHeight++)<BR> {<BR>  color = memDC.GetPixel(nWidth,nHeight);<BR>  // 当象素是白色时,去掉该点<BR>  if (color == RGB(255,255,255))<BR>  {<BR>   //象素颜色为指定的透明色,创建透明"微区域"<BR>   rgnTemp.CreateRectRgn(nWidth,nHeight,nWidth+1,nHeight+1);<BR>   //"扣像",从完整的区域中"扣除"透明的"微区域"<BR>   rgnWnd.CombineRgn(&rgnWnd,&rgnTemp,RGN_XOR);<BR>   //删除刚创建的透明"微区域",释放系统资源<BR>   rgnTemp.DeleteObject(); <BR>  }<BR> }<BR>}<BR>memDC.SelectObject(pOldBitmap);<BR>SetWindowRgn((HRGN)rgnWnd,TRUE); //用最终设定窗口的显示区域为指定区域</TD></TR></TBODY></TABLE><BR>  为了最终显示透明效果的窗体,还需要重置系统默认的背景擦除操作,即添加WM_ERASEBKGND消息处理过程,在其中实现背景位图的显示功能,这一步可以借助ClassWizard来实现。<BR><BR>  四、小结<BR><BR>  这种异形窗口的创建方法适应于所有的基于CWnd类的派生窗口,采用这一方法,读者朋友可以创建出任何只要你能够画出的窗体。我想微软提供的"Agent"(精灵)也只不过是在此基础上增添了更复杂的动作、声音处理罢了,相信读者朋友也可以在此基础上实现自己的"Agent"。 <BR></P> |   
 
 
 
 |