win32画窗体背景
背景:
应产品需求将窗口加载时的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画窗体背景相关推荐
- java中窗体背景图片_Java Swing 之设置窗体背景图片
/** * 设置窗体背景图片 * @author gao */ package com.gao; import java.awt.Graphics; import java.awt.Image; im ...
- 解决Winform应用程序中窗体背景闪烁的问题
解决Winform应用程序中窗体背景闪烁的问题 参考文章: (1)解决Winform应用程序中窗体背景闪烁的问题 (2)https://www.cnblogs.com/candyzhmm/p/5961 ...
- Swing设置窗体背景图片
Swing设置窗体背景图片,简单的实现方法就是在窗体中放在一个JLabel标签组件,然后设置该标签的图标属性,最后设置该标签的大小与位置将其铺满窗体. // 设置背景 JLabel lblBackgr ...
- PyQt5_设置窗体背景透明和隐藏边框
窗口置顶.透明.去边框: self.setAttribute(Qt.WA_TranslucentBackground) # 窗体背景透明 self.setWindowFlags(Qt.WindowSt ...
- C#如何实现窗体背景颜色渐变?
如下图,如何才能实现窗体颜色渐变? 实现窗体颜色渐变需要用到Color结构的FormArgb方法,该方法可以重载. 实现的主要代码如下 using System; using System.Colle ...
- 使用button控件更改C#From窗体背景
使用button控件更改C#From窗体背景 // // // // 在网上找了很多资料比如 this.BackgroundImage = Image.FromFile(@"图片路径&quo ...
- MFC设置窗体背景图片的办法
1.导入位图 新建一个项目TestBackground 资源视图中右键点击TestBackground.rc,添加资源,bitmap,导入,导入一张bmp位图 在资源视图中多了一个Bitmap文件夹, ...
- java窗体背景图片_java 窗体设置背景图片问题 (附上登陆界面代码,我想加个背景图...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 java 窗体设置背景图片问题 (附上登陆界面代码,我想加个背景图片,求大神帮忙改改) package com.qx; import java.awt.D ...
- 正确在WPF中对Windows窗体背景进行设置
初次接触WPF,就被对窗体的背景图进行设置难住了.跟Winform区别很大, 如果没有正确设置的,会报错. 直接输入添加背景图片代码会弹出异常. <Window.Background> & ...
- 电视墙应该用什么画 让背景墙面更富有特色
客厅是家庭中非常重要的公共空间,它的装修至关重要.而在整个客厅中,电视背景墙的装修设计更是不容忽视的.了解过风水的人应该都知道,电视背景墙的装修除了要注意与客厅的装修格调保持一致外,还需要注重风水上的 ...
最新文章
- linux无人值守安装+PXE
- Python命令行参数解析模块getopt使用实例
- command模式 java_命令模式(Command)_java实现
- cve-2020-0796_CVE20200796 | Windows SMBv3客户端/永痕之黑漏洞复现
- ubuntu 14.04 安装minidwep-gtk
- PPT(office365)之背景图片、矢量图标、颜色搭配使用心得
- java 坐标纠偏_[Java教程]Java百度地图经纬度纠偏
- C#时间格式转换时间戳
- 乔治城大学 计算机排名,乔治城大学计算机科学硕士排名第40(2020年TFE Times排名)...
- win7设置自动关机
- 爬虫——爬取京东评价
- linux 6 dns,RHEL6下搭建DNS服务器
- 2021湖北省普通高考成绩查询果,2021年湖北高考体检时间项目及体检结果查询公布时间...
- html字体插件,20款jQuery CSS文字特效插件(有图有真相)
- vue拦截器刷新登陆页面_Vue + Spring Boot 项目实战(六):前端路由与登录拦截器-Go语言中文社区...
- linux系统安全和应用!
- LTR问题 position debias方法
- python大数据好不好学_大数据好学吗?想转行大数据??
- docker实现quagga_docker和Quagga BGP
- 小程序之统计网页访问人数