2010-04-06 3 views
1

J'ai utilisé la méthode surchargée suivante pour modifier la couleur du texte en rouge dans une zone de liste, dans une application de boîte de dialogue Visual C++ MFC. Lorsque je compile le programme en mode DEBUG, cela fonctionne parfaitement. Mais lorsque j'utilise le mode RELEASE, la couleur du texte ne change pas. Pourquoi est-ce et comment puis-je surmonter ce problème ??OnCtrlColor ne fonctionne pas?

Merci!

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

Est-ce le m_hRedBrush initialisé correctement dans les deux Debug et Release construit? – sharptooth

+0

Oui, j'ai vérifié cela aussi. Mais le problème persiste toujours :( – Isuru

+0

@Isuru Avez-vous déjà eu raison avec cela parce que j'ai aussi un problème avec cela? –

Répondre

3

Pouvez-vous essayer d'appeler l'implémentation de base CDialog::OnCtlColor avant votre code personnalisé, comme celui-ci:

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 fait quelques choses à l'interne qui est ignorée par votre return à l'intérieur de votre fonction. Ce n'est qu'une idée très vague mais j'ai toujours utilisé OnCtlColor de cette façon et je n'ai jamais eu de problème.

+0

Merci pour la réponse, je vais l'essayer :) – Isuru

5

Vous devez déclarer dans 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() 
0

Je dois utiliser les deux réponses précédentes pour le faire fonctionner.

  1. Je déclare poignée MESSAGE_MAP

    BEGIN_MESSAGE_MAP(CTrainMFCDlg, CDialog) 
    
        ON_WM_CTLCOLOR() // your handle 
    
    END_MESSAGE_MAP() 
    
  2. je CDialog::OnCtlColor avant mon code personnalisé:

    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; 
    }