0

我有一个带有两个列表控件和一个带有一些图形预览的自定义控件的对话框。

第一个有一个实体列表(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

4

0 回答 0