MF C: как правильно исправить перерисовку для унаследованного CDialogBar? - PullRequest
2 голосов
/ 21 апреля 2020

Я делаю унаследованный класс от 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;
}

Это работает ХОРОШО. Однако, когда я перемещаю арматуру вокруг, она перерисовывается неправильно, как показано на рисунке ниже.

enter image description here

Исходный код можно скачать здесь: https://138.197.210.223/test/My.zip.

1 Ответ

1 голос
/ 21 апреля 2020

Вам нужно переопределить 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()
...