我们有时候需要将窗体设置成异形(四边不规则透明部分),使得软件看起来比较个性;
一般是将背景设置成某种透明色,然后计算出透明色的区域;但是当窗体大小改变的时候,我们又需要去计算透明区域,感觉消耗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();
}
解决方案 »
- 在另外一个编译器打开
- 程序里只设置了一个钩子函数,钩子函数为什么会处理两次?
- 在windows下完成端口的最大连接数是多少
- MFC怎么做控件类的DLL,怎么用?
- 如何获取线程弹出的对话框的字符串并销毁这个线程呢?
- 求助~~~~~~~~求助~~~~~~~~~~求助~~~~~~~~求助~~~~~~~~~~!!!!
- mfc为何要注册DefWindowProc然后又改为用AfxWndProc()分发消息?
- ShockwaveFlash(flash控件):怎样设置flash动画在flash控件的中间,或充满flash 控件
- VC网络传输数据集?
- MFC 中实现菜单项的部分隐藏?
- 类的设计问题,高内聚低耦合 怎么处理 谢谢
- 怎么把静态库包装成动态库
CDC::GetPixel ?
这效率低到东非大裂谷了
不要传CDC *进来..
太慢了传个CBitmap *进来比较好,用CBitmap::GetBitmapBits进行内存比较