実現したいこと
・作成した仮想リストコントロールで特定の行を変更したい
前提
Visual Studio 2019、MFCアプリケーションを作成しています。
今まで通常のリストコントロールを使用していた部分を仮想リストコントロールへ変更しようとした際に、通常のリストコントロールで出来ていた、特定の行の変更の方法ができなくなりました。
変更の際に以下のことを行いました。
1.リストコントロールのプロパティから所有者データをTRUEへ変更(オーナードローをTUREへ)
2.その後、SetText、SetItemText等の直接リストコントロールへ書き込みをしていた関数を削除、代わりに作成したデータ格納の構造体へ代入。
3.リストコントロールで、LVN_GETDISPINFOを呼び、データを格納した構造体からリストコントロールへ情報を代入
VC++
1BEGIN_MESSAGE_MAP(UISortListEx, CListCtrl) 2 ON_NOTIFY_REFLECT(LVN_GETDISPINFO, &UISortListEx::OnLvnGetdispinfo) 3END_MESSAGE_MAP()
VC++
1void UISortListEx::OnLvnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult) 2{ 3 //NMLVDISPINFO* pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR); 4 // TODO: ここにコントロール通知ハンドラー コードを追加します。 5 NMLVDISPINFO* pDispInfo = (NMLVDISPINFO*)pNMHDR; 6 LVITEM* pItem = &(pDispInfo)->item; 7 8 int i = pItem->iItem; 9 //int iSubItem = pDispInfo->item.iSubItem; 10 11 CString str; 12 13 if (pItem->mask & LVIF_TEXT) //valid text buffer? 14 { 15 switch (pItem->iSubItem) 16 { 17 case 0: 18 _tcscpy_s(pItem->pszText, pItem->cchTextMax, listCtrlMainDlg.strName[i]); 19 break; 20 case 1: 21 _tcscpy_s(pItem->pszText, pItem->cchTextMax, listCtrlMainDlg.strProcessedSec[i]); 22 break; 23 } 24 } 25
ここまでは問題なく、仮想リストコントロールへ変更ができていると思います。
この状態から仮想リストコントロールの特定の項目の処理が実行できません。
やりたいこととしては、case1:で選択している項目の変更を毎秒ごとに行いたいです。しかし、OnLvnGetdispinfo関数のcase1:までいくような条件で引数を渡すこともできません。
また、通常のリストコントロールで使用していたSet~の関数はエラーがでてしようできないため、項目を指定して変更ができません。
どのようにすれば、仮想リストコントロールの特定の項目を変更できるようになるでしょうか?
試したこと
・通常のリストコントロールで行っていたSet~の関数
→エラーが出て実行できない
・ListView_Set~の関数
→エラーはでないが、リストが変更されない
・OnLvnGetdispinfo関数を直接呼び出す
→下コードのように、NMLVDISPINFOからNMHDRへ変換を行おうとしたが、NMLVDISPINFO->itemのmaskやitemを設定時にエラーがでる。((1,1)の項目を指定して、変更したかった)
VC++
1 NMHDR* pNMHDR = NULL; 2 LRESULT* pResult = NULL; 3 4 NMLVDISPINFO* pDispInfo = NULL; 5 pDispInfo->item.mask = LVIF_TEXT; 6 pDispInfo->item.iItem = 1; 7 pDispInfo->item.iSubItem = 1; 8 pDispInfo->item.pszText = _T("TEST"); 9 10 pNMHDR = (NMHDR*)pDispInfo; 11 12 m_cListCtrlEx.OnLvnGetdispinfo(pNMHDR, pResult);
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/03/15 05:58