半透明AlphaBlend

 1 AlphaBlend

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

    函数原型:AlphaBlend(HDC hdcDest,int nXOriginDest,int nYOriginDest,int nWidthDest,int hHeightDest,HDC hdcSrc,int nXOriginSrc,int nYOriginSrc,int nWidthSrc,int nHeightSrc,BLENDFUNCTION blendFunction);

    参数:

    hdcDest:指向目标设备环境的句柄。

    nXoriginDest:指定目标矩形区域左上角的X轴坐标,按逻辑单位。

    nYOriginDest:指定目标矩形区域左上角的Y轴坐标,按逻辑单位。

    nWidthDest:指定目标矩形区域的宽度,按逻辑单位。

    hHeghtdest:指向目标矩形区域高度的句柄,按逻辑单位。

    hdcSrc:指向源设备环境的句柄。

    nXOriginSrc:指定源矩形区域左上角的X轴坐标,按逻辑单位。

    nYOriginSrc:指定源矩形区域左上角的Y轴坐标,按逻辑单位。

    nWidthSrc:指定源矩形区域的宽度,按逻辑单位。

    nHeightSrc:指定源矩形区域的高度,按逻辑单位。

    blendFunction:指定用于源位图和目标位图使用的alpha混合功能,用于整个源位图的全局alpha值和格式信息。源和目标混合功能当前只限为AC_SRC_OVER。

    返回值:如果函数执行成功,那么返回值为TRUE;如果函数执行失败,那么返回值为FALSE。

    Windows NT:若想获取更多错误信息,请调用GetLastError函数。

    备注:如果源矩形区域与目标矩形区域大小不一样,那么将缩放源位图与目标矩形区域匹配。如果使用SetStretchBltMode函数,那么iStretchMode的值是BLACKONWHITE和WHITEONBLACK,在本函数中,iStretchMode的值自动转换成COLORONCOLOR。目标坐标使用为目标设备环境当前指定的转换方式进行转换。源坐标则使用为源设备环境指定的当前转换方式进行转换。如果源设备环境标识为增强型图元文件设备环境,那么会出错(并且该函数返回FALSE)。如果目标和源位图的色彩格式不同,那么AlphaBlend将源位图转换以匹配目标位图。

    AlphaBlend不支持镜像。如果源或目标区域的宽度或高度为负数,那么调用将失败。

 

注意添加 #pragma   comment(lib,"Msimg32.lib")库

 

下面是一个例子:

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

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值