2010-04-06 19 views
1

我使用下面的重載方法將文本顏色更改爲列表框中的Visual C++ MFC基於對話框的應用程序中的紅色。當我以DEBUG模式構建程序時,它完美地工作。但是當我使用RELEASE模式時,文字顏色不會改變。爲什麼是這個,我該如何克服這個問題?OnCtrlColor不工作?

謝謝!

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); 
} 
+0

是在m_hRedBrush在Debug和Release建立正確初始化? – sharptooth 2010-04-06 11:25:27

+0

是的,我也檢查過。但問題仍然存在:( – Isuru 2010-04-07 03:31:37

+0

@Isuru你是否曾經因此而來,因爲我也有這個問題? – 2013-08-30 05:54:24

回答

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,從來沒有問題。

+0

感謝您的回覆,我會試試:) – Isuru 2010-04-09 03:48:56

5

您必須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() 
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; 
    }