リストのカスタムドローで文字色が変わらない(win2000) – プログラミング – Home

リストのカスタムドローで文字色が変わら...
 
通知
すべてクリア

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


ちゃっぴ
 ちゃっぴ
(@ちゃっぴ)
ゲスト
結合: 17年前
投稿: 17
Topic starter  

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


引用未解決
トピックタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

★のところで
::SetTextColor( pLVCD->nmcd.hdc, RGB(0,0,255));
してみてはどうでしょう。フォントも選択していることだし。


返信引用
ちゃっぴ
 ちゃっぴ
(@ちゃっぴ)
ゲスト
結合: 17年前
投稿: 17
Topic starter  

ご回答ありがとうございます。

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

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


返信引用
らら
 らら
(@らら)
ゲスト
結合: 22年前
投稿: 93
 

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

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


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

もしかして、カッコが合っていないだけとか。
default:の前の } とbreak;の順番が逆ではありませんか。

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

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


返信引用
...
 ...
(@...)
ゲスト
結合: 22年前
投稿: 113
 

>もしかして、カッコが合っていないだけとか。
数&位置共に合っている様子ですよ。


返信引用
ちゃっぴ
 ちゃっぴ
(@ちゃっぴ)
ゲスト
結合: 17年前
投稿: 17
Topic starter  

ららさん>

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

仲澤さん>

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


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

ですねぇ。失礼しました。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

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


返信引用
ちゃっぴ
 ちゃっぴ
(@ちゃっぴ)
ゲスト
結合: 17年前
投稿: 17
Topic starter  

ららさん>

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)だと黒文字になるのか、気になりますが、
時間がないので原因の究明は省略します。

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


返信引用
らら
 らら
(@らら)
ゲスト
結合: 22年前
投稿: 93
 

解決済みですが、ちょっと気になったので・・・

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

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました