0

2 つのリスト コントロールと、いくつかのグラフィック プレビューを含む 1 つのカスタム コントロールを含むダイアログがあります。

1 つ目は 1 種類のエンティティ (1a、1b、1c、...) のリストを持ち、2 つ目は別の種類のエンティティ (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