CEdit работает в ComCtrl32 версии 5.82, но не с 6.10 - PullRequest
1 голос
/ 21 марта 2020

Я хочу перенести проект MF C на текущие доступные ресурсы.

Я разрабатываю с помощью Microsoft Visual Studio Community.

В более старом проекте версия Windows SDK равна 10.0.15063.0

в новом проекте Windows SDK версия равна 10.0.17763.0

в более старом проекте используется версия ComCtrl32.dll 5.82

новый проект использует ComCtrl32.dll Версия 6.10

После обновления с SetWindowTextW (textp) используется * 1023 Элемент управления * CEdit показывает черный прямоугольник элемента управления

Если переместить курсор на элемент управления, он будет выглядеть как положено.

ValEdit.h:

class ValEdit : public CEdit
{
public:
    ValEdit();
    virtual ~ValEdit();
    int ZeroMeansInactiv;

protected:

    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    afx_msg void OnUpdate();

    DECLARE_MESSAGE_MAP()

private:

    COLORREF    m_TextColor;

    HBRUSH m_hBackgroundBrush;
    HBRUSH m_hBackgrInactivBrush;

};

ValEdit. cpp:

ValEdit::ValEdit()
{
    ZeroMeansInactiv = 1;
    m_TextColor = Black;
    m_hBackgroundBrush = CreateSolidBrush(RGB(255, 255, 255));
    m_hBackgrInactivBrush = CreateSolidBrush(RGB(90, 90, 90));
}

ValEdit::~ValEdit()
{
}

BEGIN_MESSAGE_MAP(ValEdit, CEdit)
    ON_WM_ERASEBKGND()
    ON_CONTROL_REFLECT(EN_UPDATE, OnUpdate)
END_MESSAGE_MAP()

BOOL ValEdit::OnEraseBkgnd(CDC* pDC) 
{
    RECT rc;
    this->GetClientRect(&rc);

    SetMapMode(*pDC, MM_TEXT);
    FillRect(*pDC, &rc, !!ZeroMeansInactiv ? m_hBackgroundBrush : m_hBackgrInactivBrush );
    return TRUE;
}

void ValEdit::OnUpdate() 
{
    RedrawWindow();
}

Спасибо за совет

Erhy

1 Ответ

0 голосов
/ 30 марта 2020

пожалуйста, мне нужны объяснения!

Я запрограммировал приложение шаг за шагом и нашел код, который отвечает за неисправность, что элемент управления CEdit не обновляется правильно.

HBRUSH CStyleToolkitDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    if (nCtlColor == CTLCOLOR_STATIC)
    {
        // We handle this message only if we have set the region
        BOOL bHandled = m_bIsRgnSet;
        if (bHandled)
        {
            HDC hDC = pDC->GetSafeHdc();
            SetBkMode(hDC, TRANSPARENT);
            return (HBRUSH)GetStockObject(HOLLOW_BRUSH); //causes the malfunction
        }
    }
    return hbr;
}

Если я исключу CEdit с

if (!pWnd->IsKindOf(RUNTIME_CLASS(CEdit)))
            return (HBRUSH)GetStockObject(HOLLOW_BRUSH);

, то элемент управления CEdit обновляется, как и ожидалось.

Спасибо за обсуждение

...