主要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;
}