Информация об изменениях

Сообщение Re: Проблема с установкой цвета текста и фона бегущей строки от 18.01.2017 14:10

Изменено 18.01.2017 14:14 Evgeniy Skvortsov

Re: Проблема с установкой цвета текста и фона бегущей строки
Здравствуйте, RussianFellow, Вы писали:

  Код
void CMyStatic2::OnPaint()
{
  const MSG *msg = GetCurrentMessage();
  DefWindowProc(msg->message,msg->wParam,msg->lParam);
  RECT  rect;
  CClient  dc(this);
  GetClientRect(&rect);
  CBrush  brush(RGB(0,128,0)); // зелёный цвет фона
  dc.SelectObject(&brush);
  dc.FillRect(&rect,&brush);
  dc.SetTextColor(RGB(255,0,0)); // красный цвет текста
}


Можно конечно и так, но намного проще не отрисовку полностью руками делать, а просто обрабатывать WM_ONCTLCOLOR
HBRUSH CMFCApplication3Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {
    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
    if (pWnd->GetDlgCtrlID() == IDC_STATIC1) {
        // меняем цвет текста на красный
        pDC->SetTextColor(RGB(255, 0, 0));
        // меняем цвет фона на зелёный
        pDC->SetBkColor(RGB(0, 128, 0));
    }
    return hbr;
}
Re: Проблема с установкой цвета текста и фона бегущей строки
Здравствуйте, RussianFellow, Вы писали:

  Код
void CMyStatic2::OnPaint()
{
  const MSG *msg = GetCurrentMessage();
  DefWindowProc(msg->message,msg->wParam,msg->lParam);
  RECT  rect;
  CClient  dc(this);
  GetClientRect(&rect);
  CBrush  brush(RGB(0,128,0)); // зелёный цвет фона
  dc.SelectObject(&brush);
  dc.FillRect(&rect,&brush);
  dc.SetTextColor(RGB(255,0,0)); // красный цвет текста
}


Можно конечно и так, но намного проще не отрисовку полностью руками делать, а просто обрабатывать WM_ONCTLCOLOR в самом диалоге.
И не нужно никаких лишних классов.
HBRUSH CMFCApplication3Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) {
    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
    if (pWnd->GetDlgCtrlID() == IDC_STATIC1) {
        // меняем цвет текста на красный
        pDC->SetTextColor(RGB(255, 0, 0));
        // меняем цвет фона на зелёный
        pDC->SetBkColor(RGB(0, 128, 0));
    }
    return hbr;
}


WM_PAINT перекрывают обычно если нужно как-то кардинально изменить внешний вид контрола, а если просто цвет изменить, то WM_ONCTLCOLOR — самое то.