ListCtrlのサブアイテムを取得

[戻る]
Nezu 2008/04/08(火) 19:22:20
Nezuです。お世話になってます。
質問させてください。

CListCtrlについて、スタイルを
m_ListCtrl.SetExtendedStyle( m_ListCtrl.GetExtendedStyle()| LVS_EX_CHECKBOXES| 
LVS_EX_FULLROWSELECT);
としています。

今のままでは、任意の行のどこかをクリックすると先頭のCheckBoxの表示・非表示が行
えるのですが、CheckBoxをクリック時にのみチェックの表示・非表示を行いたいので
す。

以下のコードを試して見ましたが、ListView_SubItemHitTestの戻り値が常に-1になって
しまいます。引数が間違っているのでしょうか?
ご存知の方、ご意見をよろしくお願いします。

環境: Vista VS2005 MFC ダイアログベース

void CXXXDlg::OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult)
{
    LVHITTESTINFO lvHitInfo; 
    int nItem,nSubItem;

    HWND hList = GetDlgItem(IDC_LIST1)->GetSafeHwnd();

    CPoint pos( ::GetMessagePos() ); 
    ScreenToClient(&pos);

    lvHitInfo.pt = pos;

    lvHitInfo.flags = LVHT_ONITEMLABEL;

    int iRet = ListView_SubItemHitTest(hList) &lvHitInfo);
    if(iRet > -1)
    {
        nItem = lvHitInfo.iItem;
        nSubItem = lvHitInfo.iSubItem;
        if(nSubItem != 0)
        {
            //チェックを外す処理
        }
    }
    else
    {
        return;
    }

    *pResult = 0;
}

瀬戸っぷ [E-Mail] 2008/04/09(水) 00:24:39
>lvHitInfo.flags = LVHT_ONITEMLABEL;

HitTestの結果が返される…のではないでしょうか?
MSDNには
flags
The variable that receives information about the results of a hit test. 
と書かれていますが。

とりあえず、私の方では
    LVHITTESTINFO lvHt;

    ZeroMemory(&lvHt, sizeof(LVHITTESTINFO));
    GetCursorPos(&pt);
    lvHt.pt = pt;
    ScreenToClient(hListView, &lvHt.pt);
    ListView_HitTest(hListView, &lvHt);
で、結果が得られています。(SDKで、LVHITTESTINFO.iItemが欲しいだけでしたけど。)
ListView_SubItemHitTest()に置き換えて、LVHITTESTINFO.iSubItemに値が入るのも確認
しました。

> int iRet = ListView_SubItemHitTest(hList) &lvHitInfo);

括弧の対応が取れていないように見えますが…コピペ時のミスでしょうか?

> 今のままでは、任意の行のどこかをクリックすると先頭のCheckBoxの表示・非表示が行
> えるのですが、CheckBoxをクリック時にのみチェックの表示・非表示を行いたいので
す。

そのような動作していませんが…どこか違うのでしょうか。
# チェックボックスのImageListは自前で作成していますが…

Nezu 2008/04/09(水) 09:57:42
[[解決]]
瀬戸っぷさん、ありがとうございます。

LPNMITEMACTIVATE構造体とLVHITTESTINFO構造体を組み合わせて
解決できました。

>括弧の対応が取れていないように見えますが…コピペ時のミスでしょうか?
すみません、ミスです。


>そのような動作していませんが…どこか違うのでしょうか。
># チェックボックスのImageListは自前で作成していますが…
拡張スタイルでチェックボックスを表示させてますが、それが原因でしょうか...

とりあえず望みどおりの処理ができたので解決とさせて頂きます。
どうもありがとうございました!

瀬戸っぷ [E-Mail] 2008/04/11(金) 00:25:49
>>そのような動作していませんが…どこか違うのでしょうか。
>># チェックボックスのImageListは自前で作成していますが…
>拡張スタイルでチェックボックスを表示させてますが、それが原因でしょうか...

私の方でも、同様の方法です。
ImageList(チェックボックスの画像)は自前で用意したものと差し替えていますが。

    dwExStyle = ListView_GetExtendedListViewStyle(hListView);
    dwExStyle |= (LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES
| LVS_EX_INFOTIP);
    ListView_SetExtendedListViewStyle(hListView, dwExStyle);

> 環境: Vista VS2005 MFC ダイアログベース

でしたね。
http://msdn2.microsoft.com/en-us/library/bb774732.aspx
にVistaオンリーなスタイルがあるようです。
LVS_EX_AUTOCHECKSELECT
がソレっぽいような気もしますが…。

# XPでクラシック表示だったりしますけど…その辺りの差異とか???

Nezu 2008/04/11(金) 10:18:44
>LVS_EX_AUTOCHECKSELECT
>がソレっぽいような気もしますが…。
ありがとうございます。
試してみましたが、「定義されていません」エラーがでてしまいました。
MFCが古いんですかね..?

でも新たにListCtrlの機能がいろいろ追加されているみたいなので
勉強してみようと思います。
ありがとうございました。

古いスレッドには追加発言できません。