带透明通道的bmp文件,画到窗口客户区上

主要API:由于带有透明通道,所以不能使用gdi的API来处理图片了,需要使用gdi+的API来处理图片,使用GDI+需要引入对应的库文件和头文件

属性->链接器->附加依赖项,添加“gdiplus.lib;”库

        #include<gdiplus.h> //添加头文件

        使用gdi+需要初始化资源以后才能使用,而且使用完了,需要释放掉资源,估计在这个初始化中,可能是需要获得设备相关的东西,都写在这里了,不初始化的话,很多资源用不了或者无法正确使用,而且使用完了以后,需要释放掉gdi+资源

        ULONG_PTR uToken = 0;//gdi+资源标识符,通过这个来释放资源
        Gdiplus::GdiplusStartupInput gidplusStartInput = {0};//一个结构体,可能就是初始化这个结构体里的数据
        Gdiplus::GdiplusStartup(&uToken, &gidplusStartInput, NULL);//执行gdi+初始化的函数

下面的需要写在WM_PAINT消息中

        HDC hDc = BeginPaint(hWnd, &ps);//写在WM_PAINT消息中,根据窗口句柄得到当前窗口的DC句柄

        Gdiplus::Bitmap srcAlphaBlendBitmap(L"E:\\spidermanalpha.bmp");//通过Bitmap类的构造函数,直接读取一个带有透明通道的.bmp文件进内存,有了这个带有透明通道的位图对象,就可以接下来的后续操作了

        Gdiplus::Graphics graphics(hDc);//根据当前窗口的HDC,构建一个绘画对象,这个绘画对象专门用来画画的

        graphics.DrawImage(&srcAlphaBlendBitmap, 0, 0, 350 * 0.5, 437 * 0.5);//这个API就可以将带透明通道的bmp图片画到指定的位置,并且可以调整图片缩放大小,我的图片是350*437的宽高,各自*0.5,就相当于宽高缩小了一倍,如果想放大,那么就*1.0以上的值

        EndPaint(hWnd, &ps);

#include<Windows.h>
#include "resource.h"
#include<string>
#include<gdiplus.h>
LRESULT CALLBACK WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) {
	switch (nMsg) {
	case WM_COMMAND:
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_PAINT: {
		HDC hDc = BeginPaint(hWnd, &ps);
		Gdiplus::Bitmap srcAlphaBlendBitmap(L"E:\\spidermanalpha.bmp");
		graphics.DrawImage(&srcAlphaBlendBitmap, 700, 0, 350 * 0.2, 437 * 0.2);
		EndPaint(hWnd, &ps);
		break;
	    }			 
	}
	return DefWindowProc(hWnd, nMsg, wParam, lParam);
}
int WINAPI WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInsatnce,
	LPTSTR lpCmdLine,
	int nCmdShow
) {
    ULONG_PTR uToken = 0;//gdi+资源的标识符,程序执行完后,gdi+有些资源用完后,需要通过它释放掉
    Gdiplus::GdiplusStartupInput gidplusStartInput = {0};
    Gdiplus::GdiplusStartup(&uToken, &gidplusStartInput, NULL);//gdi+资源需要初始化才能使用,此处就是初始化gdi+相关资源
	WNDCLASS wc = { 0 };
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = NULL;
	wc.hCursor = NULL;
	wc.hIcon = NULL;
	wc.hInstance = hInstance;
	wc.lpfnWndProc = WndProc;
	wc.lpszClassName = "Main";
	wc.lpszMenuName = (char*)IDR_MENU1;
	wc.style = CS_VREDRAW | CS_HREDRAW;
	RegisterClass(&wc);
	HWND hWnd = CreateWindowEx(NULL, "Main", "Window", WS_OVERLAPPEDWINDOW, 100, 100,200,200, NULL, NULL, hInstance, NULL);
	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);
    HACCEL hAccel = LoadAccelerators(hInstance, (char*)IDR_ACCELERATOR1);
	MSG nMsg = { 0 };
	while (1) {
		if (PeekMessage(&nMsg, NULL, 0, 0, PM_NOREMOVE)) {
			if (GetMessage(&nMsg, NULL, 0, 0)) {
				if (!TranslateAccelerator(hWnd, hAccel, &nMsg)) {
					TranslateMessage(&nMsg);
					DispatchMessage(&nMsg);
				}
			}
			else {
				break;
			}
		}
	}
	Gdiplus::GdiplusShutdown(uToken);//用完了gdi+资源,需要释放掉
	return 0;
}

        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值