Как реагировать на уведомление LVN_ITEMCHANGED только тогда, когда пользователь заканчивает выбор действия при многократном выборе CListCtrl?

У меня есть диалог с двумя элементами управления списком и одним пользовательским элементом управления с некоторым графическим предварительным просмотром.

Первый имеет список объектов одного типа (1a, 1b, 1c,...), а второй содержит список объектов другого типа (2a, 2b, 2c,...), причем оба они являются Выбрать.

Я хочу разрешить пользователю выбирать набор объектов, которые будут выделены при предварительном просмотре, но только те из списка, где был сделан последний выбор.

Например:

  1. выберите 1a,1b,1c -> выделите их при предварительном просмотре
  2. выберите 2a,2b,2c -> выделить 1a, 1b, 1c и выделить 2a, 2b, 2c

Если я обработаю каждый LVN_ITEMCHANGED уведомление, предварительный просмотр будет мерцать, поэтому я хочу нарисовать предварительный просмотр, когда пользователь заканчивает выбор с помощью функции, подобной этой:

void CPreviewPage::PaintSelection(HWND hWnd)
{
  m_preview.DeselectAll();
  SelectArray select;
  if(hWnd == m_lstFirst.GetSafeHwnd())
  {
    for(int i = 0; i < m_lstFirst.GetItemCount(); i++)
    {
      if( m_lstFirst.GetItemState(i, LVNI_SELECTED) & LVNI_SELECTED)
      {
        Entity *pEnt = (Entity *) m_lstFirst.GetItemData(i);
        select.append(pEnt);
      }
    }
  }
  else
  if(hWnd == m_lstSecond.GetSafeHwnd())
  {
    for( int i = 0; i < m_lstSecond.GetItemCount(); i++ )
    {
      if( m_lstSecond.GetItemState(i, LVNI_SELECTED) & LVNI_SELECTED)
      {
        Entity *pEnt = (Entity *) m_lstSecond.GetItemData(i);
        select.append(pEnt);
      }
    }
  }
  m_preview.PaintSelect(&select);
}

Проблема в; когда я выбрал 2a, затем, удерживая клавишу shift, щелкнув 2c (чтобы выбрать 2a-2c), я получаю несколько LVN_ITEMCHANGED и не может определить, кто из них последний. Если бы я мог, тогда можно было бы перерисовать предварительный просмотр в нужный момент, когда пользователь заканчивает свое действие по выбору.

Я пытался вызвать функцию перекраски, когда я получаю LVNI_FOCUSED:

void CPreviewPage::OnLstSecondSelChanged(NMHDR *pNMHDR, LRESULT *pResult)
{
  NM_LISTVIEW* pNMListView = (NM_LISTVIEW*) pNMHDR;

  if((pNMListView->uChanged & LVIF_STATE) && (pNMListView->uNewState & LVNI_FOCUSED) )
    PaintSelection(pNMHDR->hwndFrom);
}

Тем не менее LVNI_FOCUSED не гарантированно будет последним, и я не хочу добавлять кнопку для вызова PaintSelection функция.

Итак, вопрос в том, когда наступит подходящий момент, когда у меня будет установлено состояние всех элементов в соответствии с выбором пользователя, чтобы я мог позвонить PaintSelection?

0 ответов

Другие вопросы по тегам