社区
图形处理/算法
帖子详情
请教Maskblt函数问题
bojinyu
2003-01-23 09:11:08
MaskBlt函数中的前景和背景分别是什么,是SourceDC和DestinationDC吗?
我希望MaskBM中白色部分对应的SourceDC被复制到DestinationDC,而黑色部分对应的不要复制,保持DestinationDC的原有内容。MaskBlt的最后一个参数使用SRCCOPY或MAKEROP4(SRCCOPY,SRCCOPY)结果都不对。
请高手帮忙!
...全文
213
8
打赏
收藏
请教Maskblt函数问题
MaskBlt函数中的前景和背景分别是什么,是SourceDC和DestinationDC吗? 我希望MaskBM中白色部分对应的SourceDC被复制到DestinationDC,而黑色部分对应的不要复制,保持DestinationDC的原有内容。MaskBlt的最后一个参数使用SRCCOPY或MAKEROP4(SRCCOPY,SRCCOPY)结果都不对。 请高手帮忙!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
API之网络
函数
---整理网络
函数
及功能
API之网络
函数
1. API之网络
函数
WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一...
symbian中的画图的基本操作
可以使用`CFbsBitmap`的`
Mask
Blt
()`
函数
进行遮罩操作,它允许将一个源位图与目标位图的指定区域进行按位“与”运算,实现部分透明或不透明的效果。如果需要创建复杂的遮罩,可以使用`CFbsBitmap
Mask
`类。 3. 简单...
D1-H_Linux_G2D_开发指南1
- **三元光栅操作 (
mask
blt
rop3)**:结合掩码进行更复杂的像素操作,如部分透明、混合等。 - **相关术语介绍**:包括硬件和软件两方面,解释了与G2D模块相关的专业术语,帮助读者理解其工作原理。 3. **模块...
CImage类的简单说明[文].pdf
CImage类是MFC库提供的一种用于处理图像的类,主要应用于软件开发中进行图形界面的设计和图像操作。本文将详细介绍CImage类的各个成员...然而,在使用过程中需要注意
函数
的具体行为和可能存在的
问题
,以确保正确操作。
CImage类概述[参考].pdf
需要注意的是,由于CImage类在不同版本的Windows操作系统中存在兼容性
问题
,如`Plg
Blt
`和`
Mask
Blt
`仅在Windows NT 4.0或更高版本中可用,而`AlphaBlend`和`Transparent
Blt
`则需要Windows 2000/98或更新的版本。...
图形处理/算法
19,467
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章