背景:
应产品需求将窗口加载时的loading.gif换了一张,原先是白底的GIF,然后换了一张黑底的GIF,放上去真的好丑,因为窗体的背景色是白色。
然后就需要我给窗体画个背景颜色融合这个新的GIF,踩了很多openGL、ondraw等很多坑,这里先po一下代码

void OnPaint(HDC hdc)
{if (m_pGif&& !m_bLoadEnd){HBRUSH hBrush;RECT rect;SetRect(&rect, 0, 0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));hBrush = CreateSolidBrush(RGB(34, 34, 34));FillRect(hdc, &rect, hBrush);hBrush = NULL;m_pGif->OnPaint(hdc);}
}

这个代码把黑色背景画出来了。
原理:窗体创建之后,在注册的消息循环类WinProc里接受

case WM_PAINT:{if (window){PAINTSTRUCT ps;RECT rc;HDC hdc = BeginPaint(hWnd, &ps);window->OnPaint(hdc);EndPaint(hWnd, &ps);}break;}

这样就可以在窗体创建之后调用onpaint,所以我在onpaint中实现画背景这个功能。
但是运行发现上面的代码其实是有问题的,我的loading图片一直在闪烁。查阅资料后说需要实现双缓冲,这是我当时网上找到的代码

HDC memDC = CreateCompatibleDC(hdc);//内存DC
HBITMAP memBitmap = CreateCompatibleBitmap(hdc, Width, Height); //建立和屏幕兼容的bitmap
HBITMAP hOldBitmap = (HBITMAP)SelectObject(memDC, memBitmap);//将memBitmap选入内存DC   //这里在memDC上绘制
{}//贴图到目标DC
BitBlt(hdc, 0, 0, Width, Height, memDC, 0, 0, SRCCOPY);
//结束清理
SelectObject(memDC, hOldBitmap);
DeleteObject(memBitmap);
DeleteDC(memDC);

因为画的时候是一个像素一个像素画的,每画一笔窗体都会刷新一次,所以会出现闪烁的现象,而双缓冲是在窗体里建立一个缓冲池,缓冲池满的时候再刷新,而且刷新的是缓冲区而不是窗体
这是我双缓冲的代码

void OnPaint(HDC hdc)
{if (m_pGif && !m_bLoadEnd){int Width = GetSystemMetrics(SM_CXSCREEN);int Height = GetSystemMetrics(SM_CYSCREEN);HDC memDC = CreateCompatibleDC(hdc);//内存DC   HBITMAP memBitmap = CreateCompatibleBitmap(hdc, Width, Height); //建立和屏幕兼容的bitmap    (9)HBITMAP hOldBitmap = (HBITMAP)SelectObject(memDC, memBitmap);//将memBitmap选入内存DC   //这里在memDC上绘制{HBRUSH hBrush;RECT rect;SetRect(&rect, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));hBrush = CreateSolidBrush(RGB(34, 34, 34));FillRect(memDC, &rect, hBrush);hBrush = NULL;m_pGif->OnPaint(memDC);}//贴图到目标DCBitBlt(hdc, 0, 0, Width, Height, memDC, 0, 0, SRCCOPY);//结束清理SelectObject(memDC, hOldBitmap);DeleteObject(memBitmap);DeleteDC(memDC);}
}

到这里逻辑基本就正确了,但是运行发现闪烁的更厉害了。
排查分析后发现有一处错误:(9)我在代码里标了。
HBITMAP hOldBitmap这个不能建立临时变量,所以我在类里定义了HBITMAP hOldBitmap变量,在函数里直接用,而不是重新定义。
OK,完美的解决把黑色GIF放进去了
工作原因不方便放图~

win32画窗体背景相关推荐

  1. java中窗体背景图片_Java Swing 之设置窗体背景图片

    /** * 设置窗体背景图片 * @author gao */ package com.gao; import java.awt.Graphics; import java.awt.Image; im ...

  2. 解决Winform应用程序中窗体背景闪烁的问题

    解决Winform应用程序中窗体背景闪烁的问题 参考文章: (1)解决Winform应用程序中窗体背景闪烁的问题 (2)https://www.cnblogs.com/candyzhmm/p/5961 ...

  3. Swing设置窗体背景图片

    Swing设置窗体背景图片,简单的实现方法就是在窗体中放在一个JLabel标签组件,然后设置该标签的图标属性,最后设置该标签的大小与位置将其铺满窗体. // 设置背景 JLabel lblBackgr ...

  4. PyQt5_设置窗体背景透明和隐藏边框

    窗口置顶.透明.去边框: self.setAttribute(Qt.WA_TranslucentBackground) # 窗体背景透明 self.setWindowFlags(Qt.WindowSt ...

  5. C#如何实现窗体背景颜色渐变?

    如下图,如何才能实现窗体颜色渐变? 实现窗体颜色渐变需要用到Color结构的FormArgb方法,该方法可以重载. 实现的主要代码如下 using System; using System.Colle ...

  6. 使用button控件更改C#From窗体背景

    使用button控件更改C#From窗体背景 // // // // 在网上找了很多资料比如 this.BackgroundImage = Image.FromFile(@"图片路径&quo ...

  7. MFC设置窗体背景图片的办法

    1.导入位图 新建一个项目TestBackground 资源视图中右键点击TestBackground.rc,添加资源,bitmap,导入,导入一张bmp位图 在资源视图中多了一个Bitmap文件夹, ...

  8. java窗体背景图片_java 窗体设置背景图片问题 (附上登陆界面代码,我想加个背景图...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 java 窗体设置背景图片问题 (附上登陆界面代码,我想加个背景图片,求大神帮忙改改) package com.qx; import java.awt.D ...

  9. 正确在WPF中对Windows窗体背景进行设置

    初次接触WPF,就被对窗体的背景图进行设置难住了.跟Winform区别很大, 如果没有正确设置的,会报错. 直接输入添加背景图片代码会弹出异常. <Window.Background> & ...

  10. 电视墙应该用什么画 让背景墙面更富有特色

    客厅是家庭中非常重要的公共空间,它的装修至关重要.而在整个客厅中,电视背景墙的装修设计更是不容忽视的.了解过风水的人应该都知道,电视背景墙的装修除了要注意与客厅的装修格调保持一致外,还需要注重风水上的 ...

最新文章

  1. linux无人值守安装+PXE
  2. Python命令行参数解析模块getopt使用实例
  3. command模式 java_命令模式(Command)_java实现
  4. cve-2020-0796_CVE20200796 | Windows SMBv3客户端/永痕之黑漏洞复现
  5. ubuntu 14.04 安装minidwep-gtk
  6. PPT(office365)之背景图片、矢量图标、颜色搭配使用心得
  7. java 坐标纠偏_[Java教程]Java百度地图经纬度纠偏
  8. C#时间格式转换时间戳
  9. 乔治城大学 计算机排名,乔治城大学计算机科学硕士排名第40(2020年TFE Times排名)...
  10. win7设置自动关机
  11. 爬虫——爬取京东评价
  12. linux 6 dns,RHEL6下搭建DNS服务器
  13. 2021湖北省普通高考成绩查询果,2021年湖北高考体检时间项目及体检结果查询公布时间...
  14. html字体插件,20款jQuery CSS文字特效插件(有图有真相)
  15. vue拦截器刷新登陆页面_Vue + Spring Boot 项目实战(六):前端路由与登录拦截器-Go语言中文社区...
  16. linux系统安全和应用!
  17. LTR问题 position debias方法
  18. python大数据好不好学_大数据好学吗?想转行大数据??
  19. docker实现quagga_docker和Quagga BGP
  20. 小程序之统计网页访问人数

热门文章

  1. SpiderViewer - 远程桌面客户端
  2. 路由器有信号无网络连接到服务器,路由器信号满格但是没有网络怎么办
  3. 网络文件系统——上(samba,NFS,实现网络共享文件)
  4. 大一时写的东西 哈哈~~~~~~~~~~~~
  5. RabbitMQ的流量控制策略
  6. D3D9利用顶点缓冲区绘制三角形
  7. Maven介绍,IDEA安装和配置maven和maven指令
  8. 论文进入SCI、Ei等国际检索系统的意义(转贴)
  9. 深入理解机器学习——类别不平衡学习(Imbalanced Learning):常用技术概览
  10. 媒体领域AI能力测评,黑白图像上色、一键微笑哪家强