AlphaBlend

函数功能:该函数用来显示透明或半透明像素的位图。

函数原型:

  1. BOOL AlphaBlend( HDC hdcDest, // handle to destination DC
  2. int nXOriginDest, // x-coord of upper-left corner
  3. int nYOriginDest, // y-coord of upper-left corner
  4. int nWidthDest, // destination width
  5. int nHeightDest, // destination height
  6. HDC hdcSrc, // handle to source DC
  7. int nXOriginSrc, // x-coord of upper-left corner
  8. int nYOriginSrc, // y-coord of upper-left corner
  9. int nWidthSrc, // source width
  10. int nHeightSrc, // source height
  11. BLENDFUNCTION blendFunction // alpha-blending function);

参数:

  1. hdcDest:指向目标设备环境的句柄。
  2. nXoriginDest:指定目标矩形区域左上角的X轴坐标,按逻辑单位。
  3. nYOriginDest:指定目标矩形区域左上角的Y轴坐标,按逻辑单位。
  4. nWidthDest:指定目标矩形区域的宽度,按逻辑单位。
  5. hHeghtdest:指向目标矩形区域高度的句柄,按逻辑单位。
  6. hdcSrc:指向源设备环境的句柄。
  7. nXOriginSrc:指定源矩形区域左上角的X轴坐标,按逻辑单位。
  8. nYOriginSrc:指定源矩形区域左上角的Y轴坐标,按逻辑单位。
  9. nWidthSrc:指定源矩形区域的宽度,按逻辑单位。
  10. nHeightSrc:指定源矩形区域的高度,按逻辑单位。
  11. blendFunction:指定用于源位图和目标位图使用的alpha混合功能,用于整个源位图的全局alpha值和格式信息。源和目标混合功能当前只限为AC_SRC_OVER
  1. BLENDFUNCTIONAlphaBlend用控制透明效果的重要参数.定义如下:
  1. typedef struct _BLENDFUNCTION {
  2. BYTE BlendOp;
  3. BYTE BlendFlags;
  4. BYTE SourceConstantAlpha;
  5. BYTE AlphaFormat;
  6. }BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;
  1. BlendOp: 这个参数必须也只能为AC_SRC_OVER(0x00),意思就是把源图片覆盖到目标之上.
  2.  
  3. BlendFlags: 必须为0
  4.  
  5. SourceConstantAlpha: 简写为SCA,指定源图片的透明度,这个值是会和源图片的Alpha通道值合并计算的.
  6. //设置透明度,0为完全透明,255为完全不透明
  7. AlphaFormat: 可以填两种,一种是0x00,一种是AC_SRC_ALPHA(0x01).填0的话,AlphaBlend据说就和BitBlt一样了,我没有试验过~填1的话,源DC必须是32位的DC不然的话,AlphaBlend会返回参数错误.
  8.  
  9. 计算公式(当SCA不是0xFF时):
  10.  
  11. 输出像素(R,G,B,A) = 源像素(R,G,B,A) * SCA / 0xFF + 目标像素(R,G,B,A) * (1.0 - SCA / 0xFF)
  12.  
  13. SCA0xFF时,计算公式
  14.  
  15. 输出像素(R,G,B,A) = 源像素(R,G,B,A) + 目标像素(R,G,B,A) * (1.0 - 源像素(A) / 0xFF)
  16.  
  17. 混合计算公式
  18.  
  19. 输出像素(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不支持镜像。如果源或目标区域的宽度或高度为负数,那么调用将失败。

下面是一个例子:

  1. #include <windows.h>
  2. #include <atldbcli.h>
  3. #pragma comment(lib,"Msimg32.lib")
  4. HINSTANCE g_hIns;
  5. HWND g_hWnd;
  6. LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
  7.  
  8. TCHAR szText[] = TEXT("win32 AlphaBlend");
  9.  
  10. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
  11. {
  12. g_hIns=hInstance;
  13. static TCHAR szAppName[]=TEXT("HelloWin");
  14. HWND hWnd;
  15. MSG msg;
  16. WNDCLASS wndClass;
  17. wndClass.style=CS_HREDRAW|CS_VREDRAW;
  18. wndClass.lpfnWndProc=WndProc;
  19. wndClass.cbClsExtra=;
  20. wndClass.cbWndExtra=;
  21. wndClass.hInstance=hInstance;
  22. wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
  23. wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
  24. wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
  25. wndClass.lpszMenuName=NULL;
  26. wndClass.lpszClassName=szAppName;
  27. if(!RegisterClass(&wndClass))
  28. {
  29. MessageBox(NULL,TEXT("error"),szAppName,MB_ICONERROR|MB_OK);
  30. return ;
  31. }
  32. hWnd=CreateWindow(szAppName,TEXT("The hello program"),WS_OVERLAPPEDWINDOW,
  33. CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
  34.  
  35. //也可以放在此
  36. ShowWindow(hWnd,iCmdShow);
  37. UpdateWindow(hWnd);
  38. while(GetMessage(&msg,NULL,,))
  39. {
  40. TranslateMessage(&msg);
  41. DispatchMessage(&msg);
  42. }
  43. return msg.wParam;
  44. }
  45. LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
  46. {
  47. static HDC hdc;
  48. static HDC hBitmapDC;
  49. static HBITMAP hBitmap;
  50. static int w=;
  51. static int h=;
  52. static BLENDFUNCTION bf = {};
  53. PAINTSTRUCT ps;
  54. switch (message)
  55. {
  56. case WM_PAINT :
  57. {
  58. hdc=BeginPaint(hWnd,&ps);
  59. hBitmapDC = CreateCompatibleDC(hdc);
  60. hBitmap = CreateCompatibleBitmap(hdc,w,h);
  61. SelectObject(hBitmapDC,hBitmap);
  62. SetTextColor(hBitmapDC,RGB(,,));
  63. TextOut(hBitmapDC,,,szText,strlenT(szText));
  64.  
  65. bf.BlendOp = AC_SRC_OVER;
  66. bf.BlendFlags = ;
  67. bf.AlphaFormat = ;
  68. bf.SourceConstantAlpha = ;
  69. AlphaBlend(hdc,,,w,h,hBitmapDC,,,w,h,bf);
  70.  
  71. DeleteObject(hBitmap);
  72. DeleteDC( hBitmapDC );
  73. EndPaint (hWnd, &ps) ;
  74. }
  75. break;
  76. case WM_DESTROY :
  77. PostQuitMessage();
  78. break ;
  79. }
  80. return DefWindowProc (hWnd, message, wParam, lParam) ;
  81. }

半透明AlphaBlend的更多相关文章

  1. 自绘实现半透明水晶按钮(继承CButton,设置BS_OWNERDRAW风格,覆盖DrawItem函数绘制按钮,把父窗口的背景复制到按钮上,实现视觉上的透明,最后通过AlphaBlend实现半透明)

    运行效果 实现方法 1.给按钮加上BS_OWNERDRAW样式2.重载DrawItem函数,在这里绘制按钮3.关键之处就是把父窗口的背景复制到按钮上,实现视觉上的透明4.最后通过AlphaBlend实 ...

  2. 供CImage类显示的半透明PNG文件处理方法

    原文链接: http://blog.sina.com.cn/s/blog_4070692f010003gy.html   前补:没想到这个帖子好像挺多人看哪……看来大家都被这个png郁闷的够呛.显示p ...

  3. 如何使用GDI绘制半透明矩形

    /*使用GDI绘制半透明矩形*/ void CDirectXDraw::DrawHalfOpacityRect(HDC hdc,CRect rect) { CDC dc; dc.Attach(hdc) ...

  4. 每天进步一点点------Alpha半透明图形叠加算法Matlab+Verilog实现

    Alpha图形叠加算法Matlab+Verilog实现 1.1. Alpha算法的研究 Alpha通道是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度信息,定义透明.不透明和半透明区域, ...

  5. CSharpGL(22)实现顺序无关的半透明渲染(Order-Independent-Transparency)

    +BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(22)实现顺序无关的半透明渲染(Order-Independent-Transparency) 在 GL.Enable(GL_BLEND ...

  6. CSS属性小结之--半透明处理

    项目中经常有遇到需求半透明的情况,如图片.文字.容器.背景等等,每次都要去翻以前的项目,不甚其烦.现在一次性做个小结,方便自己查阅,也同时分享给大家: 一. 元素容器透明 .div{ opacity: ...

  7. 如何将 NavigationBar 的半透明效果关闭?

    如何将 NavigationBar 的半透明效果关闭?只需三行代码就可以:self.navigationController.navigationBar.barTintColor = [UIColor ...

  8. iOS开发使用半透明模糊效果方法整理

    虽然iOS很早就支持使用模糊效果对图片等进行处理,但尤其在iOS7以后,半透明模糊效果得到大范围广泛使用.包括今年最新发布的iOS8也沿袭了这一设计,甚至在OS X 10.10版Yosemite中也开 ...

  9. 兼容性背景颜色半透明CSS代码(不影响内部子元素)

    如何简单兼容性的实现父元素是半透明背景色,而子元素不受影响. 兼容所有浏览器的背景颜色半透明CSS代码: background-color: rgba(, , , .); filter: progid ...

随机推荐

  1. 使用JavaScript OOP特性搭建Web应用

    最近,我面试了一个有五年 Web 应用程序开发经验的软件开发人员.四年半来她一直在从事 JavaScript 相关的工作,她自认为 JavaScript 技能非常好,但在不久之后我就发现实际上她对 J ...

  2. [ZJOI2010]排列计数 (组合计数/dp)

    [ZJOI2010]排列计数 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i<=N时,Pi>Pi/2. 计算1,2,...N的排列中有 ...

  3. UVA315:Network(求割点)

    Network 题目链接:https://vjudge.net/problem/UVA-315 Description: A Telephone Line Company (TLC) is estab ...

  4. Idea 02.暴力递归与动态规划(1)

    1,关键词解释 1.1 暴力递归: 1, 把问题转化为规模缩小了的同类问题的子问题 2, 有明确的不需要继续进行递归的条件(base case) 3, 有当得到了子问题的结果之后的决策过程 4, 不记 ...

  5. Fragment+ViewPager实现仿微信点击和滑动切换界面

    这是在我写的新闻App中实现的界面切换 贴出切换界面的主要代码: xml代码: <span style="font-size:14px;"> <android.s ...

  6. bzoj 2957: 楼房重建 ——线段树

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

  7. bzoj 2144: 跳跳棋——倍增/二分

    Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...

  8. js jq插件 显示中文时间戳 刚刚 N分钟前 N小时前 今天 上午 下午 日期格式化

    注:页面需提前引用JQ ; $.fn.extend({ /* ** notes: 获取13位时间戳的简单操作 ** new Date('2018-02-01 15:10:00').getTime() ...

  9. webpack_配置和使用教程

    webpack是一个模块打包的工具,它的作用是把互相依赖的模块处理成静态资源. webpack 可以使用 loader 来预处理文件.这允许你打包除 JavaScript 之外的任何静态资源.你可以使 ...

  10. Java线程总结(一)

    首先,先贴上一个简单的线程实例: public class MyThread extends Thread{ @Override public void run(){ try { for (int i ...