1

CMyListCtrl仮想データ モードとオーナー ドローです。LVN_GETDISPINFOコントロールがデータを必要とする場合、通知が送信されます。

以下のコードは、各行を複数回表示することを除けば正常に動作します。

ドキュメントには、アイテムのマスクのLVIF_DI_SETITEMフラグを設定すると、これは行われないと書かれています。ドキュメントには、私も行っpItem->iGroupIdた の前に を設定する必要があるとも書かInsertItemれていますが、コントロールには、挿入された各行に対して多くの行が表示されます。

void CMyListCtrl::OnLvnGetdispinfo(NMHDR *pNMHDR, LRESULT *pResult)
{
  NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);

  //Create a pointer to the item
  LV_ITEM* pItem= &(pDispInfo)->item;
  CString text, strippedText;

  //Does the control need text information?
  if( pItem->mask & LVIF_TEXT )
  {
    if(pItem->iSubItem == 0) // only first column used
    {
      text.Format( L"%s", cacheNotifyVect[ cacheNdx ] );

      //Copy the text to the LV_ITEM structure
      lstrcpyn(pItem->pszText, text, pItem->cchTextMax);
      pItem->mask |= LVIF_DI_SETITEM; // documentation says to set this so the list-view control will store the requested data and will not ask for it again. The application must set the iGroupid member of the LVITEM structure.
    }
  }

  *pResult = 0;
}

void CMyListCtrl::AddNotifyString(const CString & outListStr)
{
  cacheNotifyVect[ cacheNdx % CACHE_CAPACITY] = outListStr; // RT:130908: make cache round robin for notify
  LVITEM item;
  item.mask = LVIF_TEXT;
  item.iItem = cacheNdx++;
  item.iSubItem = 0;
  item.iGroupId = I_GROUPIDNONE; // so control will store data internally
  item.pszText = (LPTSTR)(LPCTSTR)( outListStr );
  outputWnd->outputNotify.InsertItem( &item );
4

1 に答える 1

0

item.mask を LVIF_TEXT に設定したため、iItem メンバーのみが監視され、iGroupId メンバーは無視されます。item.mask を LVIF_TEXT|LVIF_GROUPID に設定します。

于 2014-02-24T11:36:47.943 に答える