首页 > 解决方案 > MFC:如何为继承的 CDialogBar 正确修复重绘?

问题描述

我从 CDialogBar 创建了一个继承类。

class CMyDialogBar : public CDialogBar
{
    DECLARE_DYNAMIC(CMyDialogBar)

    // Implementation
public:
    BOOL Create(CWnd * pParentWnd, UINT nIDTemplate, UINT nStyle, UINT nID);
    BOOL Create(CWnd * pParentWnd, LPCTSTR lpszTemplateName, UINT nStyle, UINT nID);

protected:
    virtual void DoDataExchange(CDataExchange* pDX) { return CDialogBar::DoDataExchange(pDX); }
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    DECLARE_MESSAGE_MAP()
};

唯一的大变化是功能OnEraseBkgnd(),因为我喜欢背景是白色的。

BOOL CMyDialogBar::OnEraseBkgnd(CDC* pDC)
{
    return TRUE;
}

它工作正常。但是,当我移动钢筋时,它不会正确重绘,如下图所示。

在此处输入图像描述

源代码可以在这里下载:https ://138.197.210.223/test/My.zip 。

标签: visual-studiovisual-c++mfc

解决方案


你需要你的OnEraseBkgnd覆盖才能真正擦除背景!例如,要将整个客户矩形设置为白色,您可以这样做:

BOOL CMyDialogBar::OnEraseBkgnd(CDC *pDC)
{
    RECT wr; GetClientRect(&wr);
    pDC->FillSolidRect(&wr, RGB(255,255,255));
    return TRUE;
}

编辑:也许你已经有了这个,但也一定要添加ON_WM_ERASEBKGND到你的消息映射:

BEGIN_MESSAGE_MAP(CMyDialogBar, CDialogBar)
    // ... (other message handlers, if any) ...
    ON_WM_ERASEBKGND()
END_MESSAGE_MAP()

推荐阅读