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



你好,我已经研究了几天如何避免控件本身在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);
}

Ellipse根本不会闪烁,但所有其他按钮、标签和编辑控件都会闪烁

我还没有找到任何可以避免的东西,我自己对MFC的了解也不足以避免它。

有什么想法吗?

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

您可以在对话框资源中设置样式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

最新更新