永发信息网

求API中AlphaBlend函数使用示例

答案:1  悬赏:0  手机版
解决时间 2021-04-07 10:43
  • 提问者网友:记得曾经
  • 2021-04-07 07:40
我写的个简单的程序

设为全局变量
int nAlpha = 0;
static BLENDFUNCTION bf;

消息处理中
case WM_CREATE:
hdc=GetDC(hwnd);
mdc=CreateCompatibleDC(hdc);
man=CreateCompatibleDC(hdc);
bo=(HBITMAP)LoadImage(NULL,TEXT("bg.bmp"),IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.AlphaFormat = 0;
bf.SourceConstantAlpha = nAlpha;
SetTimer(hwnd,1,50, NULL);

处理定时器消息
case WM_TIMER:
nAlpha+=15;
if(nAlpha> 255)
nAlpha = 255;
bf.SourceConstantAlpha= nAlpha;
if(nAlpha == 255)
{
KillTimer(hwnd,1);
}
在绘图函数中
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
SelectObject(mdc,bo);
AlphaBlend(hdc,0,0,800,600,mdc,0,0,800,600,bf);
EndPaint(hwnd, &ps);
return 0;

但不知道哪里出了问题。不能让那张图片淡出,,,请高手指教
或者另外给个完整的API,AlphaBlend函数淡出程序
初学者。。非常感谢
最佳答案
  • 五星知识达人网友:山有枢
  • 2021-04-07 08:10
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")库

下面是一个例子:

#include <windows.h>

#pragma comment(lib,"Msimg32.lib")

HINSTANCE g_hIns;
HWND g_hWnd;

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

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=0;
wndClass.cbWndExtra=0;
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 0;
}

hWnd=CreateWindow(szAppName,TEXT("The hello program"),WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

int iReturn;

//也可以放在此

ShowWindow(hWnd,iCmdShow);

UpdateWindow(hWnd);

while(GetMessage(&msg,hWnd,0,0))
{
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=50;
static int h=50;
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(0,255,0));
TextOut(hBitmapDC,0,0,TEXT("asdf"),4);

bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.AlphaFormat = 0;
bf.SourceConstantAlpha = 50;

AlphaBlend(hdc,0,0,w,h,hBitmapDC,0,0,w,h,bf);

EndPaint (hWnd, &ps) ;

break;

case WM_DESTROY :
PostQuitMessage (0) ;

break ;

default:
return DefWindowProc (hWnd, message, wParam, lParam) ;

}

return 1;

}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯