CColorDialog()の実装について

[戻る]
vassili 2002/02/23(土) 14:37:34
初めまして.
"VC++"で検索していたら,こちらにたどり着きました.

質問ですが,現在VC++6.0(SP5/WinXP Pro)でエディタ(CEditView/SDI)を
作成しているのですが,カラーダイアログの実装がうまくいきません.
文字色を変更しようとすると,"Debug Assertion Failed!!"と
エラーがでた後で[エラーを無視]するとカラーが変更されます.
プロジェクトの名前をEDIT1とすると,コードは以下の通りです.

Edit1View.cpp
/////////////m_ed2はCEditView型
void CEdit1View::OnViewColor() 
{
    CColorDialog    myDlg(m_Text);
    if (myDlg.DoModal() == IDOK){
        m_Text = myDlg.GetColor();
        m_ed2.Invalidate(TRUE);
    }
    m_ed2.SetFocus();
}

///////////m_Text(文字色/COLORREF型)はCEdit1View::CEdit1View()で
//////////でデフォルトカラーを設定.
HBRUSH CEdit1View::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CEditView::OnCtlColor(pDC, pWnd, nCtlColor);
    
    // TODO: この位置で…    if (nCtlColor == CTLCOLOR_EDIT){
        if (pWnd == &m_ed2){
            pDC->SetTextColor(m_Text);
        }
    }
    // TODO: デフォルトのブラ…
    return hbr;
}

CdS 2002/02/23(土) 18:39:36
どの時点でASSERTが出るのでしょう?
ソース名と行番号が書いてあるはずなので、それをもとに原因を探りましょう。

なんとなくm_ed2が怪しそうですが...。

vassili 2002/02/24(日) 01:18:02
CdSさん,初めまして.お返事ありがとうございます.
ASSERTが出るのは,

File:afxwin2.inl
Line:126
と
File:winocc.cpp
Line:331
です.

ダイアログのEditBoxのテキストカラーを変更するときは
上記の方法で問題なく出来たのですが,何故でしょう?

僕も,「m_ed2をCEditView型」として定義している所が怪しいと
思ったのですが,具体的にどう怪しいのかが解りません.

CdS 2002/02/24(日) 13:17:38
SDIとかあまりよく分からないですが、WM_CTLCOLORではなく=WM_CTLCOLORをオーバーライドし
て

HBRUSH CEdit1View::CtlColor(CDC* pDC, UINT nCtlColor) 
{
    if(nCtlColor == CTLCOLOR_EDIT){
        pDC->SetTextColor(m_Text);
        pDC->SetBkMode(TRANSPARENT);
        return (HBRUSH)(COLOR_WINDOW + 1);
    }
    return NULL;
}

とでもすればいいのでは。Invalidateは
    GetEditCtrl().Invalidate(TRUE);
とでも。

>ソース名と行番号が書いてあるはずなので、それをもとに原因を探りましょう。
と書いたとおり、他人任せにせず、自分で調べるようにしてください。通常は
"C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC"
にソースがあります。

[E-Mail] 2002/02/25(月) 11:39:54
デバッグの仕方で一つ。

1.ASSERTのダイアログが出た時点で[ブレーク]でプログラムを一時停止。
2.[コールスタック]で自分のプログラムのどの部分が関連しているのか調査。
3.自分のプログラムの関連部分がわかったら関連している変数の値をチェック。

で、大抵原因はわかります。

古いスレッドには追加発言できません。