1

リストコントロールのチェックボックスの状態を変更するユーザーの機能を無効にしようとしています。私は現在、実際に状態を変更しています。私はすでにLVN_ITEMCHANGEDメッセージを処理していますが、状態を変更しようとすると、プログラムの残りの部分のレイアウトが原因でオプションがありません。また、ユーザーがリストコントロールをクリックしてチェックボックスをリセットしたときに、HitTestを実行しようとしましたが、探している正確な結果が得られません。

送信された特定のメッセージや、ユーザーがチェックボックス自体をクリックしたときにオーバーライドできる機能はありますか?ハンドラーをオーバーライドするか、メッセージをキャッチして、どこにも行かないようにします。

4

1 に答える 1

0

解決:

LVS_EX_CHECKBOXES結局、フラグを削除して、独自の実装を作成しました。そうすれば、アイコンを変更する方法は1つしかありません。前の質問からのリンクを読んで、「ビジー」フラグを設定するアイデアが得られました。そうしないと、スタックオーバーフローエラーが発生します。

// In my dialog class
m_CListCtrl.SetImageList(&m_ImgList, LVSIL_SMALL);    // Custom checkboxes (only two images)

// ...
void CMyDialog::OnLvnItemchangedList(NMHDR *pNMHDR, LRESULT *pResult)
{
   if(busy) { return; }
   // ....
} 

// When calling the SetCheck function:
busy = TRUE;   // Avoid stack overflow errors
m_CListCtrl.SetCheck(index, fCheck);
busy = FALSE;

// I derived a class from CListCtrl and did an override on the get/set check:
class CCustomListCtrl : public CListCtrl
{
    BOOL CCustomListCtrl::SetCheck(int nItem, BOOL fCheck)
    {
        TCHAR szBuf[1024];
        DWORD ccBuf(1024);
        LVITEM lvi;
        lvi.iItem = nItem;
        lvi.iSubItem = 0;
        lvi.mask = LVIF_TEXT | LVIF_IMAGE;
        lvi.pszText = szBuf;
        lvi.cchTextMax = ccBuf;
        GetItem(&lvi);
        lvi.iImage = (int)fCheck;
        SetItem(&lvi);
        return TRUE;
    }
    // Just need to determine which image is set in the list control for the item
    BOOL CCustomListCtrl::GetCheck(int nItem)
    {
        LVITEM lvi;
        lvi.iItem = nItem;
        lvi.iSubItem = 0;
        lvi.mask = LVIF_IMAGE;
        GetItem(&lvi);
        return (BOOL)(lvi.iImage);
    }
}

これは私が望んでいたほどエレガントではありませんが、完璧に機能します。

于 2012-06-29T14:45:07.197 に答える