| リストビューアイテムの処理 |
int a = m_List1.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);これにより、aには現在選択されているアイテムのインデックスが代入される。 何も選択されていない場合は-1となる。
m_List1.SetItemState(0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);上記の場合は、第1引数に0を指定しているのでインデックス0のアイテムが選択される。
リストビュー上でのクリック位置にあるアイテム、サブアイテムを取得する
void CMyListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
int iItem;
iItem = HitTest(point);
……
CListCtrl::OnLButtonDown(nFlags, point);
}
void CCosmosListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
int iItem;
int iSubItem;
LV_HITTESTINFO hittest;
hittest.pt = point;
SubItemHitTest(&hittest);
iItem = hittest.iItem;
iSubItem = hittest.iSubItem;
……
CListCtrl::OnLButtonDown(nFlags, point);
}
ここではLV_HITTESTINFO構造体を使用しているが、この構造体の定義は以下のとおりである。
typedef struct tagLVHITTESTINFO
{
POINT pt;
UINT flags;
int iItem;
#if (_WIN32_IE >= 0x0300)
int iSubItem; // this is was NOT in win95. valid only for LVM_SUBITEMHITTEST
#endif
} LVHITTESTINFO, FAR* LPLVHITTESTINFO;
この構造体のptメンバにクリックされた位置を代入し、この構造体へのポインタを引数としてSubItemHitTest関数を呼び出す。
関数が処理されると、その位置にサブアイテムがあった場合、アイテムのインデックスを構造体のiItemメンバに、
サブアイテムのインデックスをiSubItemメンバに格納されている。サブアイテムがない場合は両方とも-1である。
void CMyListCtrl::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult) {
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
// -------- フォーカスを残す場合はこっちで! --------
int iFocus = GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
if( iFocus != -1 ) {
SetItemState(iFocus, ~LVIS_SELECTED, LVIS_SELECTED);
}
// -------- ここまで --------
// -------- フォーカスも表示しない場合はこちらで! --------
int iFocus = GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
if( iFocus == -1 )
iFocus = GetNextItem(-1, LVNI_ALL | LVNI_FOCUSED);
if( iFocus != -1 ) {
SetItemState(iFocus,
~(LVIS_SELECTED | LVIS_FOCUSED), LVIS_SELECTED | LVIS_FOCUSED);
}
// -------- ここまで --------
*pResult = 0;
}