请教Maskblt函数问题

bojinyu 2003-01-23 09:11:08
MaskBlt函数中的前景和背景分别是什么,是SourceDC和DestinationDC吗?
我希望MaskBM中白色部分对应的SourceDC被复制到DestinationDC,而黑色部分对应的不要复制,保持DestinationDC的原有内容。MaskBlt的最后一个参数使用SRCCOPY或MAKEROP4(SRCCOPY,SRCCOPY)结果都不对。
请高手帮忙!
...全文
194 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hurry2002 2003-04-14
  • 打赏
  • 举报
回复
mark
guotuofeng 2003-01-28
  • 打赏
  • 举报
回复
下面是我的代码,可以:
CDC* pDC = GetDC();
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap Bitmap1,Bitmap2,Bitmap3;
Bitmap2.LoadBitmap(IDB_BITMAP_MASK);
Bitmap1.LoadBitmap(IDB_BITMAP1);
BITMAP bitmap;
Bitmap1.GetBitmap(&bitmap);

MemDC.SelectObject(&Bitmap1);
pDC->MaskBlt(0,0,bitmap.bmWidth,bitmap.bmHeight,&MemDC,0,0,Bitmap2,0,0,0xAACC0000 );
ReleaseDC(pDC);

其中:IDB_BITMAP_MASK为2值MASK位图ID,IDB_BITMAP1为位图ID
bojinyu 2003-01-27
  • 打赏
  • 举报
回复
按上面代码,加上TransparentBlt结果就对了。
不过想想这个步骤总该可以去掉。
bojinyu 2003-01-27
  • 打赏
  • 举报
回复
是2值图了,代码片断如下:
if(mTransparence==100)break;

if(!mMeta2DList.empty())
{
//保留色块网格区设备坐标
RECT ShadedRect=mDrawRec;
LPtoDP(pDrawInfo->hDC,(LPPOINT)&ShadedRect,2);
if(ShadedRect.right <ShadedRect.left) //规则化
{
LONG temp=ShadedRect.right;
ShadedRect.right=ShadedRect.left;
ShadedRect.left=temp;
}
if(ShadedRect.bottom<ShadedRect.top)
{
LONG temp=ShadedRect.top;
ShadedRect.top =ShadedRect.bottom ;
ShadedRect.bottom =temp;
}
IntersectRect(&ShadedRect,&ShadedRect,&pDrawInfo->ClientRec); //需要绘图的范围

//准备画布
HDC hTransDC;
HBITMAP hTransBM,hOldBitMap;

hTransDC=CreateCompatibleDC(pDrawInfo->hOriginalDC);
hTransBM=CreateCompatibleBitmap(pDrawInfo->hOriginalDC,
pDrawInfo->ClientRec.right,
pDrawInfo->ClientRec.bottom);
hOldBitMap=(HBITMAP)::SelectObject(hTransDC,hTransBM);

SetGraphicsMode(hTransDC,pDrawInfo->GraphicsMode);
SetWorldTransform(hTransDC,&pDrawInfo->WorldTrans);
SetMapMode(hTransDC,pDrawInfo->MapMode);
SetViewportOrgEx(hTransDC,pDrawInfo->OriPt.x,pDrawInfo->OriPt.y,NULL);

LOGBRUSH logBrushBackground;
logBrushBackground.lbColor=mShadedInvalidClr;
logBrushBackground.lbStyle=BS_SOLID;
HBRUSH hBackGroundBrush;

hBackGroundBrush=CreateBrushIndirect(&logBrushBackground); //使用mShadedInvalidClr填充画布
::FillRect(hTransDC,&mDrawRec,hBackGroundBrush);
::DeleteObject(hBackGroundBrush);

hOldDCBrush=(HBRUSH)SelectObject(hTransDC,::CreateSolidBrush(RGB(0,0,0))); //保留原画刷
hOldDCPen=(HPEN)SelectObject(hTransDC,CreatePen(PS_SOLID,NULL,mDefaultClr));

//遮罩
HDC hMaskDC;
HBITMAP hMaskBM,hOldMaskBitMap;
HPEN hOldMaskPen;
HBRUSH hOldMaskBrush;
HRGN hRGN,hOldRGN;

hMaskDC=CreateCompatibleDC(pDrawInfo->hDC);
hMaskBM=::CreateBitmap(pDrawInfo->ClientRec.right,
pDrawInfo->ClientRec.bottom,
1,1,NULL);
hOldMaskBitMap=(HBITMAP)::SelectObject(hMaskDC,hMaskBM);

SetGraphicsMode(hMaskDC,pDrawInfo->GraphicsMode);
SetWorldTransform(hMaskDC,&pDrawInfo->WorldTrans);
SetMapMode(hMaskDC,pDrawInfo->MapMode);
SetViewportOrgEx(hMaskDC, pDrawInfo->OriPt.x,pDrawInfo->OriPt.y,NULL);
::SetWindowExtEx(hMaskDC,
ShadedRect.right-ShadedRect.left,
ShadedRect.bottom-ShadedRect.top,
NULL);


RECT Clip={115000,40000,125000,35000}; //剪裁区
::LPtoDP(hMaskDC,(LPPOINT)&Clip,2);
hRGN=::CreateRectRgnIndirect(&Clip);
//SelectObject(hMaskDC,hRGN);
::DeleteObject(hRGN);

hOldMaskBrush=(HBRUSH)SelectObject(hMaskDC,::GetStockObject(BLACK_BRUSH)); //保留原画刷
hOldMaskPen=(HPEN)SelectObject(hMaskDC,::GetStockObject(BLACK_PEN));


//画图
index=mMeta2DList.begin();
while(index!=mMeta2DList.end())
{
//画图板上
HBRUSH hNewBrush=CreateSolidBrush((*index).GetColor());
if(hNewBrush!=NULL)
{
HBRUSH hOldBrush=(HBRUSH)SelectObject(hTransDC,hNewBrush);
DeleteObject(hOldBrush);

}
HPEN hNewPen=CreatePen(PS_SOLID,NULL,(*index).GetColor());
if(hNewPen!=NULL)
{
HPEN hOldPen=(HPEN)SelectObject(hTransDC,hNewPen);
DeleteObject(hOldPen);
}
::Polygon(hTransDC,(*index).GetpPoints(),(*index).GetPointCount());

//遮罩上
if((*index).GetColor()==mShadedInvalidClr)
{
SelectObject(hMaskDC,::GetStockObject(BLACK_PEN));
SelectObject(hMaskDC,::GetStockObject(BLACK_BRUSH));
}
else
{
SelectObject(hMaskDC,::GetStockObject(WHITE_PEN));
SelectObject(hMaskDC,::GetStockObject(WHITE_BRUSH));
}
::Polygon(hMaskDC,(*index).GetpPoints(),(*index).GetPointCount());

//
index++;
}

//恢复画刷
hOldDCBrush=(HBRUSH)SelectObject(hTransDC,hOldDCBrush);
hOldDCPen=(HPEN)SelectObject(hTransDC,hOldDCPen);
DeleteObject(hOldDCBrush);
DeleteObject(hOldDCPen);

SelectObject(hMaskDC,hOldMaskBrush);
SelectObject(hMaskDC,hOldMaskPen);



//各DC坐标系设置
INT PreHDC;
PreHDC=SaveDC(pDrawInfo->hDC); //pDrawInfo->hDC
::SetWorldTransform(pDrawInfo->hDC,&NormailWorldTrans);
::SetMapMode(pDrawInfo->hDC,MM_TEXT);
::SetViewportOrgEx(pDrawInfo->hDC,0,0,NULL);

::SetWorldTransform(hTransDC,&NormailWorldTrans); //hTransDC
::SetMapMode(hTransDC,MM_TEXT);
::SetViewportOrgEx(hTransDC,0,0,NULL);


::SetWorldTransform(hMaskDC,&NormailWorldTrans); //hMaskDC
::SetMapMode(hMaskDC,MM_TEXT);
::SetViewportOrgEx(hMaskDC,0,0,NULL);

//中间画布,将pDrawInfo->hDC内容和hTransDC内容透明叠加
HDC hTempDC;
HBITMAP hTempBM,hOldTempBitMap;

hTempDC=CreateCompatibleDC(pDrawInfo->hOriginalDC);
hTempBM=CreateCompatibleBitmap(pDrawInfo->hOriginalDC,
pDrawInfo->ClientRec.right,
pDrawInfo->ClientRec.bottom);
hOldTempBitMap=(HBITMAP)::SelectObject(hTempDC,hTempBM);

if(mTransparence!=0)
{
//透明处理

BOOL OK=::BitBlt(hTempDC,
ShadedRect.left,
ShadedRect.top,
ShadedRect.right-ShadedRect.left,
ShadedRect.bottom-ShadedRect.top,
pDrawInfo->hDC,
ShadedRect.left,
ShadedRect.top,
SRCCOPY
); //先复制pDrawInfo->hDC内容到hTempDC

::AlphaBlend(hTempDC,
ShadedRect.left,
ShadedRect.top,
ShadedRect.right-ShadedRect.left,
ShadedRect.bottom-ShadedRect.top,
hTransDC,
ShadedRect.left,
ShadedRect.top,
ShadedRect.right-ShadedRect.left,
ShadedRect.bottom-ShadedRect.top,
blend);//透明叠加
}
else
{
//如果不透明,直接复制,提高性能
::BitBlt(hTempDC,
ShadedRect.left,
ShadedRect.top,
ShadedRect.right-ShadedRect.left,
ShadedRect.bottom-ShadedRect.top,
hTransDC,
ShadedRect.left,
ShadedRect.top,
SRCCOPY
); //先复制pDrawInfo->hDC内容到hTempDC
}

::MaskBlt(hTransDC,
ShadedRect.left,
ShadedRect.top,
ShadedRect.right-ShadedRect.left,
ShadedRect.bottom-ShadedRect.top,
hTempDC,
ShadedRect.left,
ShadedRect.top,
hMaskBM,
ShadedRect.left,
ShadedRect.top,
//MAKEROP4(SRCCOPY,SRCCOPY) //?是否可以组合出好的值,使TransparentBlt不必调用
SRCCOPY
//0xAACC0000
); //拷贝需要部分到pDrawInfo->hDC

// DWORD LastErr;
// LastErr=::GetLastError();
::TransparentBlt(pDrawInfo->hDC,
ShadedRect.left,
ShadedRect.top,
ShadedRect.right-ShadedRect.left,
ShadedRect.bottom-ShadedRect.top,
hTransDC,
ShadedRect.left,
ShadedRect.top,
ShadedRect.right-ShadedRect.left,
ShadedRect.bottom-ShadedRect.top,
mShadedInvalidClr
);

RestoreDC(pDrawInfo->hDC,PreHDC);

SelectObject(hTempDC,hOldTempBitMap);
DeleteObject(hTempBM);
DeleteObject(hTempDC);

SelectObject(hTransDC,hOldBitMap);
DeleteObject(hTransBM);
DeleteObject(hTransDC);

SelectObject(hMaskDC,hOldMaskBitMap);
DeleteObject(hMaskBM);
DeleteObject(hMaskDC);
}
guotuofeng 2003-01-27
  • 打赏
  • 举报
回复
你的MASK图象是2值图吗,黑白图有时不是2值图,将mask位图变为2值图试试
bojinyu 2003-01-26
  • 打赏
  • 举报
回复
guotuofeng,你说的方法不行 ^_^
guotuofeng 2003-01-24
  • 打赏
  • 举报
回复
MaskBlt的前景指的是SourceDC,背景指的是DestDC.
你可以将下面这个参数作为最后一个参数即可实现你要的效果:
0xAACC0000
nik_Amis 2003-01-23
  • 打赏
  • 举报
回复
up

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧