如何避免控件在 CDialog 中闪烁(MFC C++)
How to avoid controls flickering in a 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);
}
此 class 继承自 CDialog,然后它本身将成为其他对话框的基础 class 以控制“主题”。
然而,当我在鼠标移动事件中使 window 无效然后更新时
void CCustomDialog::OnMouseMove(UINT nFlags, CPoint point)
{
m_interator++;
Invalidate();
UpdateWindow();
CDialog::OnMouseMove(nFlags, point);
}
Ellipse 根本不闪烁,但所有其他按钮、标签和编辑控件都会闪烁。
我还没有找到任何方法来避免这种情况,而且我自己对 MFC 的了解还不够,无法避免这种情况。
有什么想法吗?
我在想也许我可以将控件的 DC 设置为相同的 CMemDC,但我还不确定该怎么做,如果我想通了,我会 post 在这里。
您可以在对话框资源中设置样式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
你好我这几天一直在寻找如何避免控件本身在 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);
}
此 class 继承自 CDialog,然后它本身将成为其他对话框的基础 class 以控制“主题”。
然而,当我在鼠标移动事件中使 window 无效然后更新时
void CCustomDialog::OnMouseMove(UINT nFlags, CPoint point)
{
m_interator++;
Invalidate();
UpdateWindow();
CDialog::OnMouseMove(nFlags, point);
}
Ellipse 根本不闪烁,但所有其他按钮、标签和编辑控件都会闪烁。
我还没有找到任何方法来避免这种情况,而且我自己对 MFC 的了解还不够,无法避免这种情况。
有什么想法吗?
我在想也许我可以将控件的 DC 设置为相同的 CMemDC,但我还不确定该怎么做,如果我想通了,我会 post 在这里。
您可以在对话框资源中设置样式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