MFC 重绘背景 双缓冲 改变窗口大小时 窗口控件闪烁

「已注销」 2018-02-14 10:34:48
解决方案介绍:
MFC工程中,Dlg类中有个CImage变量 m_iImage, 在构造函数的时候Load了一张 .jpg 本地图片, 用于做Dlg的背景图片
同时Dlg中还有一些其他控件,我在 OnEraseBkgnd 中用 该图片 重绘了背景,在 OnSize 中设置了无效区域
程序运行后基本可实现 不闪烁, 但是 在 连续 快速 的拖动窗口大小时 Button Edit 等控件,还是会偶尔出现闪烁
(注: 背景图片是用的 拉伸)
另外想请教下 m_iImage.StretchBlt(pDC->m_hDC, ... ); 这一条语句 算不算 双缓冲呢?

以下是代码:

// 构造函数 加载了本地 jpg 图片 (多余的去掉了)
CMFCApplicationDlg::CMFCApplicationDlg(CWnd* pParent /*=NULL*/) : m_iImage.Load(L"f:/01.jpg"){ }

// 重绘背景
BOOL CMFCApplicationDlg::OnEraseBkgnd(CDC* pDC) {
static CRect rect;
GetClientRect(rect);
// 设置 拉伸 模式
SetStretchBltMode(pDC->m_hDC, COLORONCOLOR);
// 图片大小是 1440 * 900
m_iImage.StretchBlt(pDC->m_hDC, 0, 0, rect.Width(), rect.Height(),0,0,1440,900 );
return TRUE;
}
// 在改变 窗口大小的时候 设置 无效区域
void CMFCApplicationDlg::OnSize(UINT nType, int cx, int cy) {
CDialogEx::OnSize(nType, cx, cy);
// 设置无效区域,否则 拉伸窗口后 背景花屏
Invalidate( TRUE);
// 这一条语句 感觉作用不大 是否立刻刷新 问题都会出现
UpdateWindow();
}

欢迎各位大神留言, 指出问题所在.
提前祝各位 新春快乐!

...全文
993 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧