Изменить цвет текста и фона из производного класса CEdit - PullRequest
2 голосов
/ 11 июня 2019

У меня есть производный класс от CEdit, и я хочу изменить цвет текста и фона.Я пытался с сообщениями ON_WM_CTLCOLOR_REFLECT и ON_WM_CTLCOLOR, но я никогда не получаю эти сообщения.Есть ли другая опция, кроме ON_PAINT?

Вот как я инициализирую свой CColorEdit элемент управления:

//in my dialog.h
CColorEdit m_test;
//in .cpp
DDX_Control(pDX, IDC_TEST, m_test);

Я не могу установить цвет вручную следующим образом:

m_test.SetTextColor(...);

Вот как я пытался справиться ON_WM_CTLCOLOR:

BEGIN_MESSAGE_MAP(CColorEdit, CEdit)
    ON_WM_CTLCOLOR()
END_MESSAGE_MAP()

HBRUSH CColorEdit::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CEdit::OnCtlColor(pDC, pWnd, nCtlColor);
    if (m_theme != 0)
    {
        pDC->SetTextColor(RGB(0, 255, 0));
    }
    return hbr;
}

Вот моя попытка с WM_CTLCOLOR_REFLECT:

BEGIN_MESSAGE_MAP(CColorEdit, CEdit)
    //{{AFX_MSG_MAP(CColorEdit)
    ON_WM_CTLCOLOR_REFLECT()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CColorEdit::SetTextColor(COLORREF textColor)
{
    m_textColor = textColor;
    Invalidate();
}
void CColorEdit::SetBkColor(COLORREF backgroundColor)
{
    m_backgroundColor = backgroundColor;
    m_brBkgnd.DeleteObject();
    m_brBkgnd.CreateSolidBrush(backgroundColor);
    Invalidate();
}

HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
    pDC->SetBkColor(m_backgroundColor);
    pDC->SetTextColor(m_textColor);

    if (nCtlColor)       // To get rid of compiler warning
        nCtlColor += 0;

    return hbr;
}

Thx.

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Смотрите здесь . Цитировать:

Для меня было настоящим вызовом сделать простое изменение цвета фона для CEdit. Я был удивлен, узнав, что для этого нет стандартной функции, например CEdit::SetBkColor.

Первый шаг - создать класс, производный от CEdit, и объявить функцию CtlColor:

// CustomEdit.h
class CCustomEdit : public CEdit
{
protected:
  HBRUSH CtlColor(CDC *pDC, UINT);
  DECLARE_MESSAGE_MAP()
};

Второе, hhandle WM_CTLCOLOR_REFLECT Событие:

// CustomEdit.cpp
BEGIN_MESSAGE_MAP(CCustomEdit, CEdit)
  ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()

HBRUSH CCustomEdit::CtlColor(CDC *pDC, UINT)
{
  COLORREF bkColor = RGB(255, 255, 255);
  pDC->SetBkColor(bkColor);
  return CreateSolidBrush(bkColor);
}

Так что вам нужно использовать оба из них!

0 голосов
/ 12 июня 2019

Если вы создали класс CColorEdit только для выполнения этого вида цветного рисования, это не было необходимо, потому что вы можете просто обработать сообщения WM_CTLCOLOR в родительском окне.На самом деле это сообщение WM_CTLCOLOREDIT (WM_CTLCOLOR использовалось в старых версиях Windows), однако MFC отображает все сообщения WM_CTLCOLORxxxx в обработчик ON_WM_CTLCOLOR и передает тип элемента управления в качестве параметра.

Здесьэто некоторый код:

#define COLOR_YELLOW RGB(255,255,0)
HBRUSH hBrYellow = []() { return CreateSolidBrush(COLOR_YELLOW); }();

HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    // Our custom edit-control
    if (nCtlColor == CTLCOLOR_EDIT && pWnd->GetDlgCtrlID() == IDC_MYCUSTOMEDIT)
    {
        pDC->SetBkColor(COLOR_YELLOW);
        return hBrYellow;
    }

    // All the rest
    return CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
}

В этом примере кода цвет фона элемента управления редактированием устанавливается на желтый.Элемент управления для редактирования представляет собой простое и стандартное окно редактирования Windows, не требующее подклассов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...