VC游戏开发图片镂空

一、原理:

   1.使用Bitblt函数将“屏蔽图”与背景图作AND运算.贴到目的地的DC中.

   2.镂空的图与背景图作OR运算。贴到目的地的DC中

     效果如图所示,中间的人物就是通过镂空添加上去的。

效果图

 

 

 

 

 

 

 

 

(屏蔽图)

    屏蔽中间人物为黑色,屏蔽图与背景图作And运算

              000000---------------屏蔽图中的黑色部分

           (and)      110010---------------背景图中的色彩

            _____________________________

             000000----------------最后变成黑色

   屏蔽四周为白色,与背景图做AND运算:

             111111----------------屏蔽图中的白色部分

        (and)   110010----------------背景图中的色彩

                               ------------------------------------------

             110010-----------------对原来背景图没有影响,

   将镂空的图与背景图做OR运算

      图片人物为彩色

                                    011101-----------------人物图的色彩 屏蔽图中的彩色人物

          (OR) 000000-----------------背景图中的黑色部分

            ---------------------------

              011101------------------黑色部分变成彩色人物的颜色

        图片人物为黑色

                                  000000------------------人物图案四周的黑色部分。

                       (OR)    110010------------------背景图的色彩

                                  --------------------------

                                  110010-------------------背景图中的色彩.

Frame::Frame()
{
	Create(NULL,"绘图窗口");
	CClientDC dc(this);
	int width = dc.GetDeviceCaps(HORZRES);
	int height = dc.GetDeviceCaps(VERTRES);
	GetWindowRect( &rect );
	width = ( width - ( rect.right - rect.left ))/2 ;
	height = (height - (rect.bottom - rect.top ))/2 ;
	MoveWindow( width , height , (rect.right - rect.left ) , (rect.bottom - rect.top ) ,true);
	GetClientRect(&rect); 
	mdc = new CDC;        //建立一内存DC mdc
	bitmap = new CBitmap; //建立源位图
	bgbmp = new CBitmap;  //建立背景图
	mdc->CreateCompatibleDC(&dc); //将mdc转换成与dc相容的DC
	bgbmp->m_hObject = (HBITMAP)::LoadImage(NULL,"bground.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE); //载入背景图文件
	bitmap->m_hObject = (HBITMAP)::LoadImage(NULL,"man.bmp",IMAGE_BITMAP,208,154,LR_LOADFROMFILE); //载入来源位图文件
}

Frame::~Frame()
{
	delete mdc;
	delete bitmap; 
	delete bgbmp;
}


BEGIN_MESSAGE_MAP(Frame, CFrameWnd)
	//ON_WM_CREATE()
	ON_WM_PAINT()
	//ON_LBN_SELCHANGE(ID_LIST,OnSelChange)
END_MESSAGE_MAP()


// Frame 消息处理程序


void Frame::OnPaint()
{
	CPaintDC dc(this);         //建立响应WM_PAINT消息的DC
	mdc->SelectObject(bgbmp);  //取得背景图
	dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY); //贴上背景图
	mdc->SelectObject(bitmap); //取得源位图
	dc.BitBlt(500,300,104,154,mdc,104,0,SRCAND); 
	//将屏蔽与背景图做AND运算
	dc.BitBlt(500,300,104,154,mdc,0,0,SRCPAINT);
	//将要透空的图与背景图做OR运算 
}

  

   

原文地址:https://www.cnblogs.com/WilliamJiang/p/2225313.html