У меня есть диалог с двумя элементами управления списком и одним пользовательским элементом управления с некоторым графическим предварительным просмотром.
Первый имеет список объектов одного типа (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
?
Задача ещё не решена.
Других решений пока нет …