镂空和透明效果图
来源:互联网 发布: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中
- 镂空和透明效果图
- 透明效果图
- 透明镂空位图的实现
- iOS中间透明周围不透明(镂空)方法实现特种ProgressBar
- UIView裁剪矩形 镂空(中间透明,周围半透明)
- javascript打印菱形和镂空菱形
- Alpha Test 透明通道测试技术做篱笆效果图
- 效果图进阶展现,给效果图赋予思想和生命
- IOS UIView中间透明周围半透明(四种方法) 中间镂空
- 关于图片镂空和bitblt及setbkcolor等的理解
- css3制作小三角和镂空样式的小三角
- 效果图渲染机器和联网渲染
- SVM添加数据库和绘制效果图
- 字体镂空
- OpenGL镂空
- 镂空三角形
- 镂空圆
- 镂空点击
- 打造绚丽的Swing slider
- Sax character method cutting elements
- ASP.NET里的Session详细解释
- CDC(设备环境)与CGdiObject(图形对象)
- 你们帮我看看如何在datalist里面使用session获取ID值代码改怎么写啊麻烦了
- 镂空和透明效果图
- 报到了~
- 按奈不住内心的矛盾!!!!!
- ASP.NET 常用WEB SERVICE
- VS2008基于Win32游戏平台的构
- 厌倦了出差的感觉!!!!!!
- 学习用反汇编调试,看存储单元的变化
- 轮胎参数:195/55 R15 84V
- 【转】上大数学系博士点