镂空和透明效果图

来源:互联网 发布:windows 蓝框 编辑:程序博客网 时间:2024/04/24 02:44

显示镂空和透明效果图

一:加载并显示位图

1:加载位图
HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int CyDesired,UINT fuLoad);
uType:指定被装载图像类型。此参数可以为下列值,其含义如下:IMAGE_BITMAP:装载位图;IMAGE_CURSOR:装载光标;IMAGE_ICON:装载图标。
cxDesired:指定图标或光标的宽度,以像素为单位。
cyDesired:指定图标或光标的高度,以像素为单位。
fuLoad:根据下面复合值列表指定函数值,值含义如下:LR_LOADFROMFILE:根据参数lpszName的值装载图像。若标记未被给定,lpszName的值为资源名称。

2:粘贴位图
BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);
    hdcDest:指向目标设备环境的句柄。
    nXDest:指定目标矩形区域左上角的X轴逻辑坐标。
    nYDest:指定目标矩形区域左上角的Y轴逻辑坐标。
    nWidth:指定源和目标矩形区域的逻辑宽度。
    nHeight:指定源和目标矩形区域的逻辑高度。
    hdcSrc:指向源设备环境的句柄。
    nXSrc:指定源矩形区域左上角的X轴逻辑坐标。
    nYSrc:指定源矩形区域左上角的Y轴逻辑坐标。
    dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。下面是对应光栅操作码:
        BLACKNESS:表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。
        DSTINVERT:表示使目标矩形区域颜色取反。
        MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。
        MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。
        NOTSRCCOPY:将源矩形区域颜色取反,于拷贝到目标矩形区域。
        NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值,然后将合成的颜色取反。
        PATCOPY:将特定的模式拷贝到目标位图上。
        PATPAINT:通过使用布尔OR(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。然后使用OR(或)操作符将该操作的结果与目标矩形区域内的颜色合并。
        PATINVERT:通过使用XOR(异或)操作符将源和目标矩形区域内的颜色合并。
        SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。
        SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。
        SRCERASE:通过使用AND(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并。
        SRCINVERT:通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并。
        SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。
        WHITENESS:使用与物理调色板中索引1有关的颜色填充目标矩形区域。(对于缺省物理调色板来说,这个颜色就是白色)。
CBitmap *bitmap;
CDC *mdc;
canvasFrame::canvasFrame()
{
    RECT rect;
    GetClientRect( &rect);   
    mdc = new CDC;                //建立内存DC对象
    bitmap = new CBitmap;         //建立CBitmap位图对象
    mdc->CreateCompatibleDC(&dc); //将mdc转换成与dc相容的DC
    bitmap->m_hObject = (HBITMAP)::LoadImage(NULL,"bground.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE);
    mdc->SelectObject(bitmap);    //选择位图对象到mdc中
}
void canvasFrame::OnPaint()
{
    CPaintDC dc(this);    //响应WM_PAINT消息的DC
    RECT rect;
    GetClientRect(&rect);
    dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY);
}
最后释放资源
if(mdc) delete mdc;            //释放资源
if(bitmap) delete bitmap;    //释放资源

二:制作镂空效果

背景图A, 屏蔽图B(周边白色,镂空部分黑色),镂空图C(周边黑色)。
canvasFrame::canvasFrame()
{
    mdc = new CDC;        //建立一内存DC mdc
    Abitmap = new CBitmap; //建立源位图
    Bbitmap = new CBitmap; //建立源位图
    Cbitmap = new CBitmap; //建立源位图
    mdc->CreateCompatibleDC(&dc); //将mdc转换成与dc相容的DC
    Abitmap->m_hObject = (HBITMAP)::LoadImage(NULL,"A.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE); //载入背景图文件
    Bbitmap->m_hObject = (HBITMAP)::LoadImage(NULL,"B.bmp",IMAGE_BITMAP,208,154,LR_LOADFROMFILE); //载入来源位图文件
    Cbitmap->m_hObject = (HBITMAP)::LoadImage(NULL,"C.bmp",IMAGE_BITMAP,208,154,LR_LOADFROMFILE); //载入来源位图文件}
    void canvasFrame::OnPaint()
    {
        CPaintDC dc(this);         //建立响应WM_PAINT消息的DC
        mdc->SelectObject(Abitmap);  //取得背景图
        dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY); //贴上背景图
        mdc->SelectObject(Bbitmap);
        dc.BitBlt(250,150,104,154,mdc,104,0,SRCAND);     //将屏蔽与背景图做AND运算
        mdc->SelectObject(Cbitmap);
        dc.BitBlt(250,150,104,154,mdc,0,0,SRCPAINT);    //将要透空的图与背景图做OR运算
    }

    第一步,先将背景图A贴上。
        dc.BitBlt(0,0,rect.right,rect.bottom,mdc,0,0,SRCCOPY); //贴上背景图
    第二步,将背景图A和屏蔽图B进行与运算。由于白色和任何颜色与运算,颜色效果不变,黑色和任何颜色与运算得到的效果是黑色,所以最终效果是有一个镂空的黑色图案。
        dc.BitBlt(250,150,104,154,mdc,104,0,SRCAND);
    第三步,将第二步的结果和C进行或元算。由于任何颜色和黑色或运算都是不变,所以背景不变。要镂空的图也不变。
        dc.BitBlt(250,150,104,154,mdc,0,0,SRCPAINT);

三:制作透明效果。

    mdc = new CDC;       
    bitmap = new CBitmap;
    bgbmp = new CBitmap;
    mdc->CreateCompatibleDC(dc); //建立与dc兼容的DC
    bgbmp->m_hObject = (HBITMAP)::LoadImage(NULL,"bground.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE); //载入背景图
    bitmap->m_hObject = (HBITMAP)::LoadImage(NULL,"girl.bmp",IMAGE_BITMAP,298,329,LR_LOADFROMFILE); //载入源位图
    bitmap->GetObject(sizeof(BITMAP),&bm); //取得bitmap 位图的信息
    double *px = new double[bm.bmHeight*bm.bmWidthBytes]; //声明暂存数组
    bitmap->GetBitmapBits(bm.bmHeight*bm.bmWidthBytes,px); //取得源位图各像素点的RGB 值存入px 数组中
    for(y=0;y<bm.bmHeight;y++)
        for(x=0;x<bm.bmWidth;x++)
        {
            px[x*3+y*bm.bmWidthBytes] = px[x*3+y*bm.bmWidthBytes] *0.5;   //将B 色彩值乘以50%
            px[x*3+1+y*bm.bmWidthBytes] = px[x*3+1+y*bm.bmWidthBytes] *0.5; //将G 色彩值乘以50%
            px[x*3+2+y*bm.bmWidthBytes] = px[x*3+2+y*bm.bmWidthBytes] *0.5; //将R 色彩值乘以50%
        }
    bgbmp->GetObject(sizeof(BITMAP),&bm); //取得bgbmp 位图的信息
    double *px1 = new double[bm.bmHeight*bm.bmWidthBytes];  //声明暂存数组
    bgbmp->GetBitmapBits(bm.bmHeight*bm.bmWidthBytes,px1); //取得源位图各像素点的RGB 值存入px1 数组中
    for(y=20;y<=348;y++)
        for(x=150;x<=447;x++)
        {
            px1[x*3+y*bm.bmWidthBytes] = px1[x*3+y*bm.bmWidthBytes]*0.5 + px[i]; //将B 色彩值乘以50% 并与px 相加
            px1[x*3+1+y*bm.bmWidthBytes] = px1[x*3+1+y*bm.bmWidthBytes]*0.5 + px[i+1];//将G 色彩值乘以50% 并与px 相加
            px1[x*3+2+y*bm.bmWidthBytes] = px1[x*3+2+y*bm.bmWidthBytes]*0.5 + px[i+2];//将R 色彩值乘以50% 并与px 相加
            i=i+3;
        }
    bgbmp->SetBitmapBits(bm.bmHeight*bm.bmWidthBytes,px1); //重设背景图的颜色
    mdc->SelectObject(bgbmp);  //选择位图对象到mdc中

原创粉丝点击