2 つのリスト コントロールと、いくつかのグラフィック プレビューを含む 1 つのカスタム コントロールを含むダイアログがあります。
1 つ目は 1 種類のエンティティ (1a、1b、1c、...) のリストを持ち、2 つ目は別の種類のエンティティ (2a、2b、2c、...) のリストを持ちます。選択する。
プレビューで強調表示される一連のエンティティをユーザーが選択できるようにしたいのですが、最後の選択が行われたリストからのみ選択できます。
例えば:
- 1a、1b、1c を選択 ->プレビューでハイライト
- 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
いつですか?