Как программно изменить цвет CEdit? [Дубликат]

Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:

Случай с краем # 1: одновременный доступ к Словарю

Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference или даже (чаще) a KeyNotFoundException при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.

Случай с краем # 2: небезопасный код

Если код NullReferenceException задан кодом unsafe, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.

(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)

5
задан skiphoppy 18 December 2008 в 16:07
поделиться

2 ответа

Вы не можете сделать это с помощью простого CEdit, вам нужно переопределить несколько бит.

Внедрите свой собственный обработчик ON_WM_CTLCOLOR_REFLECT, затем верните цветной CBrush в обработчик:

( грубо говоря, вам нужно разместить обычное управление ресурсами там, rememebr, чтобы удалить кисть в деструкторе)

class CColorEdit : public CEdit
{
  ....
  CBrush   m_brBkgnd;
  afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor)
  {
    m_brBkgnd.DeleteObject();
    m_brBkgnd.CreateSolidBrush(nCtlColor);
  }
}
7
ответ дан gbjbaanb 1 September 2018 в 06:22
поделиться

Это также можно сделать без вывода CEdit:

  1. Добавить ON_WM_CTLCOLOR() в блок кода BEGIN_MESSAGE_MAP() вашего диалога.
  2. Добавить OnCltColor() в ваш диалог class:
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    
  3. Выполнить OnCtlColor() следующим образом:
    HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
        if ((CTLCOLOR_EDIT == nCtlColor) &&
            (IDC_MY_EDIT == pWnd->GetDlgCtrlID()))
        {
            return m_brMyEditBk; //Create this brush in OnInitDialog() and destroy in destructor
        }
        return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    }
    
4
ответ дан alex 1 September 2018 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: