switch(lcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult=CDRF_NOTIFYSUBITEMDRAW;
break;
case CDDS_ITEMPREPAINT:。
lcd->clrText=RGB(255,255,255); //白
lcd->clrTextBk=RGB(0,0,0);//黒
*pResult=CDRF_NEWFONT;
*pResult=CDRF_NOTIFYSUBITEMDRAW;
break;
case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
*pResult=CDRF_DODEFAULT;
int 何 =lcd->nmcd.lItemlParam;
if(lcd->iSubItem==1)//
{
lcd->clrText=RGB(255,0,255); //赤紫
lcd->clrTextBk=RGB(0,0,0);//黒
*pResult=CDRF_NEWFONT;
}
if(lcd->nmcd.dwItemSpec== 1 && lcd->iSubItem==1)//上下
{
s上下 = メインリスト.GetItemText(1, 2);
if(s上下 == "〇")
{
lcd->clrText=RGB(255,0,0); //赤色
lcd->clrTextBk=RGB(0,0,0);//黒
*pResult=CDRF_NEWFONT;
}
if(s上下 == "×")
{
lcd->clrText=RGB(0,0,255); //青色
lcd->clrTextBk=RGB(0,0,0);//黒
*pResult=CDRF_NEWFONT;
}
}
if(lcd->iSubItem==2)
{
lcd->clrText=RGB(102,255,255); //水色
lcd->clrTextBk=RGB(0,0,0);//黒
*pResult=CDRF_NEWFONT;
}
default:
*pResult=CDRF_DODEFAULT;
break;
}
とういうコードを書いて2列目を〇×によって赤青に色分けしたいのですが、
実際には〇×判定したい行が130個あります。
冗長に書くなら
if(lcd->nmcd.dwItemSpec== 1 && lcd->iSubItem==1)//上下
{
s上下 = メインリスト.GetItemText(1, 2);
if(s上下 == "〇")
{
lcd->clrText=RGB(255,0,0); //赤色
lcd->clrTextBk=RGB(0,0,0);//黒
*pResult=CDRF_NEWFONT;
}
if(s上下 == "×")
{
lcd->clrText=RGB(0,0,255); //青色
lcd->clrTextBk=RGB(0,0,0);//黒
*pResult=CDRF_NEWFONT;
}
}
if(lcd->nmcd.dwItemSpec== 2 && lcd->iSubItem==1)//上下
{
s上下 = メインリスト.GetItemText(2, 2);
if(s上下 == "〇")
{
lcd->clrText=RGB(255,0,0); //赤色
lcd->clrTextBk=RGB(0,0,0);//黒
*pResult=CDRF_NEWFONT;
}
if(s上下 == "×")
{
lcd->clrText=RGB(0,0,255); //青色
lcd->clrTextBk=RGB(0,0,0);//黒
*pResult=CDRF_NEWFONT;
}
}
・・・・・
を繰り返していけばいいだけですが、
130個をコードを書いていては冗長だし大変だと思うのです。
しかも将来追加する可能性がありありです。
このコードを130個書かなくて短縮してコーディングする方法は無いものでしょうか?
MFC ヴィジュアルC++2005です
どなたかアドバイスをお願いします。
ソースはよく読んでませんが、どうしても繰り返しで書かないといけない時は、マクロを使って1つを1行で済ますようにすれば、130行で済む筈です。もちろん単純なマクロで表現できなければ、複雑怪奇なマクロを作ることになりますが。
ま、繰り返しで書かなくても済む方法があると思いますが、それは他の人にお任せします。
const int NumberOfFirst = 1;
const int NumberOfLast = 130;
for (int LineNumber = NumberOfFirst; LineNumber <= NumberOfLast; LineNumber++)
{
if (lcd->nmcd.dwItemSpec==LineNumber && lcd->iSubItem==1)//上下
{
s上下 = メインリスト.GetItemText(LineNumber, 2);
if (s上下 == "〇")
{
lcd->clrText=RGB(255,0,0); //赤色
lcd->clrTextBk=RGB(0,0,0);//黒
*pResult=CDRF_NEWFONT;
} else if (s上下 == "×")
{
lcd->clrText=RGB(0,0,255); //青色
lcd->clrTextBk=RGB(0,0,0);//黒
*pResult=CDRF_NEWFONT;
}
}
}
単純に考えれば、こんなものだろうけど、なんで他に回答がないんだろうか?
なにか見落としをしているのかな?
> ソースはよく読んでませんが、どうしても繰り返しで書かないといけない時は、マクロを使って1つを1行で済ますようにすれば、130行で済む筈です。もちろん単純なマクロで表現できなければ、複雑怪奇なマクロを作ることになりますが。
マクロは種々な弊害があります(特に関数マクロ)。できれば関数化しましょう。
関数化のオーバーヘッドがマクロの弊害を上回ることはまれです。
>なんで他に回答がないんだろうか?
答えるのも馬鹿らしい初歩的な質問だから
maruさん!ありがとうございます!
いわれてみればって!って感じです!
思い悩みすぎはいけませんね。最高です!解決です!
凄く感謝しています!ありがとうございました!
ツイート | ![]() |