リストビューの好きな列の点滅表示

解決


ガロダム  2007-09-18 18:19:21  No: 66380  IP: 192.*.*.*

http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200709/07090039.txt
先日の続きなのですが、
1列目を点滅させることはできますが。
他の列を点滅させること方法が分からないことに
気づきました。
どなたか教えてくださいませんか?

MFC  Visual C++2005

編集 削除
Blue  2007-09-18 18:54:36  No: 66381  IP: 192.*.*.*

なぜ?

私のサンプルでは好きな列を指定することが出来ていますよ?

>pList->SetItemData(this->m_row, 0);
SetItemDateの第一引数で決めている。
OnNMCustomdrawList1はpNMLVCD->nmcd.lItemlParamが1か2のときだけ動く。
列は見ていない。

編集 削除
ガロダム  2007-09-18 19:15:08  No: 66382  IP: 192.*.*.*

>SetItemDateの第一引数で決めている。
のは行ですよね?
ここを1,や2に変えると
2,3行目がかわるのはわかりました。
でも列でいうところの0列目の2,3行目が点滅するんです。
列の1列や2列を点滅させるにはどうしたらよろしいんですか?
なんか間違ってますかね?

編集 削除
ガロダム  2007-09-18 19:28:16  No: 66383  IP: 192.*.*.*

pNMLVCD->iSubItemの値をみても0しかきてないみたいです。
なぜかボクの書いたコードでは0列しか点滅してません。
Blueさんの説明だと行全体が点滅すると書いてあるのに?
ん?なぜなんだ?

編集 削除
Blue  2007-09-18 19:34:26  No: 66384  IP: 192.*.*.*

あー列だったのですね。
一番簡単なのは設定している1、2、0という値に列の情報ももたせるとか。

私なら、4バイトの上位2バイトは列情報、下位2バイトに色情報となるようにするかなぁ。

編集 削除
ガロダム  2007-09-18 19:44:45  No: 66385  IP: 192.*.*.*

>一番簡単なのは設定している1、2、0という値に列の情報ももたせるとか。
どういうことですか?
もう少し、詳しく教えていただけると!

編集 削除
Blue  2007-09-18 19:45:02  No: 66386  IP: 192.*.*.*

いっそのこと、itemdataを使わないで、
メンバ変数に行、列、色の情報をもったほうがわかりやすいかな。
暇があればまたサンプル書きますけど。

編集 削除
ガロダム  2007-09-18 19:49:03  No: 66387  IP: 192.*.*.*

お願いします!
できたら早くお願いします!
馬鹿チンでごめんなさい。
m(__)mm(_"_)mm(_@_)m,

編集 削除
Blue  2007-09-18 20:55:47  No: 66388  IP: 192.*.*.*

>できたら早くお願いします!
こういう回答者の都合を考えないようはことは言わないほうがいいです。
現に回答する気が萎えました。

とりあえず、どの列かをメンバ変数で覚えておけば一応はできます。


int m_col;

◎OnNMCustomdrawList1

switch (pNMLVCD->nmcd.lItemlParam)
{
case 1:
    if (pNMLVCD->iSubItem == this->m_col)
    {
        pNMLVCD->clrText = RGB(0x00, 0x00, 0x00);
        pNMLVCD->clrTextBk = RGB(0xff0, 0x00, 0x00);
        *pResult = CDRF_NEWFONT;
    }
    else if (pNMLVCD->iSubItem > this->m_col)
    {
        pNMLVCD->clrTextBk = ::GetSysColor(COLOR_WINDOW);
        pNMLVCD->clrText = ::GetSysColor(COLOR_WINDOWTEXT);
        *pResult = CDRF_NEWFONT;
    }
    break;
case 2:
    if (pNMLVCD->iSubItem == this->m_col)
    {
        pNMLVCD->clrText = RGB(0xff, 0x00, 0x00);
        pNMLVCD->clrTextBk = RGB(0x00, 0x00, 0x00);
        *pResult = CDRF_NEWFONT;
    }
    else if (pNMLVCD->iSubItem > this->m_col)
    {
        pNMLVCD->clrTextBk = ::GetSysColor(COLOR_WINDOW);
        pNMLVCD->clrText = ::GetSysColor(COLOR_WINDOWTEXT);
        *pResult = CDRF_NEWFONT;
    }
    break;
}
break;


void CXXXDlg::OnBnClickedButton1()
{
    // TODO: ここにコントロール通知ハンドラ コードを追加します。
    this->m_row = 2;
    this->m_col = 1;  // ☆
    this->m_count = 0;
    this->SetTimer(1, 200, NULL);
}

編集 削除
ガロダム  2007-09-18 21:23:35  No: 66389  IP: 192.*.*.*

>こういう回答者の都合を考えないようはことは言わないほうがいいです。
>現に回答する気が萎えました。
すいません、恐縮なこといってしまいましてm(__)mm

Blueさんの方法ぽいのも私も考えたんですが、
ちょっと私のプログラムがおかしいのかもしれませんが、
↑でもちょっと書いたんですが、
pNMLVCD->iSubItem の値が0しか来ないです。
よって1を指定しても無反応です。
Blueさんの説明では行全体が点滅するように
かいていますが私のプログラムでは0列しか点滅していません。
私のプログラムのせいかもしれないのですが。
いちど試して頂けませんか?
また何が原因か考えられたら教えてもらえるとありがたいです。

編集 削除
Blue  2007-09-18 22:21:25  No: 66390  IP: 192.*.*.*

もしかして、文字列が入っていない右側のことを言っていますか?

私の例は行全体といってもカラムが2列あればそこまでしか点滅しません。
そこまでやるとなるとカスタムドローではできないかも。

編集 削除
ガロダム  2007-09-19 01:18:30  No: 66391  IP: 192.*.*.*

すいません、返信遅れました。文字列は入っています。
Blueさんも分からないということはやはり。こちらのミスでしょうか?
なにか分かったら教えてください!

編集 削除
ガロダム  2007-09-19 03:21:59  No: 66392  IP: 192.*.*.*

Blueさん。
結果だけ申しますと、Blueさんのコードにはなんら問題ないことが
分かりました。
問題なのは自分の書いてるコードでした。
列が4列あるリストビューで1列目と3列目を
他の色に設定してます。一列目桃色,3列目水色。
それで3列目を点滅させたい場合、後に3列目水色にするコードが
点滅した動作をしたあとに再描画していて一見外からは何も変化してないように画面上から見えていたというのが原因でした。

一応原因が分かりましたので解決は押させていただきます。
ありがとうございました!しかし、回避法についてはまだ分かりかねちゃうので
お暇でしたらお教えして頂ければとありがたいです。
お手数かけて申し訳ございませんでした!!!!!
本当に申し訳ありません!
失礼します!

編集 削除
ガロダム  2007-09-19 04:00:59  No: 66393  IP: 192.*.*.*

何とか自力で描画も解決することができました!
Blueさん。
総合的に解決とさせて頂きます!
if(お騒がせしました!&&ありがとうございました!)
{
AfxMessageBox("♥♥♥♥♥♥♥");
}

編集 削除
ガロダム  2007-09-19 04:02:48  No: 66394  IP: 192.*.*.*

AfxMessageBoxの中はハートが七個ならんでると想像してください。
ハートの出し方わかんねーやw

編集 削除