0

VisualStudio2008でMFCアプリケーションを開発しています。チェックボックスのあるCListCtrlオブジェクトがあります。スペースバーで強調表示されているすべての項目を切り替える簡単な方法があるかどうか疑問に思っています。現在、スペースバーダウンイベントで私はこれを行っています:

void toggleSelect()
{
    POSITION pos = m_cListCtrl.GetFirstSelectedItemPosition();
    while(pos)
    {
        int index = m_cListCtrl.GetNextSelectedItem(pos);
        BOOL check = m_cListCtrl.GetCheck(index);
        m_cListCtrl.SetCheck(index, !check);
    }
}

これは、単一のアイテムが強調表示されたときのスペースバーのデフォルトの動作であると私が信じているものではなかった場合に機能します(単一のアイテムが選択されるとチェックボックスが自動的に切り替えられます)。このコードの問題は、切り替えられていないチェックボックスが常に1つあることです。これは、選択された単一のアイテムを切り替えるスペースバーのデフォルトの動作によるものです。デフォルトを無効にする方法はありますか?

4

1 に答える 1

1

あなたが正しいです。複数選択チェック状態を処理すると、コードで設定された後、リストコントロールハンドルチェック状態の切り替えが可能になります。コードを変更する必要があります。LVN_KEYDOWNメッセージを処理していると思います。(toggleSelectはグローバルですか?なぜですか?

void CYourDlgClass::OnLvnKeydownList1(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMLVKEYDOWN pLVKeyDown = reinterpret_cast<LPNMLVKEYDOWN>(pNMHDR);

    if(VK_SPACE == pLVKeyDown->wVKey && m_cListCtrl.GetSelectedCount() > 1)
    {
            toggleSelect();
            *pResult = 1;
            return;
    }

    // TODO: Add your control notification handler code here
    *pResult = 0;
}

void CYourDlgClass::toggleSelect() 
{ 
    POSITION pos = m_cListCtrl.GetFirstSelectedItemPosition(); 
    while(pos) 
    { 
            int index = m_cListCtrl.GetNextSelectedItem(pos); 
            BOOL check = m_cListCtrl.GetCheck(index); 
            m_cListCtrl.SetCheck(index, !check); 
    } 
} 

* pResultを0に設定すると、メッセージが処理され、それ以上の処理は不要であることを示します。CListCtrlからクラスを派生させ、同様の方法でWM_KEYDOWNを処理することをお勧めします。

void CMultiCheckListCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    if(VK_SPACE == nChar && GetSelectedCount() > 1)
    {
            POSITION pos = GetFirstSelectedItemPosition(); 
            while(pos) 
            { 
                    int index = GetNextSelectedItem(pos); 
                    BOOL check = GetCheck(index); 
                    SetCheck(index, !check); 
            } 
            return;
    }

    CListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
}
于 2012-05-26T10:12:24.127 に答える