VC++6.0 Win98
リストビュー上で、クリック位置にあるアイテムは取得できたのですが、
サブアイテムの取得方法が分かりません。
調べていると、ListView_SubItemHitTestを使えば良いと書かれていたのですが、
初心者の為、理解できませんでした。
アイテムの取得は以下のようにしました。
本当に初心者で申し訳無いのですが、ご教授お願いします。
void CKankiView::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
CString a1[10]={01,02,03,04,05,06,07,08,09,10};
CEdit*a=(CEdit*)GetDlgItem(IDC_EDIT1);
CListCtrl*p;
p=(CListCtrl*)GetDlgItem(IDC_LIST1);
int n=p->GetNextItem(-1,LVNI_SELECTED);
if(n==-1)return;
a->SetWindowText(a1[n]);
*pResult = 0;
}
方法が違うけどこれじゃダメかな?
「m_MListVwCtl」 リストビューコントロールクラスメンバー
「GetFirstSelectedItemPosition」と「GetNextSelectedItem」
「GetItemText」
はMSDNに日本語解説あります
void CKankiView::OnDblclkMlist(NMHDR* pNMHDR, LRESULT* pResult)
{
ポイント1 ↓ ここ
POSITION Sel_pos;
int Sel_nItem;
CString Sel_Txt;
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
UpdateData(TRUE);
ポイント2 ↓ ここ
Sel_pos = m_MListVwCtl.GetFirstSelectedItemPosition();
if (Sel_pos == NULL){
MessageBox( 特に選択されていません, list クリック, MB_OK );
}
else{
ポイント3 ↓ ここ
Sel_nItem = m_MListVwCtl.GetNextSelectedItem(Sel_pos);
ポイント4 ↓ ここ
Sel_Txt = m_MListVwCtl.GetItemText( Sel_nItem, 0);
m_MENU_NO = atoi(Sel_Txt);
Sel_Txt = m_MListVwCtl.GetItemText( Sel_nItem, 1);
> 調べていると、ListView_SubItemHitTestを使えば良いと書かれていたのですが、
> 初心者の為、理解できませんでした。
1.現在のマウスポインタの位置を取得します。
WM_LBUTTONDOWN/UP や NM_CLICK を使っているのなら、メッセージパラメータ中に
座標が入っています。
WM_CLICK の場合、GetCursorPos で取得しますが、これはスクリーン座標なので、
リストビューのクライアント座標に直すために、ScreenToClient を使います。
2.LVHITTESTINFO 型の変数を用意します。
pt メンバに、1 で取得したマウス座標、flags メンバにフラグを入れます。
flags には、通常 LVHT_ONITEMLABEL を入れておけばよいと思われますが
必要に応じて適宜変更してください。
3.ListView_SubItemHitTest を実行します。
パラメータに 2 で用意した変数のポインタを渡すと、iItem メンバと
iSubItem メンバに、マウスポインタの位置にあるアイテムのインデックスが
格納されます。
わー素敵。できました。
woodさん、シャノンさんありがとう。