3

新しい (MFC Feature Pack) CVSListBox コントロールの 1 つをプロジェクトに追加しました。コントロール内のアイテムのリストは、アプリケーション内の他のオブジェクトによって追跡されるため、何かが変更されたときにリスト ボックスから多くの通知を受け取り、他のものを更新できるようにする必要があります。コントロールを知らない人のために、基本的な追加/削除/並べ替え機能を提供するボタン バーがあります。

CVSListBox コントロールは、項目の追加や名前の変更、順序の変更などのオーバーライド可能な仮想関数を提供します。これらはすべてうまく機能します。

ただし、アイテムを削除する場合、唯一のオーバーライドは OnBeforeRemoveItem です。これは、アイテムが削除される前に呼び出され、削除を許可するために TRUE/FALSE を返す必要があります。削除が行われると、特定の通知はありません。

削除後に通知を受け取る最良の方法は何ですか?

明らかに、削除後に選択変更イベントが発生するという点で、ここで何か恐ろしいことをハックすることが可能であり、次の選択変更が特別であると言うために削除前からフラグを保持することが可能です。しかし、よりクリーンで明白なものが欠けているように感じます。助言がありますか?

4

2 に答える 2

1

アイテムが毎回本当に削除されると仮定すると、次のいずれかが可能です。

  • アイテムが既に削除されているかのように、OnBeforeRemoveItem オーバーライドで処理を行います
  • 独自の OnAfterItemRemoved イベントを発生させる
  • 基になるリスト コントロール (それが何であれ) のハンドルを取得し、そのイベントの 1 つをフックできるかどうかを確認します。
于 2008-12-19T19:00:44.963 に答える
0

次のようなことを試してください:

class my_lbox : public CVSListBox
{
    protected:

        BOOL OnBeforeRemoveItem(int what_item)
        {
            CString txt = GetItemText(what_item);
            DWORD_PTR idata = GetItemData(what_item);

            if(true) //up to you to check if this item can be removed
            {
                OnAfterRemoveItem(txt,idata);
                return TRUE;
            }
            return FALSE;
        }

        void OnAfterRemoveItem(const CString& txt, DWORD_PTR idata)
        {
            CString info;
            info.Format(L"Removing item:'%s'",txt);

            MessageBox(info);
        }
};

それが役に立てば幸い。

于 2012-08-19T17:43:43.447 に答える