リストビューのバックを点滅表示

解決


ガロダム  2007-09-16 12:52:34  No: 66368

リストビューの文字のバックを点滅表示させる場合は
どうしたらいいですか?
たとえば文字が1000だったのが
1200になったとき
文字が黒バックが赤
0.2秒後に
文字が赤
バックが黒という風に
表示させたいのですが、
どうしたらよろしいのでしょうか?
どなたかヒントでもいいので教えてくださいませんか?

MFCのVC++2005


Blue  2007-09-16 13:25:32  No: 66369

リストビューはレポート形式?

点滅対象は行全体?

点滅はずっと?

とりあえず、カスタムドローで特定のアイテムの色を変えれるようにして、

>たとえば文字が1000だったのが
>1200になったとき
の対象アイテムが特定できるように情報をどこかに保持させる
→たぶんここがプログラマの腕の見せ所かと。

あとはタイマーイベントを使ってリストビューを再描画させる。


Blue  2007-09-16 14:00:20  No: 66370

サンプル

ダイアログ上に
・リストビュー
・ボタン
がある場合、プロパティウィンドウからメッセージを追加

ダイアログ(メッセージ)
・WM_TIME→OnTime
リストビュー(管理イベント)
・NM_CUSTOMDRAW→OnNMCustomdrawList1
ボタン(管理イベント)
・BN_CLICKED→OnBnClickedButton1

ダイアログのメンバ変数として
    int m_row;  // 対象行
    int m_count;// 点滅回数
を追加。

ボタンを押すと2行目全体が[赤黒]→[黒赤]→[赤黒]→[黒赤]→[白黒]と色が変わる。
SetItemData(カスタムドロー時のpNMLVCD->nmcd.lItemlParam)を使って色をどれにするかの状態を決めています。
・0→[白黒](デフォルト)
・1→[赤黒]
・2→[黒赤]

BOOL CXXXXDlg::OnInitDialog()
{
    (省略)
    // TODO: 初期化をここに追加します。
    CListCtrl* pList = static_cast<CListCtrl*>(this->GetDlgItem(IDC_LIST1));
    pList->InsertColumn(1, _T("AAAA"), 0, 100);
    pList->InsertColumn(2, _T("BBBB"), 0, 100);
    int n;
    n = pList->InsertItem(0, _T("aaaa"));
    pList->SetItemText(n, 1, _T("bbbb"));
    n = pList->InsertItem(0, _T("cccc"));
    pList->SetItemText(n, 1, _T("dddd"));
    n = pList->InsertItem(0, _T("eeee"));
    pList->SetItemText(n, 1, _T("ffff"));
    n = pList->InsertItem(0, _T("gggg"));
    pList->SetItemText(n, 1, _T("hhhh"));

    return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}

void CListTestDlg::OnNMCustomdrawList1(NMHDR *pNMHDR, LRESULT *pResult)
{
    //LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
    // TODO: ここにコントロール通知ハンドラ コードを追加します。
    LPNMLVCUSTOMDRAW pNMLVCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);

    switch(pNMLVCD->nmcd.dwDrawStage)
    {
    case CDDS_PREPAINT:
        *pResult = CDRF_NOTIFYSUBITEMDRAW;
        break;
    case CDDS_ITEMPREPAINT:
        *pResult = CDRF_NOTIFYSUBITEMDRAW;
        break;
    case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
        *pResult = CDRF_DODEFAULT;

        switch (pNMLVCD->nmcd.lItemlParam)
        {
        case 1:
            pNMLVCD->clrText = RGB(0x00, 0x00, 0x00);
            pNMLVCD->clrTextBk = RGB(0xff0, 0x00, 0x00);
            *pResult = CDRF_NEWFONT;
            break;
        case 2:
            pNMLVCD->clrText = RGB(0xff, 0x00, 0x00);
            pNMLVCD->clrTextBk = RGB(0x00, 0x00, 0x00);
            *pResult = CDRF_NEWFONT;
            break;
        }
        break;
    default:
        *pResult = CDRF_DODEFAULT;
        break;
    }
    //*pResult = 0;
}

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

void CListTestDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
    if (nIDEvent == 1)
    {
        CListCtrl* pList = static_cast<CListCtrl*>(this->GetDlgItem(IDC_LIST1));
        if (this->m_count == 4)
        {
            pList->SetItemData(this->m_row, 0);
            this->KillTimer(nIDEvent);
        }
        else
        {
            pList->SetItemData(this->m_row, this->m_count++ % 2 ? 2 : 1);
        }
    }
    CDialog::OnTimer(nIDEvent);
}

なお、
>this->SetTimer(1, 200, NULL);

>・0→[白黒](デフォルト)
>・1→[赤黒]
>・2→[黒赤]
は直接値(いわゆるマジックナンバー)をソースコードで使っているので、本来ならenumや#defineで定義した
値を使ったほうが良いでしょう。


ガロダム  2007-09-17 04:04:00  No: 66371

Buleさん
親切にどうも教えてくださってサンクスです。
ついでに質問といってはなんですが、
行単位ではなくアイテム単位で点滅させたいのですがどうしたら
いいのでしょうか?
上記のコードを↓のように変更しましたが、
つられて他のアイテムも点滅してしまっているようなのです。
どうしたらよろしいですか?
  case 1:
    if(pNMLVCD->nmcd.dwItemSpec==0 && pNMLVCD->iSubItem==1)
    {
            pNMLVCD->clrText = RGB(0,0,0);
            pNMLVCD->clrTextBk = RGB(255,0,0); //赤色
            *pResult = CDRF_NEWFONT;
            break;
    }
        case 2:
    if(pNMLVCD->nmcd.dwItemSpec==0 && pNMLVCD->iSubItem==1)
    {
            pNMLVCD->clrText = RGB(255,0,0); //赤色
            pNMLVCD->clrTextBk = RGB(0,0,0);
            *pResult = CDRF_NEWFONT;
            break;
    }


Blue  2007-09-17 06:58:09  No: 66372

http://www24.cds.ne.jp/~neg/pro/piyo1/clc/custom.html
を参考にしてみてください。


ガロダム  2007-09-17 07:24:37  No: 66373

サンクスです!見事悩み解消しました!
わざわざどうもです。
それではこれにて失礼させて頂きます!


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

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






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