1

次のように、共通コントロールのリストビューに項目を挿入しています。

void InsertRow (HWND hWnd, char *col1, char *col2)
{
    LV_ITEM     lvItem;

    lvItem.mask = 0;
    lvItem.iItem = 0;
    lvItem.iSubItem = 0;
    lvItem.iItem = ListView_InsertItem (hWnd, &lvItem);

    lvItem.mask = LVIF_TEXT;
    lvItem.pszText = col1;
    lvItem.cchTextMax = strlen (lvItem.pszText);
    ListView_SetItem (hWnd, &lvItem);

    lvItem.iSubItem = 1;
    lvItem.pszText = col2;
    lvItem.cchTextMax = strlen (lvItem.pszText);
    ListView_SetItem (hWnd, &lvItem);
}

正常に動作しますが、垂直スクロールがリストの一番上に戻るので面倒です。そのため、アイテムを見ているときにこの挿入関数を呼び出すと、ビューが失われ、手動でスクロールしてプログラムを作成する必要があります一緒に働くことは不可能です。

この自動スクロールを防ぐにはどうすればよいですか?

Win32 APIを直接(MFCではなく)使用して、Cでプログラミングしています。

PD: ListView スタイル: LVS_SINGLESEL | WS_BORDER | WS_TABSTOP | WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|WS_HSCROLL|LVS_REPORT

4

3 に答える 3

3

1つの方法は、現在の一番上の位置を取得し、新しいアイテムを挿入してから、(プログラムで)保存された一番上の位置にスクロールして戻ることです。

于 2012-05-25T11:37:03.940 に答える
0
  1. ListView_GetItem を呼び出して、見たいアイテムのインデックスを取得します
  2. 新しい行を挿入するたびに ListView_EnsureVisible(hWnd, index_you_want_to_watch, TRUE) を呼び出します。
于 2012-05-25T15:08:33.250 に答える
0

ListView を仮想モードに切り替えることができる場合 (LVS_OWNERDATAスタイルを適用しLVN_GETDISPINFO、要求されたときに通知を使用して ListView にデータを提供する)、ListView_SetItemCountEx()項目の追加/挿入/削除に使用できます。スクロールを防ぐためのLVSICF_NOSCROLLフラグがあります。

于 2012-05-28T20:05:01.577 に答える