リストのカスタムドローで文字色が変わらない(win2000)

[戻る]
ちゃっぴ 2008/10/01(水) 09:54:11
VC2003で開発しています。

ダイアログに貼り付けたCListCtrlをカスタムドローにしています。
カスタムドローの内容は、リストの4列目のみ、
フォントと文字色を変えるというものです。

WindowsXPだと上手く表示されるのですが、
Windows2000ですと、文字色が変更されず黒文字で表示されてしまいます。
(フォントの変更は上手くいっているので、ますますナゾです。)

カスタムドローの部分のコードは、以下のような感じです。
void CAAADlg::OnNMCustomdrawLitAgent(NMHDR *pNMHDR, LRESULT *pResult)
{
        LPNMCUSTOMDRAW        pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
    LPNMLVCUSTOMDRAW    pLVCD = (LPNMLVCUSTOMDRAW)pNMCD;
    
    switch(pNMCD->dwDrawStage){
        case CDDS_PREPAINT:{
            // 各アイテムの描画時に通知を要求する
            *pResult = CDRF_NOTIFYITEMDRAW;                        
            break;
                           }
        case CDDS_ITEMPREPAINT:{            
            // 各サブアイテムの描画時に通知を要求する
            *pResult = CDRF_NOTIFYSUBITEMDRAW;
            break;
                               }
        case CDDS_ITEMPREPAINT | CDDS_SUBITEM :{
            // 各サブアイテムの描画
            if(pLVCD->iSubItem == 3 &&
                m_lst.GetItemText((int)pNMCD->dwItemSpec, pLVCD->iSubItem).GetLength() > 0){
                if(m_pFont == NULL){
                    // URL/メールアドレス用のフォントを作成
                    LOGFONT    lf;
                    m_lst.GetFont()->GetLogFont(&lf);
                    lf.lfUnderline = TRUE;                    
                    m_pFont = new CFont();
                    m_pFont->CreateFontIndirect(&lf);
                }
                                // 文字色を青に
★                pLVCD->clrText = RGB(0,0,255);
                HFONT hFont = (HFONT)::SelectObject(pLVCD->nmcd.hdc, m_pFont->m_hObject); 
                *pResult = CDRF_NEWFONT;
            }else{
                *pResult = 0;
            }
            break;
                                               }
        default :{
            *pResult = 0;
            break;
                 }
    }
}

Windows2000でデバッグし、★の箇所が実行されることは確認しました。
原因をご存知の方がいらっしゃいましたら、是非教えてください。

仲澤@失業者 2008/10/01(水) 11:49:04
★のところで
::SetTextColor( pLVCD->nmcd.hdc, RGB(0,0,255));
してみてはどうでしょう。フォントも選択していることだし。

ちゃっぴ 2008/10/01(水) 13:34:34
ご回答ありがとうございます。

>::SetTextColor( pLVCD->nmcd.hdc, RGB(0,0,255));

で試してみたのですが、WinXP・Win2000とも黒文字で表示されてしまいます。。。
ちなみに、「SetTextColor」の戻り値は、失敗した場合の「CLR_INVALID」ではなく、
「0」でした。

らら 2008/10/01(水) 14:36:40
カスタムドローの関数をCListCtrlの派生のクラス内で実装している
ソースがありましたので、ちゃっぴさんのソースをコピペし、
CListCtrlの派生のクラス内なので、m_lst.をなくして実行したところ、
(ダイアログにカスタムドロー関数を置いたのではないので、ちゃっぴさん
のとは少し違いますが)XPでも2000でも文字色は変わりました。
ただ、開発環境はVC2005です。

回答にならないかもしれませんが、
以前、VC2003で作成したプログラムが、コンパイルするPCのOSや、
実行時のOSや環境などにより、動作不具合が多々ありましたので、
今はVC6 か VC2005でしか作成していません。
また、VC2003のソースをそのままVC2005でコンパイルできたりもしますが、
APP初期化関数のあたりが違うので、できれば最初からVC2005で作成された
ほうがよいと思います。
※VC2003については、あくまでも個人的な感想であり、VC2003を普通に
使用されている方でお気を悪くされたら申し訳ございません。

仲澤@失業者 2008/10/01(水) 14:41:29
もしかして、カッコが合っていないだけとか。
default:の前の } とbreak;の順番が逆ではありませんか。

            break;   // <-ここと
            }    // <-ここ
        default :{
            *pResult = 0;
            break;
                 }

関係ないかもしれませんが。

... 2008/10/01(水) 15:55:04
>もしかして、カッコが合っていないだけとか。
数&位置共に合っている様子ですよ。

ちゃっぴ 2008/10/01(水) 16:09:58
ららさん>

ご回答ありがとうございました。
開発環境が関係するかもしれないのですね。。。
後で試しにVC2005でやってみます。
ちょっと時間がかかるかもしれませんが、結果を書き込みます。

仲澤さん>

再度ご回答いただき、ありがとうございます。
ご指摘いただいた括弧ですが、default:の前の }は、 
case CDDS_ITEMPREPAINT | CDDS_SUBITEM :{
に対応している括弧なので順番は合っていると認識しています。

仲澤@失業者 2008/10/01(水) 16:15:16
ですねぇ。失礼しました。

subaru 2008/10/01(水) 16:30:32
VC2005+Win2kで試したところ、ちゃっぴさんと同様の結果になりました。
ただ、★の箇所でRGB(0,0,255)以外の色を指定するだけで
正常に描画されるのでますますナゾです。。。

ちゃっぴ 2008/10/01(水) 17:01:25
[[解決]]
ららさん>

VC2005で新規でプロジェクトを作成し、
同じようなダイアログを表示し試してみました。
文字色をRGB(0,0,255)と指定した場合、やはり黒文字で表示されました。
しかし、別の方がご指摘されたように、文字色を別な色で指定した場合、
その色で表示されます。

subaruさん>

ご回答ありがとうございました。
ご指摘のように、★の箇所で青色文字とするためにRGB(0,0,255)とすると、
黒文字の表示になってしまうだけで、
同じ青系でもRGB(0,0,238)とすると、見事青文字で表示されました!

ちなみに、VC2005+win2000、VC2003+Win2000のどちらでも同じ結果でした。
RGB値が少し違くとも、見た目なんてホボ変わりないので、
RGB(0,0,238)とすることで解決とします。

こんなことで解決するとは、信じられない気分です。。。
本当に助かりました。

なぜ、RGB(0,0,255)だと黒文字になるのか、気になりますが、
時間がないので原因の究明は省略します。

みなさん、ありがとうございました。

らら 2008/10/09(木) 11:17:33
解決済みですが、ちょっと気になったので・・・

前回、らら側のテストでは、CListCtrlの派生クラス内でカスタムドローしていた
という違いもあったので、気になっていて、今更ですが、ちゃっぴさんと
同じように親ダイアログ内でカスタムドローをするものを作成してみました。
結果的に★のところは、pLVCD->clrText = RGB(0,0,255);
で、ちゃんと青ででました。

ららのところの環境は、
VC2005 + WinXP Professional SP2 です。

Win2000ではありませんので、やっぱそういうような環境による
何かの不具合なんでしょうかねぇ?^^;

以上、解決されて随分たっているのに失礼しました。

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