OnCtrlColor не работает? - PullRequest
       37

OnCtrlColor не работает?

1 голос
/ 06 апреля 2010

Я использовал следующий перегруженный метод, чтобы изменить цвет текста на красный в списке в приложении на основе диалогового окна Visual C ++ MFC. Когда я собираю программу в режиме отладки, она работает отлично. Но когда я использую режим RELEASE, цвет текста не меняется. Почему это так и как я могу преодолеть эту проблему ??

Спасибо !!

HBRUSH MyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
  if(nCtlColor == CTLCOLOR_LISTBOX)
  {
     if(bChangeTextColor)
     {
       pDC->SetTextColor(RGB(255, 0, 0));
       return m_hRedBrush;
     }
  } 
  return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}

Ответы [ 3 ]

6 голосов
/ 31 августа 2012

Вы должны заявить в MESSAGE_MAP

ex:

BEGIN_MESSAGE_MAP(CTrainMFCDlg, CDialog)
    ON_WM_SYSCOMMAND()    
    ON_WM_PAINT()    
    ON_WM_QUERYDRAGICON()    
    //}}AFX_MSG_MAP

    ON_WM_CTLCOLOR()  // your handle    
END_MESSAGE_MAP()
3 голосов
/ 07 апреля 2010

Можете ли вы попытаться вызвать базовую реализацию CDialog::OnCtlColor перед вашим пользовательским кодом, например:

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

    if(nCtlColor == CTLCOLOR_LISTBOX)
    {
        if(bChangeTextColor)
        {
            pDC->SetTextColor(RGB(255, 0, 0));
            hBrush=m_hRedBrush;
        }
    } 
    return hBrush;
}

CDialog::OnCtlColor делает что-то внутренне, что пропускается вашим return внутри вашей функции. Это очень расплывчатая идея, но я всегда использовал OnCtlColor таким образом, и у меня никогда не было проблем.

0 голосов
/ 17 февраля 2017

Мне нужно использовать оба предыдущих ответа, чтобы он заработал.

  1. Я объявил дескриптор в MESSAGE_MAP

    BEGIN_MESSAGE_MAP(CTrainMFCDlg, CDialog)
    
        ON_WM_CTLCOLOR()  // your handle
    
    END_MESSAGE_MAP()
    
  2. Я использовал CDialog::OnCtlColor перед моим пользовательским кодом:

    HBRUSH MyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
         HBRUSH hBrush=CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
         if(nCtlColor == CTLCOLOR_LISTBOX)
         {
              if(bChangeTextColor)
              {
                   pDC->SetTextColor(RGB(255, 0, 0));
                   hBrush=m_hRedBrush;
              }
        } 
        return hBrush;
    }
    
...