void CtryBGDlg::SetupRegion( CDC *pDC, CBitmap &cBitmap, COLORREF TransColor )
{
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap *pOldMemBmp=NULL;
pOldMemBmp=memDC.SelectObject(&cBitmap);
BITMAP bit;
cBitmap.GetBitmap (&bit);
CRgn crRgn, crRgnTmp;
crRgn.CreateRectRgn(0, 0, 0, 0);//创建一个空区域
int iX = 0;int iY = 0;
for (iY = 0; iY < bit.bmHeight; iY++)
{
do
{
//skip over transparent pixels at start of lines.
while (iX <= bit.bmWidth && memDC.GetPixel(iX, iY) == TransColor)
iX++;
//remember this pixel
int iLeftX = iX;
//now find first non transparent pixel
while (iX <= bit.bmWidth && memDC.GetPixel(iX, iY) != TransColor)
++iX;
//create a temp region on this info
crRgnTmp.CreateRectRgn(iLeftX, iY, iX, iY+1);
//combine into main region.
crRgn.CombineRgn(&crRgn, &crRgnTmp, RGN_XOR);
//delete the temp region for next pass (otherwise you'll get an ASSERT)
crRgnTmp.DeleteObject();
}while(iX < bit.bmWidth);
iX = 0;
}
SetWindowRgn(crRgn, TRUE);
iX = (GetSystemMetrics(SM_CXSCREEN))-700;
iY = (GetSystemMetrics(SM_CYSCREEN)) / 2 - (bit.bmHeight / 2);
SetWindowPos(&wndTop, iX, iY, bit.bmWidth, bit.bmHeight, NULL);
// Free resources.
memDC.SelectObject(pOldMemBmp);
// Put the original bitmap back (prevents memory leaks)
memDC.DeleteDC();
crRgn.DeleteObject();
}
CBitmap bmp; bmp.LoadBitmapW(IDB_MASK); this->SetupRegion(this->GetWindowDC(),bmp,RGB(0,0,0));
BOOL CtryBGDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rect;
this->GetWindowRect(&rect);
CDC memDC;
CBitmap bmp;
CBitmap *pOldBmp=NULL;
bmp.LoadBitmapW(IDB_INTERFACE);
memDC.CreateCompatibleDC(pDC);
pOldBmp=memDC.SelectObject(&bmp);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,SRCCOPY);
if(pOldBmp)
{
memDC.SelectObject(pOldBmp);
}
return true;
// return CDialog::OnEraseBkgnd(pDC);
}
LRESULT CtryBGDlg::OnNcHitTest(CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rc;
GetClientRect(&rc);
ClientToScreen(&rc);
return rc.PtInRect(point) ? HTCAPTION : CDialog::OnNcHitTest(point);
// return CDialog::OnNcHitTest(point);
}
CRgn crRgn, crRgnTmp;
//创建一个空区域
crRgn.CreateRectRgn(0, 0, 0, 0);
int iX = 0;int iY = 0;
for (iY = 0; iY < bit.bmHeight; iY++)
{
do
{
//skip over transparent pixels at start of lines.
//以一个相素列为单位,找到在这一个相素列中,第一个不是要设为透明相素的点iX。
//然后再找到以这个iX为起点的,在这个一个相素列中最后跟他临近的最后一个不是透明的点。
//然后将他们一起合并到crRgn中。
while (iX <= bit.bmWidth && memDC.GetPixel(iX, iY) == TransColor)
iX++;//在iY和iY+1这个相索列中,第一个不设为透明的点的X坐标
int iLeftX = iX;//保存这个点的坐标
while (iX <= bit.bmWidth && memDC.GetPixel(iX, iY) != TransColor)
++iX;//这是找到在iX最临近的不透明的X坐标
crRgnTmp.CreateRectRgn(iLeftX, iY, iX, iY+1);//这四个点连在一起就是现在刚找到的不透明的区域
//合并区域
crRgn.CombineRgn(&crRgn, &crRgnTmp, RGN_OR);
//记得最终要手动删除crRgnTmp对象
crRgnTmp.DeleteObject();
}while(iX < bit.bmWidth);
//如果iX没有达到图片的末尾,说明还没有枚举完这一行,则在iY和iY+1这个行上,进行下一轮的//枚举
iX = 0;
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有