【问题标题】:MFC: how to fix redraw properly for inherited CDialogBar?MFC:如何为继承的 CDialogBar 正确修复重绘?
【发布时间】:2020-04-21 19:49:27
【问题描述】:

我从 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-studio visual-c++ mfc


    【解决方案1】:

    您需要您的 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()
    

    【讨论】:

      猜你喜欢
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 2011-05-03
      • 2011-04-19
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多