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

标签 c++ mfc controls gdi+ gdi

你好我这几天一直在寻找如何避免控件本身在 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

关于c++ - 如何避免控件在 CDialog 中闪烁(MFC C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71496512/

相关文章:

c++ - MFC 应用程序 DialogBased 使用 propertyPage,CDialog 的 DoModal() 不打开任何对话框

silverlight - 如何访问从模板化控件继承的控件中的命名元素

c++ - 如何调试 COM DLL

C++ 指针和引用数据类型

c++ - 有限状态机中的函数指针

visual-c++ - RC2176 : old DIB in res\MyApp. ico;在VC++ 2008中通过SDKPAINT传递它

.net - 帮助 <WinInet.h> API 中的 InternetOpenUrl 和 InternetReadFile

c++ - SFML 不会画任何东西?

delphi - Delphi自定义控件: A TRichEdit with a TLabel Above It

java - Java Web 框架世界中的 ASP.NET Login 控件相当于什么?