2010-04-06 8 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 디버그 및 릴리스 빌드 모두에서 제대로 초기화인가? – sharptooth

+0

네, 그 점도 확인했습니다. 그러나 문제는 여전히 지속되고 있습니다. ( – Isuru

+0

@ 이수 당신도 이것에 문제가있어서 당신도이 문제에 직면 했습니까? –

답변

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

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. 나는 내 사용자 지정 코드 전에 CDialog::OnCtlColor를 사용

    BEGIN_MESSAGE_MAP(CTrainMFCDlg, CDialog) 
    
        ON_WM_CTLCOLOR() // your handle 
    
    END_MESSAGE_MAP() 
    
  2. MESSAGE_MAP

    에 핸들을 선언

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