Изменить цвет только для чтения CEdit элемент управления Артефакты и выделение текста

У меня есть элемент управления Edit, который доступен только для чтения и содержит текст. Я хотел бы изменить серый фон по умолчанию на белый, но мне не повезло. Сначала я выполнял следующий код во время инициализации диалога:

CEdit *m_ctrlEditOne = (CEdit*) GetDlgItem(IDC_EDIT1);
CDC *m_ctrlEEditWee = m_ctrlEditOne->GetDC();
m_ctrlEEditWee->SetBkColor(RGB(255,0,0));
Invalidate(true);

Другое решение, которое я попробовал, было:

HBRUSH CTestingDlg::OnCtlColor(CDC* pDC, CWnd *pWnd, UINT nCtlColor)
{
if (pWnd->GetStyle() & ES_READONLY)
//if(pDC->GetRuntimeClass == & ES_READONLY)
{
    switch (nCtlColor)
    {
    case CTLCOLOR_STATIC:
        pDC->SetBkColor(RGB(255,255,255));
        return (HBRUSH)GetStockObject(NULL_BRUSH);
    default:
        //return NULL;
        return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    }
}
//return NULL;
return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}

На скриншоте ниже вы можете видеть, что текст вставляется после факта (это то, что должно произойти) и отображается подсвеченным синим - я понятия не имею, с чего начать, как сделать так, чтобы он просто выглядел как обычный, без выделения текст. При нажатии на него, он выглядит нормально. В левом нижнем углу каждого элемента редактирования можно увидеть квадрат, который там не должен появляться. Кроме того, вы можете увидеть некоторые артефакты того, что выглядит как выпадающий список со списком, появляющийся в больших полях.

Буду признателен за любые указания о том, как избавиться от артефактов и исправить проблему выделения с помощью вставленного текста.

1 ответ

Решение

Я делаю, как показано ниже. Он изменит фон элемента управления только для чтения IDC_EDIT1 на белый. Это копия из одного из моих проектов.

m_whitebrush является закрытым членом CTestOnCtlClorDlg типа HBRUSH и должен быть инициализирован в NULL в конструкторе CTestOnCtlClorDlg.

HBRUSH CTestOnCtlClorDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
  HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

  int id = pWnd->GetDlgCtrlID( ) ;

  if (id == IDC_EDIT1)
  {
    pDC->SetTextColor(RGB(0, 0, 0));
    pDC->SetBkColor(RGB(255,255,255));

    if (!m_whitebrush)
      m_whitebrush = CreateSolidBrush(RGB(255,255,255)) ;

    hbr = m_whitebrush ;
  } 

  return hbr;
}

void CTestOnCtlClorDlg::OnDestroy() 
{
  CDialog::OnDestroy();

  if (m_whitebrush !=NULL)
  {
    DeleteObject(m_whitebrush) ;
    m_whitebrush = NULL ;
  }
}
Другие вопросы по тегам