2016-12-16 31 views
1

リストコントロールは、リソースに対して単一選択として定義されています。チェックボックスのある質問を含むCListCtrl

質問1

は、私は私のCListCtrlの最初の列のヘッダーにあるチェックボックスを持っていると思います。 OnInitDialogに私は私がチェックし、アクションと選択アクションが異なる目的のために使用されることを望むので、私は絶対に望んでいない拡張|LVS_EX_AUTOCHECKSELECTに追加する場合それはヘッダのみのチェックボックスを提示

m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT); 

    CString s; 
    s.LoadString(IDS_COLUMN1); 

    #ifndef HDS_CHECKBOXES 
    // Copied from Microsoft SDKs\Windows\v7.0A\Include\CommCtrl.h 
    #define HDS_CHECKBOXES 0x0400 
    #endif 

    CHeaderCtrl& header = *m_list.GetHeaderCtrl(); 
    header.ModifyStyle(0, HDS_CHECKBOXES); 


    #ifndef HDF_CHECKBOX 
    // Copied from Microsoft SDKs\Windows\v7.0A\Include\CommCtrl.h  
    #define HDF_CHECKBOX 0x0040 
    #endif 

    LVCOLUMN lc = { 0 }; 
    lc.mask = LVCF_FMT |LVCF_WIDTH |LVCF_TEXT | LVCF_SUBITEM; 
    lc.fmt |= HDF_CHECKBOX; 
    lc.cx = 96; 
    lc.pszText = (TCHAR*) (LPCTSTR)s; 

    m_list.InsertColumn(0, &lc); 

を持っています。ときに、ユーザーの確認を変更または項目のチェックを外して

質問は2

私はブールとマークのものを設定する必要があります。しかし、私は、例えば、フォームのロード時にリストを塗りつぶすなど、アイテムを挿入するときにこのアクションを発生させたくないのですが、InsertItemOnItemChangedに "未チェックアクション"をトリガーするので、意図せずにトリガーされます。

それはm_is_insertingメンバーフラグを持つすべてのインサートを調整するように私を義務づけ:実際のユーザーのチェックを区別するためのより良い方法はあり

m_is_inserting = true; 
    m_list.InsertItem(i, m_array[i]->GetName()); 
    m_is_inserting = false; 

をしてLVN_ITEMCHANGEDハンドラ

void CMyDialog::OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult) 
{ 
    NMLISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 

    if (pNMListView->uChanged & LVIF_STATE) 
    { 
     if (pNMListView->uNewState & LVIS_SELECTED) 
      OnSelect(); 
     else 
     { 
      if (pNMListView->iItem != -1) 
      { 
       if ((pNMListView->uNewState & LVIS_STATEIMAGEMASK) == 0x1000) 
       { 
        if (!m_is_inserting) 
        { 
         m_array[pNMListView->iItem]->m_active = false; 
         SetModified(); 
        } 
       } 
       else if ((pNMListView->uNewState & LVIS_STATEIMAGEMASK) == 0x2000) 
       { 
        if (!m_is_inserting) 
        { 
         m_array[pNMListView->iItem]->m_active = true; 
         SetModified(); 
        } 
       } 
      } 
     } 
    } 

    *pResult = 0; 
} 

に応じて反応/ InsertItemの副作用からのアクションの選択を解除しますか?

質問3

チェック/チェックを外して状態を取得するためのより良い象徴的慣習がありますか?マジックナンバー0x10000x2000は意味がありません!

ありがとうございます。

+0

関連(**質問2 **):http://stackoverflow.com/questions/28582698/differentiate-between-user-click-and-setchecked-in-clistctrl – sergiol

答えて

1

最初に列ヘッダーを挿入します。次にHDF_CHECKBOXを変更します。たとえば、次のように

m_list.SetExtendedStyle(LVS_EX_CHECKBOXES| LVS_EX_FULLROWSELECT); 

CHeaderCtrl &header = *m_list.GetHeaderCtrl(); 
header.ModifyStyle(0, HDS_CHECKBOXES); 

m_list.InsertColumn(0, L"Column0", 0, 120, 0); 
m_list.InsertColumn(1, L"Column1", 0, 80, 1); 
m_list.InsertColumn(2, L"Column2", 0, 80, 2); 

HDITEM hdi = { 0 }; 
hdi.mask = HDI_FORMAT; 
header.GetItem(0, &hdi); 
hdi.fmt |= HDF_CHECKBOX; 
header.SetItem(0, &hdi); 

m_list.InsertItem(m_list.GetItemCount(), L"C0", 0); 
m_list.InsertItem(m_list.GetItemCount(), L"C1", 0); 

m_list.SetCheck(0, 1); 
m_list.SetCheck(1, 1); 

通知を処理するときは、項目がチェックされているかどうかを確認するためにGetCheckメソッドを使用することができます。例:

if(pNMListView->uChanged & LVIF_STATE) 
{ 
    if(pNMListView->uNewState & LVIS_SELECTED) 
    { 
     ... 
    } 
    else if(pNMListView->uNewState & LVIS_STATEIMAGEMASK && pNMListView->iItem >= 0) 
    { 
     if(m_list.GetCheck(pNMListView->iItem)) 
      TRACE("%d checked\n", pNMListView->iItem); 
    } 
} 
+0

ありがとう。私の質問の「ヘッダーにチェックボックスを表示する方法」パート(**質問1 **)が表示されました。まだ通知を処理しようとしませんでした。補足: 'CMFCListCtrl' /' CMFCHeaderCtrlist'のヘッダーにチェックボックスを入れても、 'afxheaderctrl 'に' HDS_CHECKBOXES'、 'HDF_CHECKBOX'、' HDF_CHECKED'が見つからない可能性が高いです.cpp | h'と 'afxlistctrl.cpp | h'ファイル! – sergiol

関連する問題