カスタムドローのコードを短く書くには?

解決


sinkutanku  2007-09-12 06:27:56  No: 66282

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です
どなたかアドバイスをお願いします。


むむむ  2007-09-12 06:42:22  No: 66283

ソースはよく読んでませんが、どうしても繰り返しで書かないといけない時は、マクロを使って1つを1行で済ますようにすれば、130行で済む筈です。もちろん単純なマクロで表現できなければ、複雑怪奇なマクロを作ることになりますが。

ま、繰り返しで書かなくても済む方法があると思いますが、それは他の人にお任せします。


maru  2007-09-13 04:18:28  No: 66284

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行で済む筈です。もちろん単純なマクロで表現できなければ、複雑怪奇なマクロを作ることになりますが。

マクロは種々な弊害があります(特に関数マクロ)。できれば関数化しましょう。
関数化のオーバーヘッドがマクロの弊害を上回ることはまれです。


モグラ  2007-09-13 09:31:19  No: 66285

>なんで他に回答がないんだろうか?
答えるのも馬鹿らしい初歩的な質問だから


sinkutanku  2007-09-13 13:44:01  No: 66286

maruさん!ありがとうございます!
いわれてみればって!って感じです!
思い悩みすぎはいけませんね。最高です!解決です!
凄く感謝しています!ありがとうございました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加