リストビューの文字のバックを点滅表示させる場合は
どうしたらいいですか?
たとえば文字が1000だったのが
1200になったとき
文字が黒バックが赤
0.2秒後に
文字が赤
バックが黒という風に
表示させたいのですが、
どうしたらよろしいのでしょうか?
どなたかヒントでもいいので教えてくださいませんか?
MFCのVC++2005
リストビューはレポート形式?
点滅対象は行全体?
点滅はずっと?
とりあえず、カスタムドローで特定のアイテムの色を変えれるようにして、
>たとえば文字が1000だったのが
>1200になったとき
の対象アイテムが特定できるように情報をどこかに保持させる
→たぶんここがプログラマの腕の見せ所かと。
あとはタイマーイベントを使ってリストビューを再描画させる。
サンプル
ダイアログ上に
・リストビュー
・ボタン
がある場合、プロパティウィンドウからメッセージを追加
ダイアログ(メッセージ)
・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で定義した
値を使ったほうが良いでしょう。
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;
}
http://www24.cds.ne.jp/~neg/pro/piyo1/clc/custom.html
を参考にしてみてください。
サンクスです!見事悩み解消しました!
わざわざどうもです。
それではこれにて失礼させて頂きます!
ツイート | ![]() |