问: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();
}
根据我的经验,想直接用API来实现CE下的不规则窗体,是不可能的.
使用DDraw还有点希望