如何摆脱控件中的闪烁
How can i get rid of the flickering in my controls
Im使用基于MFC对话框的程序有一个activex资源管理器和2个编辑框。在OnPaint()上,我用BitBlt绘制了这样的背景图像:
CDC mTempDC;
CBitmap mBitmap;
mTempDC.CreateCompatibleDC(&dc);
mBitmap.CreateCompatibleBitmap(&dc, m_BMBackgroundSize.cx, m_BMBackgroundSize.cy);
mTempDC.SelectObject(&mBitmap);
// Background
{
CDC dcMemory;
dcMemory.CreateCompatibleDC(&mTempDC);
dcMemory.SelectObject(&m_BMBackground);
mTempDC.BitBlt(0,0,m_BMBackgroundSize.cx,m_BMBackgroundSize.cy,&dcMemory,0,0,SRCCOPY);
dcMemory.DeleteDC();
}
dc.BitBlt(0,0,m_BMBackgroundSize.cx, m_BMBackgroundSize.cy,&mTempDC,0,0,SRCCOPY);
mTempDC.DeleteDC();
在 OnMouseMove() 中,我检查鼠标是否在某个区域,如果是,我调用 Invalidate(1),每次我在某个区域移动鼠标时,程序都会开始闪烁。我确实尝试了OnEraseBkgnd返回TRUE,但没有运气。我发现的唯一解决方法是自己手动重绘编辑框,如下所示:
pCtrl = GetDlgItem(IDC_EDIT1);
pCtrlDC = pCtrl->GetDC();
mTempDC.BitBlt(5, 31, 580, 183, pCtrlDC, 0, 0, SRCCOPY);
我不确定这是否是这样做的好方法,但它有效,我用谷歌做了大量的研究和测试,长达 5 个小时,但没有运气:\
与其用 Invalidate
使整个窗口无效,只需使需要随InvalidateRect
更改的部分无效即可。
发生闪烁是因为在绘制背景时正在擦除和重绘编辑控件。如果它们位于无效矩形之外,则不会发生这种情况。
相关文章:
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 如何更改窗体上所有控件的标题?[C++生成器]
- 双击更改 mfc 中列表控件中的行的颜色
- 派生的 wxPanel 控件如何访问其中包含 wxDialog 中的数据?
- 如何从代码本身向 wxwidgets 中的文本控件插入字符?
- 如何在MFC中的静态文本控件上插入图标?
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 如何在Qt C++中向自定义控件添加属性?
- C/C++ 检测双击 TVItem 的常用控件
- 从C++标头中导入常量而不是硬编码它们:扩展 .net 控件?
- 控件不会在选择函数旁边移动
- MFC:我们能否扩展CEditView中存在的CEdit控件类行为
- 通过嵌入式 IWebBrowser2 控件中的链接打开 youtube 搜索失败
- 查找素数:错误:控件到达非void函数的末尾
- 当我移动跟踪栏时,如何防止控件(选项卡)闪烁和消失与Windows通用控件6.0?
- Win32 API:如何避免基本窗口控件的闪烁
- 避免在调整大小时移动控件的对话框上闪烁
- 如何摆脱控件中的闪烁