ListCtrlのサブアイテムを取得 – プログラミング – Home

ListCtrlのサブアイテムを取得
 
通知
すべてクリア

[解決済] ListCtrlのサブアイテムを取得


Nezu
 Nezu
(@Nezu)
ゲスト
結合: 17年前
投稿: 44
Topic starter  

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;
}


引用未解決
トピックタグ
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

>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
 Nezu
(@Nezu)
ゲスト
結合: 17年前
投稿: 44
Topic starter  

瀬戸っぷさん、ありがとうございます。

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

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

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

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


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

>>そのような動作していませんが…どこか違うのでしょうか。
>># チェックボックスの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
 Nezu
(@Nezu)
ゲスト
結合: 17年前
投稿: 44
Topic starter  

>LVS_EX_AUTOCHECKSELECT
>がソレっぽいような気もしますが…。
ありがとうございます。
試してみましたが、「定義されていません」エラーがでてしまいました。
MFCが古いんですかね..?

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました