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でデバッグし、★の箇所が実行されることは確認しました。
原因をご存知の方がいらっしゃいましたら、是非教えてください。
★のところで
::SetTextColor( pLVCD->nmcd.hdc, RGB(0,0,255));
してみてはどうでしょう。フォントも選択していることだし。
ご回答ありがとうございます。
>::SetTextColor( pLVCD->nmcd.hdc, RGB(0,0,255));
で試してみたのですが、WinXP・Win2000とも黒文字で表示されてしまいます。。。
ちなみに、「SetTextColor」の戻り値は、失敗した場合の「CLR_INVALID」ではなく、
「0」でした。
カスタムドローの関数をCListCtrlの派生のクラス内で実装している
ソースがありましたので、ちゃっぴさんのソースをコピペし、
CListCtrlの派生のクラス内なので、m_lst.をなくして実行したところ、
(ダイアログにカスタムドロー関数を置いたのではないので、ちゃっぴさん
のとは少し違いますが)XPでも2000でも文字色は変わりました。
ただ、開発環境はVC2005です。
回答にならないかもしれませんが、
以前、VC2003で作成したプログラムが、コンパイルするPCのOSや、
実行時のOSや環境などにより、動作不具合が多々ありましたので、
今はVC6 か VC2005でしか作成していません。
また、VC2003のソースをそのままVC2005でコンパイルできたりもしますが、
APP初期化関数のあたりが違うので、できれば最初からVC2005で作成された
ほうがよいと思います。
※VC2003については、あくまでも個人的な感想であり、VC2003を普通に
使用されている方でお気を悪くされたら申し訳ございません。
もしかして、カッコが合っていないだけとか。
default:の前の } とbreak;の順番が逆ではありませんか。
break; // <-ここと
} // <-ここ
default :{
*pResult = 0;
break;
}
関係ないかもしれませんが。
>もしかして、カッコが合っていないだけとか。
数&位置共に合っている様子ですよ。
ららさん>
ご回答ありがとうございました。
開発環境が関係するかもしれないのですね。。。
後で試しにVC2005でやってみます。
ちょっと時間がかかるかもしれませんが、結果を書き込みます。
仲澤さん>
再度ご回答いただき、ありがとうございます。
ご指摘いただいた括弧ですが、default:の前の }は、
case CDDS_ITEMPREPAINT | CDDS_SUBITEM :{
に対応している括弧なので順番は合っていると認識しています。
ですねぇ。失礼しました。
VC2005+Win2kで試したところ、ちゃっぴさんと同様の結果になりました。
ただ、★の箇所でRGB(0,0,255)以外の色を指定するだけで
正常に描画されるのでますますナゾです。。。
ららさん>
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)だと黒文字になるのか、気になりますが、
時間がないので原因の究明は省略します。
みなさん、ありがとうございました。
解決済みですが、ちょっと気になったので・・・
前回、らら側のテストでは、CListCtrlの派生クラス内でカスタムドローしていた
という違いもあったので、気になっていて、今更ですが、ちゃっぴさんと
同じように親ダイアログ内でカスタムドローをするものを作成してみました。
結果的に★のところは、pLVCD->clrText = RGB(0,0,255);
で、ちゃんと青ででました。
ららのところの環境は、
VC2005 + WinXP Professional SP2 です。
Win2000ではありませんので、やっぱそういうような環境による
何かの不具合なんでしょうかねぇ?^^;
以上、解決されて随分たっているのに失礼しました。