• ベストアンサー

リストビュー:先頭行のアイテム番号取得

リストビューコントロールで、 最上位に表示されているアイテムの番号を取得したく、 以下のような関数を作ったのですがうまくいきません。 リストビューの0番目のアイテムが先頭行に表示されていると、正しい値が取得できるのですが、 それ以外だと、取得すべき値より1小さい値が返されてしまいます。 どこがまずいか、または別の方法があれば、 ご教授ください。 [関数] int GetTopItemNum(HWND hDlg){ HWND hList = GetDlgItem(hDlg, IDC_INFOTABLE); RECT r; LVHITTESTINFO lvhti; ListView_GetItemRect (hList, 0, &r,LVIR_BOUNDS) // カーソルサイズ取得 lvhti.pt.x = (r.right-r.left)/2; lvhti.pt.y = (r.bottom-r.top)/2; // 中心取得 lvhti.flags = LVHT_ONITEMLABEL; ListView_HitTest (hList, &lvhti);// 表示先頭行でヒットテスト return lvhti.iItem; // 先頭行のアイテム番号取得 }

  • J_H
  • お礼率42% (6/14)

質問者が選んだベストアンサー

  • ベストアンサー
  • MASATO3
  • ベストアンサー率60% (27/45)
回答No.2

ListView_GetTopIndex を使って取得するのは如何でしょうか? リストビューがlistモード又はreportモードの時であれば、 一番上の可視項目の番号が取得できるようです。

J_H
質問者

お礼

ListView_GetTopIndex でうまくいきました ありがとうございます

その他の回答 (1)

  • fruipa
  • ベストアンサー率38% (14/36)
回答No.1

リストビューはしょっちゅう使っています。ただご質問の関数は経験が無いので推測ですが。 > ListView_GetItemRect (hList, 0, &r,LVIR_BOUNDS) // カーソルサイズ取得 これは0番目のアイテムに外接する四角形を取得しますので、毎回0番目のアイテムの位置を基準にヒットテストを行っていることになります。 ListView_GetOriginという関数が現在表示されているビューの原点(0,0でしょうか?)を返すので、ここから右と下に少しずらしたポイントでヒットテストを行えば現在表示されている最初のアイテムが取得できるのではないかと思います。 想像ですいません。

J_H
質問者

お礼

NO2 のかたのほうほうでうまくいきました。 ありがとうございました

関連するQ&A

  • VB6 API LISTVIEW(チェックボックス付き)にチェックを付けたい

    CreateWindowExでLISTVIEW(チェックボックス付きのレポートビュー)を作ったのですが、「山田花子」行にソースでチェックを付ける方法が分かりません。 Form1のソース ↓ Option Explicit Private Sub Form_Load() Dim lngRet As Long Dim lvcol As LV_COLUMN Dim rStyle As Long Dim item As LV_ITEM '-- リストビューの作成 hList = CreateWindowEx(WS_EX_CLIENTEDGE, _ WC_LISTVIEW, "", _ WS_CHILD Or WS_VISIBLE Or WS_BORDER Or _ WS_CLIPSIBLINGS Or WS_CLIPCHILDREN Or _ LVS_REPORT, _ 0&, 0&, Me.ScaleWidth / Screen.TwipsPerPixelX, 200&, _ Me.hwnd, _ 0&, _ App.HINSTANCE, _ ByVal 0&) '拡張スタイルを設定 rStyle = rStyle Or LVS_EX_FULLROWSELECT Or LVS_EX_GRIDLINES Or LVS_EX_CHECKBOXES SendMessageByNum hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0&, rStyle '-- カラムヘッダーの追加 With lvcol .mask = LVCF_FMT Or LVCF_WIDTH Or LVCF_TEXT Or LVCF_SUBITEM .fmt = LVCFMT_LEFT .cx = 100 .pszText = "名前" .iSubItem = 0 lngRet = ListView_InsertColumn(hList, 0&, lvcol) End With '-- リストアイテムの追加 With item .mask = LVIF_TEXT Or LVIF_IMAGE ' 1つめ .pszText = "山田 太郎" .iItem = 0 .iSubItem = 0 .iImage = 0 lngRet = ListView_InsertItem(hList, item) ' 2つめ .pszText = "山田 花子" .iItem = 1 .iSubItem = 0 .iImage = 1 lngRet = ListView_InsertItem(hList, item) End With End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) '-- リストビューを破棄 DestroyWindow hList End Sub 標準モジュールは補足に書きます

  • VB6.0 ListViewの一行目を表示しないようにするには?

    VB6.0 ListViewの一行目を表示しないようにするには? こんにちは。 環境WinXP,VB6.0です。 リストビューを表示する際に、一行目を表示させたくないのですが、 どのように書けばいいのでしょうか? DBの値をリストビューに表示しているのですが、テストで入れたデータが表示されてしまいます。 かといって、このテストデータが重要な役割をしているので、消したくありません。 このテストデータは、常に一行目に表示されるので、リストビュー表示の際に一行目だけ消して表示したいです。 何か良い方法があればご教授下さい。

  • リストビューで選択行の背景を変える

    お世話になります。リストビューの選択行の背景色を変えたいと思い、カスタムドローを用い以下のようにしましたが、選択していない所も赤になってしまいます。 if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) {  // 選択行の背景色を変更  if (lplvcd->nmcd.uItemState & CDIS_SELECTED) {   lplvcd->clrTextBk = RGB(255, 0, 0);   lplvcd->nmcd.uItemState &= ~CDIS_SELECTED;  } else {   lplvcd->clrTextBk = RGB(255, 255, 255);  }  return CDRF_NOTIFYSUBITEMDRAW; } デバッグモードで見ると、else以降の分は解釈されていないようです。 リストビューは g_hList = CreateWindowEx(0 , WC_LISTVIEW , 0 , WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS, 1 , 1 , width , lv_height , g_hMain , (HMENU)1 , g_hInst , NULL); dwStyle = ListView_GetExtendedListViewStyle(g_hList); dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_SUBITEMIMAGES; ListView_SetExtendedListViewStyle(g_hList, dwStyle); ListView_SetBkColor(g_hList, RGB(240,240,240)); のようにしています。宜しくお願いします

  • ActiveBasic ListView 選択を移動させたい

    SendMessage関数を使って、ListViewの選択されているアイテムの場所を移動させたいのですが、 思うように動きません。 Dim lv As LVITEM With lv .iItem=PlayListNum[RandomFlag] .mask=LVIF_STATE .state=LVIS_SELECTED End With SendMessage(hList,LVM_SETITEM,0,VarPtr(lv)) ※hListには、ListViewのハンドルが格納されてあります。 ご存知の方、いらっしゃいましたら、やり方の方をご教授下さい。 Win XP AB 4.23.00

  • コンボボックスの先頭行に空白行を入れるには?

    ACCESS2000です。フォームに貼り付けたコンボボックスのプロパティの値集合ソースにクエリを書いて、クエリ実行結果のデータを取得して、コンボボックスの内容としているのですが、先頭行に空白行を挿入して、2行目以降にクエリ実行結果のデータを入れたいのです。どうすればよいのでしょうか?ちなみに列数は4列です。 それから、その空白行に「(指定なし)」のような表示が可能であれば合わせて教えてください。

  • リストコントロール(MFC or API)の最後尾にアイテムを追加するには?

     以下のような手順でリストコントロールにアイテムを追加しています。すると新しいアイテムはリストコントロールの先頭に追加されてしまいます。  先頭ではなくリストの最後尾にアイテムを挿入するにはどうしたらいいのでしょうか?  このサンプルはMFCですが回答はAPIやほかの手段を使っていても構いません。ヒントだけでも分かる方がいましたらお願いします。 LVITEM sItem; sItem.mask = LVIF_TEXT; sItem.iItem = 0; sItem.iSubItem = 0; sItem.pszText = LPSTR_TEXTCALLBACK; m_lpcList->InsertItem(&sItem);

  • リストビューのハンドルについて

    リストビューコントロールのハンドルについて疑問に思う事がありまして、ご教授よろしくおねがいします。 通常リストビューをCreateWindow()で作成した時に戻り値として受け取るウィンドウハンドルに対してSetWindowFont()を行うとリストビュー全体のフォントが変更されます。 リストビュー関数にはListView_GetHeader( リストビューハンドル );という関数が用意されていてリストビューのカラム部分のハンドルを取得できます。 このハンドルに対してSetWindowFont()を行うとカラム部分だけのフォントが変更されます。 という事はアイテム部分だけのハンドルを取得し、SetWindowFont()でフォントを変更する事はできるのでしょうか? ご教授よろしくお願いいたします。

  • LV_ITEM構造体のメンバlParamについて

    リストビューのカラムをクリックすると、落ちてしまいます。 やりたい事は、カラムをクリックするとソートするようにしたいです。 下記の(8)でLV_ITEM構造体のポインタを取得した時に メンバlParamの値は空のまま(0)の為? 落ちてしまうのです。 どのようにしたら、値を取得できるのでしょうか?? 一部ですが、問題のあるところだけ下記に明記します。 #説明上、番号を振りました。 #下記の処理は、CListCtrlクラスを継承したCxxxxクラスの関数です。 ************(ここから)****************** (1)LV_ITEM lvItem; (2)int iTemNo; (3)for(int i = 0; i < this->GetItemCount(); i++) (4){ (5) lvItem.iItem = i; (6) lvItem.iSubItem = 0; (7) lvItem.mask = LVIF_PARAM; (8) this->GetItem(&lvItem); (9) LPITEMPARAM lpItemParam = (LPITEMPARAM)lvItem.lParam; (10) iTemNo = i; (11) this->SetItem(&lvItem); (12)} ************(ここまで)****************** 環境は、Win98、MFCで作成しています。 (8)ではGetItemの戻り値で確認したら、 正常に構造体を取得できているかと思うのですが、 lParamの値は、空なんです・・・・。 また、他に必要な情報は、ございますでしょうか? よろしくお願いします。

  • リストビューで罫線を表示

    リストビューで罫線を表示させるにはどうしたら良いのでしょうか?Excelのような表を表示したいのですが。 あと、同じリストで特定の項目だけを色を変えたいのですが、ListView_GetItemRect、ListView_GetSubItemRectで項目ごとの範囲を取得、その範囲を塗りつぶすようにしているのですが、上手く変わってくれません。 教えてください。よろしくお願いします。

  • exel2003 行の検索

    exel2003での質問です。 ある行の先頭の数値を取得する関数を作りたいのですが、どうしたらいいでしょうか? あるHPで LOOKUP(10^16,A1:A10) とすれば、検索範囲の行の最後の値を取得するというのを見つけました。 また、この検査値10^16というのは最大値という意味だとあり、 ならばここを最小値に変えればできるのかと思っていますが それをどこで探せばいいのかわかりません。 よろしければご教授願います。 また、それ以外の方法でも良いのでよろしくお願いします。