考拉普普 2023-07-12 22:23 采纳率: 100%
浏览 13
已结题

win32怎么设置png图片背景?

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

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-14 02:55
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 这个问题的回答你可以参考下: 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;
      

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

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


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月2日
  • 已采纳回答 11月24日
  • 创建了问题 7月12日

悬赏问题

  • ¥15 WPF RichTextBox格式化大量文本卡顿如何解决
  • ¥15 什么设备可以研究OFDM的60GHz毫米波信道模型
  • ¥15 不知道是该怎么引用多个函数片段
  • ¥15 pip install后修改模块路径,import失败,需要在哪里修改环境变量?
  • ¥15 爬取1-112页所有帖子的标题但是12页后要登录后才能 我使用selenium模拟登录 账号密码输入后 会报错 不知道怎么弄了
  • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
  • ¥50 vue组件中无法正确接收并处理axios请求
  • ¥15 隐藏系统界面pdf的打印、下载按钮
  • ¥15 MATLAB联合adams仿真卡死如何解决(代码模型无问题)
  • ¥15 基于pso参数优化的LightGBM分类模型