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

Orz--3 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();
}

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

...全文
827 1 收藏 回复
写回复
回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复

还没有回复,快来抢沙发~

相关推荐
发帖
Windows SDK/API
创建于2007-08-02

1206

社区成员

C++ Builder Windows SDK/API
申请成为版主
帖子事件
创建了帖子
2018-02-14 10:34
社区公告
暂无公告