如何在CDialog(MFC C ++)中避免控件闪烁

3

你好,我已经寻找了几天如何避免CDialog中的控件自身闪烁。

我正在使用CMemDC并擦除背景以绘制一些基本形状,使用GDI+。

void CCustomDialog::OnPaint()
{
    CPaintDC pDC(this);
    CMemDC dc(&pDC);

    Gdiplus::Graphics graphics(dc.GetSafeHdc());

    CRect clip;
    dc.GetClipBox(&clip);
    dc.FillSolidRect(clip, GetSysColor(COLOR_WINDOW));

    DefWindowProc(WM_PAINT, (WPARAM)dc->m_hDC, (LPARAM)0);
    Gdiplus::Pen pen(Gdiplus::Color(150, 125, 255, 100), 5.0);
    graphics.DrawEllipse(&pen, 200, 50+m_interator, 100, 100);
}

这个类继承自CDialog,并将成为其他对话框控制"主题"的基类。
但是,当我在鼠标移动事件中使窗口失效并更新时。
void CCustomDialog::OnMouseMove(UINT nFlags, CPoint point)
{
    m_interator++;
    Invalidate();
    UpdateWindow();
    CDialog::OnMouseMove(nFlags, point);
}

椭圆形按钮没有闪烁,但其他所有按钮、标签和编辑控件都会闪烁。

我还没找到任何解决方法,而且我自己对MFC也不了解,无法避免它。

有什么建议吗?

我想也许我可以将控件的DC设置为相同的CMemDC,但我还不确定如何做到这一点。如果我想出来了,会在这里发布。


1
DefWindowProc(WM_PAINT, (WPARAM)dc->m_hDC, (LPARAM)0); - 看起来不对劲。这是想要实现什么功能? - IInspectable
2
尝试设置对话框资源的 WS_CLIPCHILDREN 样式。 - j6t
我从这里得到的,https://www.codeguru.com/cplusplus/flicker-free-drawing-of-any-control/移除它不会改变行为。 - Luka 1
@j6t 是的!!!!! 谢谢!!! 这么简单 :) 感觉自己像个傻瓜。 - Luka 1
1个回答

1
您可以在对话框资源中设置样式WS_CLIPCHILDREN,例如:
IDD_STEP_DLG DIALOGEX 0, 0, 344, 215
// here:
STYLE DS_SETFONT | DS_FIXEDSYS | WS_MAXIMIZEBOX | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    LTEXT           "Static",IDC_PREP_HISTOGRAM_PLACE,0,0,343,214,SS_NOTIFY | WS_TABSTOP
END

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接