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 に答える