win32怎么设置png图片背景?

这几天写自己的小程序时遇到的问题,谁能帮忙回答下?
如果不介意的话,能将按钮怎么用也写上吧~

png要用gdi+去绘制。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/921296
  • 这篇博客你也可以参考下:加载png图片
  • 除此之外, 这篇博客: C语言实现推箱子 (数据库连接+项目打包发布)中的 5.加载游戏通关图片(如何加载png透明图片) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    其实加载游戏通关图片只需使用putimage函数即可,这里之所以单独作为一个标题是因为使用putimage时如果时png透明图片加载出来时还是会有背景,这里为大家提供一个可以加载png透明背景图片的算法(可以单独拷贝使用)

    watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6Zy46YGT5bCP5piO,size_20,color_FFFFFF,t_70,g_se,x_16

    /*****************************
    * 功能:载入PNG图并去透明部分
    * 输入:
    *		无
    * 输出:
    *		无
    *****************************/
    void drawAlpha(IMAGE* picture, int  picture_x, int picture_y) //x为载入图片的X坐标,y为Y坐标
    {
    
    	// 变量初始化
    	DWORD* dst = GetImageBuffer();    // GetImageBuffer()函数,用于获取绘图设备的显存指针,EASYX自带
    	DWORD* draw = GetImageBuffer();
    	DWORD* src = GetImageBuffer(picture); //获取picture的显存指针
    	int picture_width = picture->getwidth(); //获取picture的宽度,EASYX自带
    	int picture_height = picture->getheight(); //获取picture的高度,EASYX自带
    	int graphWidth = getwidth();       //获取绘图区的宽度,EASYX自带
    	int graphHeight = getheight();     //获取绘图区的高度,EASYX自带
    	int dstX = 0;    //在显存里像素的角标
    
    	// 实现透明贴图 公式: Cp=αp*FP+(1-αp)*BP , 贝叶斯定理来进行点颜色的概率计算
    	for (int iy = 0; iy < picture_height; iy++)
    	{
    		for (int ix = 0; ix < picture_width; ix++)
    		{
    			int srcX = ix + iy * picture_width; //在显存里像素的角标
    			int sa = ((src[srcX] & 0xff000000) >> 24); //0xAArrggbb;AA是透明度
    			int sr = ((src[srcX] & 0xff0000) >> 16); //获取RGB里的R
    			int sg = ((src[srcX] & 0xff00) >> 8);   //G
    			int sb = src[srcX] & 0xff;              //B
    			if (ix >= 0 && ix <= graphWidth && iy >= 0 && iy <= graphHeight && dstX <= graphWidth * graphHeight)
    			{
    				dstX = (ix + picture_x) + (iy + picture_y) * graphWidth; //在显存里像素的角标
    				int dr = ((dst[dstX] & 0xff0000) >> 16);
    				int dg = ((dst[dstX] & 0xff00) >> 8);
    				int db = dst[dstX] & 0xff;
    				draw[dstX] = ((sr * sa / 255 + dr * (255 - sa) / 255) << 16)  //公式: Cp=αp*FP+(1-αp)*BP  ; αp=sa/255 , FP=sr , BP=dr
    					| ((sg * sa / 255 + dg * (255 - sa) / 255) << 8)         //αp=sa/255 , FP=sg , BP=dg
    					| (sb * sa / 255 + db * (255 - sa) / 255);              //αp=sa/255 , FP=sb , BP=db
    			}
    		}
    	}
    }
    
    /*****************************
    * 功能:载入“恭喜通关”图片
    * 输入:
    *		无
    * 输出:
    *		无
    *****************************/
    void promot_over() {
    	setbkmode(TRANSPARENT);
    	drawAlpha(&images[VECTOR], 250, 130);     // 载入PNG图并去透明部分
    	Sleep(1100);
    }

    到这里推箱子游戏就已经完成了,接下来就是将数据库与游戏连接起来。

  • 以下回答来自chatgpt:

    我可以帮助你解决这个问题。要在win32程序中设置PNG图片作为窗口的背景,你可以按照以下步骤进行操作:

    步骤1:添加所需的库和头文件 你需要包含以下头文件和库来使用PNG图片:

    #include <windows.h>
    #include <Commctrl.h>
    #include "resource.h"
    #include <gdiplus.h>
    #pragma comment(lib, "gdiplus.lib")
    

    步骤2:在资源文件中添加PNG图片 在你的项目中的资源文件(.rc)中添加一张PNG图片,通过右键点击“资源文件” -> “添加” -> “导入”来导入你的PNG图片。

    步骤3:初始化GDI+ 在窗口过程函数的开始,你需要初始化GDI+库:

    ULONG_PTR gdiplusToken;
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    

    步骤4:加载PNG图片 在窗口过程函数的 WM_CREATE 消息中加载PNG图片并保存到一个变量中:

    Gdiplus::Image* backgroundImage;
    
    // 在 WM_CREATE 消息中加载PNG图片
    case WM_CREATE:
        backgroundImage = Gdiplus::Image::FromFile(L"your_image.png");
        break;
    

    步骤5:绘制背景图片 在窗口过程函数的 WM_PAINT 消息中绘制背景图片:

    // 在 WM_PAINT 消息中绘制背景图片
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hWnd, &ps);
    
        Gdiplus::Graphics graphics(hdc);
        graphics.DrawImage(backgroundImage, 0, 0);
    
        EndPaint(hWnd, &ps);
    }
    break;
    

    步骤6:清理工作 在窗口过程函数的 WM_DESTROY 消息中清理GDI+相关资源:

    // 在 WM_DESTROY 消息中清理GDI+资源
    case WM_DESTROY:
        delete backgroundImage;
        Gdiplus::GdiplusShutdown(gdiplusToken);
        PostQuitMessage(0);
        break;
    

    这样,你就成功地将PNG图片设置为窗口的背景了。

    关于使用按钮,你可以按照以下步骤进行操作:

    步骤1:在资源文件中添加按钮 在资源文件(.rc)中添加一个按钮控件,例如:

    BUTTON      "按钮",IDC_BUTTON,10,10,50,25
    

    步骤2:处理按钮点击事件 在窗口过程函数中添加处理按钮点击事件的代码:

    // 在窗口过程函数中处理按钮点击事件
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
            case IDC_BUTTON:
                // 按钮点击事件的处理代码
                break;
        }
        break;
    

    你可以在按钮点击事件的处理代码中添加具体的逻辑。

    希望以上解决方案对你有帮助!


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^