EVC(wince)如何开发不规则窗体(请成功过的朋友指教)?

lsgl   2010-6-11 13:40 楼主
问:EVC(wince)如何开发不规则窗体?
请成功过的朋友指教,我现在的问题是使用SetWindowRgn这类区域方法后可以不规则窗体。
但窗体上的按钮等控件都不都使用。效果就好象是将窗体不规则后直接截了个图然后复制到桌面一样。
请指教!

注:请不要将windows下VC的实现直接说给我,因为它们在wince下不一定好用!下面的代码是就网上出现的很多的代码,
windows下可以正常使用,但wince下是就会出问题!求在CE下真正实现过的朋友指点。

代码如下:


void CTwidowsDlg::SetupRegion(CDC *pDC, CBitmap &cBitmap, COLORREF TransColor)
{
  CDC memDC;
  //创建与传入DC兼容的临时DC
  memDC.CreateCompatibleDC(pDC);
   
  CBitmap *pOldMemBmp=NULL;
  //将位图选入临时DC
  pOldMemBmp=memDC.SelectObject(&cBitmap);
   
  CRgn wndRgn;
  //创建总的窗体区域,初始region为0
  wndRgn.CreateRectRgn(0,0,0,0);

  BITMAP bit;   
  cBitmap.GetBitmap (&bit);//取得位图参数,这里要用到位图的长和宽   
   
  int y;
  for(y=0;y<=bit.bmHeight;y++)
  {
  CRgn rgnTemp; //保存临时region
   
  int iX = 0;
  do
  {
  //跳过透明色找到下一个非透明色的点.
  while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) == TransColor)
  {
iX++;
}
   
  //记住这个起始点
  int iLeftX = iX;
   
  //寻找下个透明色的点
  while (iX <= bit.bmWidth && memDC.GetPixel(iX, y) != TransColor)
  {
++iX;
}
   
  //创建一个包含起点与重点间高为1像素的临时“region”
  rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);
   
  //合并到主"region".
  wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);
   
  //删除临时"region",否则下次创建时和出错
  rgnTemp.DeleteObject();

  }while(iX
  iX = 0;

  }
   
  if(pOldMemBmp)
{
  memDC.SelectObject(pOldMemBmp);
}
   
  CWnd * pWnd = AfxGetMainWnd();
  pWnd->SetWindowRgn((HRGN)wndRgn.GetSafeHandle(),FALSE);  
//SetWindowPos(wndRgn, TRUE),这就把窗口置成一个圆形了。
  //该函数将创建指定窗口的线程设置到前台
pWnd->SetForegroundWindow();   
}

回复评论 (4)

友情帮顶!

同时我也很感兴趣。
点赞  2010-6-11 13:57
根据我的经验,想直接用API来实现CE下的不规则窗体,是不可能的.

使用DDraw还有点希望
点赞  2010-6-11 17:00
u p
点赞  2010-6-11 17:06
SetWindowRgn
这确实是个问题

点赞  2010-6-13 08:39
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复