半透明AlphaBlend
AlphaBlend
函数功能:该函数用来显示透明或半透明像素的位图。
函数原型:
- BOOL AlphaBlend( HDC hdcDest, // handle to destination DC
- int nXOriginDest, // x-coord of upper-left corner
- int nYOriginDest, // y-coord of upper-left corner
- int nWidthDest, // destination width
- int nHeightDest, // destination height
- HDC hdcSrc, // handle to source DC
- int nXOriginSrc, // x-coord of upper-left corner
- int nYOriginSrc, // y-coord of upper-left corner
- int nWidthSrc, // source width
- int nHeightSrc, // source height
- BLENDFUNCTION blendFunction // alpha-blending function);
参数:
- hdcDest:指向目标设备环境的句柄。
- nXoriginDest:指定目标矩形区域左上角的X轴坐标,按逻辑单位。
- nYOriginDest:指定目标矩形区域左上角的Y轴坐标,按逻辑单位。
- nWidthDest:指定目标矩形区域的宽度,按逻辑单位。
- hHeghtdest:指向目标矩形区域高度的句柄,按逻辑单位。
- hdcSrc:指向源设备环境的句柄。
- nXOriginSrc:指定源矩形区域左上角的X轴坐标,按逻辑单位。
- nYOriginSrc:指定源矩形区域左上角的Y轴坐标,按逻辑单位。
- nWidthSrc:指定源矩形区域的宽度,按逻辑单位。
- nHeightSrc:指定源矩形区域的高度,按逻辑单位。
- blendFunction:指定用于源位图和目标位图使用的alpha混合功能,用于整个源位图的全局alpha值和格式信息。源和目标混合功能当前只限为AC_SRC_OVER。
- BLENDFUNCTION是AlphaBlend用控制透明效果的重要参数.定义如下:
- typedef struct _BLENDFUNCTION {
- BYTE BlendOp;
- BYTE BlendFlags;
- BYTE SourceConstantAlpha;
- BYTE AlphaFormat;
- }BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;
- BlendOp: 这个参数必须也只能为AC_SRC_OVER(0x00),意思就是把源图片覆盖到目标之上.
- BlendFlags: 必须为0
- SourceConstantAlpha: 简写为SCA,指定源图片的透明度,这个值是会和源图片的Alpha通道值合并计算的.
- //设置透明度,0为完全透明,255为完全不透明
- AlphaFormat: 可以填两种,一种是0x00,一种是AC_SRC_ALPHA(0x01).填0的话,AlphaBlend据说就和BitBlt一样了,我没有试验过~填1的话,源DC必须是32位的DC不然的话,AlphaBlend会返回参数错误.
- 计算公式(当SCA不是0xFF时):
- 输出像素(R,G,B,A) = 源像素(R,G,B,A) * SCA / 0xFF + 目标像素(R,G,B,A) * (1.0 - SCA / 0xFF)
- 当SCA是0xFF时,计算公式
- 输出像素(R,G,B,A) = 源像素(R,G,B,A) + 目标像素(R,G,B,A) * (1.0 - 源像素(A) / 0xFF)
- 混合计算公式
- 输出像素(R,G,B) = 源像素(R,G,B) * SCA / 0xFF + 目标像素(R,G,B) * (1.0 - 源像素(A) / 0xFF * SCA / 0xFF)
AlphaBlend返回值:如果函数执行成功,那么返回值为TRUE;如果函数执行失败,那么返回值为FALSE。
Windows NT:若想获取更多错误信息,请调用GetLastError函数。
备注:如果源矩形区域与目标矩形区域大小不一样,那么将缩放源位图与目标矩形区域匹配。如果使用SetStretchBltMode函数,那么iStretchMode的值是BLACKONWHITE和WHITEONBLACK,在本函数中,iStretchMode的值自动转换成COLORONCOLOR。目标坐标使用为目标设备环境当前指定的转换方式进行转换。源坐标则使用为源设备环境指定的当前转换方式进行转换。如果源设备环境标识为增强型图元文件设备环境,那么会出错(并且该函数返回FALSE)。如果目标和源位图的色彩格式不同,那么AlphaBlend将源位图转换以匹配目标位图。
AlphaBlend不支持镜像。如果源或目标区域的宽度或高度为负数,那么调用将失败。
下面是一个例子:
- #include <windows.h>
- #include <atldbcli.h>
- #pragma comment(lib,"Msimg32.lib")
- HINSTANCE g_hIns;
- HWND g_hWnd;
- LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
- TCHAR szText[] = TEXT("win32 AlphaBlend");
- int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
- {
- g_hIns=hInstance;
- static TCHAR szAppName[]=TEXT("HelloWin");
- HWND hWnd;
- MSG msg;
- WNDCLASS wndClass;
- wndClass.style=CS_HREDRAW|CS_VREDRAW;
- wndClass.lpfnWndProc=WndProc;
- wndClass.cbClsExtra=;
- wndClass.cbWndExtra=;
- wndClass.hInstance=hInstance;
- wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
- wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
- wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
- wndClass.lpszMenuName=NULL;
- wndClass.lpszClassName=szAppName;
- if(!RegisterClass(&wndClass))
- {
- MessageBox(NULL,TEXT("error"),szAppName,MB_ICONERROR|MB_OK);
- return ;
- }
- hWnd=CreateWindow(szAppName,TEXT("The hello program"),WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
- //也可以放在此
- ShowWindow(hWnd,iCmdShow);
- UpdateWindow(hWnd);
- while(GetMessage(&msg,NULL,,))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return msg.wParam;
- }
- LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
- {
- static HDC hdc;
- static HDC hBitmapDC;
- static HBITMAP hBitmap;
- static int w=;
- static int h=;
- static BLENDFUNCTION bf = {};
- PAINTSTRUCT ps;
- switch (message)
- {
- case WM_PAINT :
- {
- hdc=BeginPaint(hWnd,&ps);
- hBitmapDC = CreateCompatibleDC(hdc);
- hBitmap = CreateCompatibleBitmap(hdc,w,h);
- SelectObject(hBitmapDC,hBitmap);
- SetTextColor(hBitmapDC,RGB(,,));
- TextOut(hBitmapDC,,,szText,strlenT(szText));
- bf.BlendOp = AC_SRC_OVER;
- bf.BlendFlags = ;
- bf.AlphaFormat = ;
- bf.SourceConstantAlpha = ;
- AlphaBlend(hdc,,,w,h,hBitmapDC,,,w,h,bf);
- DeleteObject(hBitmap);
- DeleteDC( hBitmapDC );
- EndPaint (hWnd, &ps) ;
- }
- break;
- case WM_DESTROY :
- PostQuitMessage();
- break ;
- }
- return DefWindowProc (hWnd, message, wParam, lParam) ;
- }
半透明AlphaBlend的更多相关文章
- 自绘实现半透明水晶按钮(继承CButton,设置BS_OWNERDRAW风格,覆盖DrawItem函数绘制按钮,把父窗口的背景复制到按钮上,实现视觉上的透明,最后通过AlphaBlend实现半透明)
运行效果 实现方法 1.给按钮加上BS_OWNERDRAW样式2.重载DrawItem函数,在这里绘制按钮3.关键之处就是把父窗口的背景复制到按钮上,实现视觉上的透明4.最后通过AlphaBlend实 ...
- 供CImage类显示的半透明PNG文件处理方法
原文链接: http://blog.sina.com.cn/s/blog_4070692f010003gy.html 前补:没想到这个帖子好像挺多人看哪……看来大家都被这个png郁闷的够呛.显示p ...
- 如何使用GDI绘制半透明矩形
/*使用GDI绘制半透明矩形*/ void CDirectXDraw::DrawHalfOpacityRect(HDC hdc,CRect rect) { CDC dc; dc.Attach(hdc) ...
- 每天进步一点点------Alpha半透明图形叠加算法Matlab+Verilog实现
Alpha图形叠加算法Matlab+Verilog实现 1.1. Alpha算法的研究 Alpha通道是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度信息,定义透明.不透明和半透明区域, ...
- CSharpGL(22)实现顺序无关的半透明渲染(Order-Independent-Transparency)
+BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(22)实现顺序无关的半透明渲染(Order-Independent-Transparency) 在 GL.Enable(GL_BLEND ...
- CSS属性小结之--半透明处理
项目中经常有遇到需求半透明的情况,如图片.文字.容器.背景等等,每次都要去翻以前的项目,不甚其烦.现在一次性做个小结,方便自己查阅,也同时分享给大家: 一. 元素容器透明 .div{ opacity: ...
- 如何将 NavigationBar 的半透明效果关闭?
如何将 NavigationBar 的半透明效果关闭?只需三行代码就可以:self.navigationController.navigationBar.barTintColor = [UIColor ...
- iOS开发使用半透明模糊效果方法整理
虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范围广泛使用.包括今年最新发布的iOS8也沿袭了这一设计,甚至在OS X 10.10版Yosemite中也开 ...
- 兼容性背景颜色半透明CSS代码(不影响内部子元素)
如何简单兼容性的实现父元素是半透明背景色,而子元素不受影响. 兼容所有浏览器的背景颜色半透明CSS代码: background-color: rgba(, , , .); filter: progid ...
随机推荐
- 使用JavaScript OOP特性搭建Web应用
最近,我面试了一个有五年 Web 应用程序开发经验的软件开发人员.四年半来她一直在从事 JavaScript 相关的工作,她自认为 JavaScript 技能非常好,但在不久之后我就发现实际上她对 J ...
- [ZJOI2010]排列计数 (组合计数/dp)
[ZJOI2010]排列计数 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有 ...
- UVA315:Network(求割点)
Network 题目链接:https://vjudge.net/problem/UVA-315 Description: A Telephone Line Company (TLC) is estab ...
- Idea 02.暴力递归与动态规划(1)
1,关键词解释 1.1 暴力递归: 1, 把问题转化为规模缩小了的同类问题的子问题 2, 有明确的不需要继续进行递归的条件(base case) 3, 有当得到了子问题的结果之后的决策过程 4, 不记 ...
- Fragment+ViewPager实现仿微信点击和滑动切换界面
这是在我写的新闻App中实现的界面切换 贴出切换界面的主要代码: xml代码: <span style="font-size:14px;"> <android.s ...
- bzoj 2957: 楼房重建 ——线段树
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- bzoj 2144: 跳跳棋——倍增/二分
Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...
- js jq插件 显示中文时间戳 刚刚 N分钟前 N小时前 今天 上午 下午 日期格式化
注:页面需提前引用JQ ; $.fn.extend({ /* ** notes: 获取13位时间戳的简单操作 ** new Date('2018-02-01 15:10:00').getTime() ...
- webpack_配置和使用教程
webpack是一个模块打包的工具,它的作用是把互相依赖的模块处理成静态资源. webpack 可以使用 loader 来预处理文件.这允许你打包除 JavaScript 之外的任何静态资源.你可以使 ...
- Java线程总结(一)
首先,先贴上一个简单的线程实例: public class MyThread extends Thread{ @Override public void run(){ try { for (int i ...