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;
}
>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は自前で作成していますが…
瀬戸っぷさん、ありがとうございます。
LPNMITEMACTIVATE構造体とLVHITTESTINFO構造体を組み合わせて
解決できました。
>括弧の対応が取れていないように見えますが…コピペ時のミスでしょうか?
すみません、ミスです。
>そのような動作していませんが…どこか違うのでしょうか。
># チェックボックスのImageListは自前で作成していますが…
拡張スタイルでチェックボックスを表示させてますが、それが原因でしょうか...
とりあえず望みどおりの処理ができたので解決とさせて頂きます。
どうもありがとうございました!
>>そのような動作していませんが…どこか違うのでしょうか。
>># チェックボックスの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でクラシック表示だったりしますけど…その辺りの差異とか???
>LVS_EX_AUTOCHECKSELECT
>がソレっぽいような気もしますが…。
ありがとうございます。
試してみましたが、「定義されていません」エラーがでてしまいました。
MFCが古いんですかね..?
でも新たにListCtrlの機能がいろいろ追加されているみたいなので
勉強してみようと思います。
ありがとうございました。