1

在基于 Visual C++ MFC 对话框的应用程序中,我使用以下重载方法将列表框中的文本颜色更改为红色。当我在 DEBUG 模式下构建程序时,它运行良好。但是当我使用 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);
}
4

3 回答 3

8

您必须在 MESSAGE_MAP 中声明

前任:

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()
于 2012-08-31T12:43:49.357 回答
3

您可以尝试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这种方式,从来没有遇到过问题。

于 2010-04-07T09:27:19.447 回答
0

我必须使用以前的两个答案才能使其正常工作。

  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;
    }
    
于 2017-02-17T13:42:25.393 回答