2012-05-25 48 views
1

我插入一個項目在我的共同控制列表視圖這樣的:禁用自動滾動(WIN32 API,C)

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

和工作正常,但它是一種痛苦,因爲垂直滾動回到列表的頂部,所以如果我正在觀看一個項目並調用這個插入函數,我就失去了我的視圖,並且必須手動回滾,導致我的程序無法使用。

如何防止這種自動滾動?

我在C編程,直接與win32 API(不是MFC)。

Pd積:ListView的風格: LVS_SINGLESEL | WS_BORDER | WS_TABSTOP | WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|WS_HSCROLL|LVS_REPORT

+0

從我使用本地列表框的經驗等,我發現他們的默認行爲很粗糙。你可以嘗試的是「列出」列表框,即爲某些消息運行自定義的windproc。在這種情況下,你應該尋找WM_VSCROLL或類似的東西。每當你添加一個項目到列表中,在你的程序中設置一個標誌「no_scroll」。如果在設置「no_scroll」的情況下,子類Windproc獲得滾動消息,請將其丟棄。 – Lundin

回答

3

的一種方法是獲取當前的頂部位置,插入新項目,然後(編程)回所保存的頂部位置滾動。

+1

或'ListView_EnsureVisible'這會爲你做出咕嚕的工作 –

+0

由於某種原因,它不起作用。我首先調用topItem = ListView_GetTopIndex(GetDlgItem(hwnd,IDC_LISTA))並獲取第一個可見項,然後插入該項並最後調用ListView_EnsureVisible(GetDlgItem(hwnd,IDC_LISTA),topItem,TRUE),但這不起作用。然而EnsureVisible返回TRUE。 –

+0

這與我使用的方法類似,但我必須真正設置所選項目。它使屁股滾動起來很痛苦,但這是我能找到的最好方式。 – Deanna

0
  1. 呼叫ListView_GetItem得到你想要觀看
  2. 呼叫每次插入新行時間ListView_EnsureVisible(HWND,index_you_want_to_watch,TRUE)項目的索引。
0

如果你可以切換ListView的虛擬模式(適用LVS_OWNERDATA樣式,然後用LVN_GETDISPINFO通知要求,當您的數據提供到ListView),那麼你可以使用ListView_SetItemCountEx()要添加/插入/刪除項目。它有一個LVSICF_NOSCROLL標誌來防止滾動。