我们有时候需要将窗体设置成异形(四边不规则透明部分),使得软件看起来比较个性;
一般是将背景设置成某种透明色,然后计算出透明色的区域;但是当窗体大小改变的时候,我们又需要去计算透明区域,感觉消耗CPU相当大,
问有没有高效的计算方式,或者其他更好的实现方式来处理?
帮忙看看有没有更好的算法?
下面是目前测试的算法,似乎不太好用:
//参数:pDC为绘制窗体背景的图像
void CMyDialog::CalcateWindowRgn(CDC *pDC)
{
static CRect rcClient; static COLORREF col = RGB(255,0,0);  //红色部分为透明部分 GetWindowRect(rcClient);
static CRect rtWnd;
rtWnd = rcClient;
rcClient.OffsetRect(-rcClient.TopLeft());

        //CRgn m_rgn;                       //在类里面定义成成员变量
m_rgn.DeleteObject();
m_rgn.CreateRectRgn(0, 0, rcClient.Width(), rcClient.Height()); //根据边框的区域计算四周的透明区域
int xBegin, xEnd,yBegin,yEnd, x, y;
CRgn rgnTmp; rgnTmp.CreateRectRgn(0,0, 1, 1); //左边边框区域-L
xBegin = 0;
yBegin = 0;
xEnd = nLeftBorder;           //左边边框的宽度
yEnd = rcClient.Height();
for (y=yBegin; y<yEnd; y++)
{
for (x=xBegin; x<xEnd; x++)
{
// If this pixel is transparent
if (pDC->GetPixel(x,y)==col)
{
rgnTmp.SetRectRgn(x,y, x+1, y+1);
m_rgn.CombineRgn(&m_rgn, &rgnTmp, RGN_DIFF);
}
}
} //上边边框区域-T
xBegin = 0;
yBegin = 0;
xEnd =rcClient.Width();
yEnd = nTopBorder;     //上边边框的宽度
for (y=yBegin; y<yEnd; y++)
{
for (x=xBegin; x<xEnd; x++)
{
// If this pixel is transparent
if (pDC->GetPixel(x,y)==col)
{
rgnTmp.SetRectRgn(x,y, x+1, y+1);
m_rgn.CombineRgn(&m_rgn, &rgnTmp, RGN_DIFF);
}
}
} //下边,右边的计算方式同上,省略.....
rgnTmp.DeleteObject();
}

解决方案 »

  1.   

    用WS_EX_LAYERDWINDOW屬性,然后SetLayerdWindowAttribute來搞異形窗體把需要扣掉的區域用同一種特殊的顏色來填充。然后指定SetLayerdWindowAttribute把這種顏色區域設置為完全透明。
      

  2.   

    允许调整尺寸的异型窗口一般都是四个角是不规则,调整尺寸时这四个角是不变的,因此可以记录其RGN,然后和新的中间区域(一般是矩形)COMBIN起来就行了。
      

  3.   

    OMG
    CDC::GetPixel ?
    这效率低到东非大裂谷了
      

  4.   

    不要用GetPixel..
    不要传CDC *进来..
    太慢了传个CBitmap *进来比较好,用CBitmap::GetBitmapBits进行内存比较