zoukankan      html  css  js  c++  java
  • 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运算 
    }
    

      

       

  • 相关阅读:
    数据库存储过程分页
    C#.net随机数函数
    文件下载文件名兼容中英文空格
    win7安装SQL2005出现29506错误
    SQL2008清空日志文件
    C#数字类型输出字符串时保留指定小数位数的方法
    对.NET中导出数据到EXCEL的几种方法探讨
    六种删除数据库重复行的方法 .
    修改表联合主键
    增加联合主键
  • 原文地址:https://www.cnblogs.com/WilliamJiang/p/2225313.html
Copyright © 2011-2022 走看看